Git 命令使用心得

630 查看

最近学习了一下git命令来操作一下库,发现git命令虽然不多(当然也不算少),但是它们组合起来功能很强大,更重要的是很多命令在不同的状态下发挥的效果不一样,本博文总结了一下git命令,并详细说明了一些命令的使用场景。

命令小结

命令 功能
git init 把当前文件夹初始化为默认的git库
git add 文件名 向git库中添加一个文件
git rm 文件名 从git库中删除一个文件
git status 查看当前库中进行的任务
git diff 文件名 add前查看工作区和暂存区的差别
git commit -m "修改内容" 把修改内容提交上去,用于区别版本
git checkout -- 文件名 在add之前把文件恢复到上次交付,在commit之前恢复到暂存区的状态
git log [--pretty=oneline] 显示这个库里都干过啥
git relog 查看命令历史,以便确定要回到未来的哪个版本
git reset HEAD 文件名 可以把暂存区的修改撤销掉
git reset --hard HEAD^ 回退到上一个版本
git reset --hard 版本号 回退到某个版本

注意如果一个库里的很多文件是合用一个版本号的,也就是说变更版本号后,对应的所有的文件都会回退;

基本命令

git 建立库,我们是在工作区中修改文件的,工作区可以有很多文件;
git add 可以把工作区(working tree)下修改的文件或添加的文件添加到暂时存储的区域(index file);
git commit 做的事情是把index file中修改提交到分支里,默认的分区是master;

git diff

diff 就是difference的意思,查看不同,根据工作区(working tree)、缓存区(index file)和版本区(master)的不同,药效不一样哦 -_-!

  1. git diff 文件名:是查看working tree与index file 的差别的。也就是说修改之后add之前可以用这个看改了什么;
  2. git diff -- cached:是查看index file与master的差别的。add之后,如果你忘记所有文件做的修改是什么,用这个;
  3. git diff HEAD 文件名:是查看working tree和master的差别的。add之后,可以用这个看具体每个文件改了什么;

举个栗子

在工作区新建一个文件hello.cpp

cpp#include<iostream>
using namespace std;
int main()
{
        cout<<"快使用"<<endl;
        return 0;
}

然后添加到版本库里面

git$ git add hello.cpp 
$ git commit -m "新建hello.cpp"
[master 86a0afb] 新建hello.cpp
 1 file changed, 7 insertions(+)
 create mode 100644 hello.cpp
$ git status
位于分支 master
无文件要提交,干净的工作区

然后修改hello.cpp文件

cpp#include<iostream>
using namespace std;
int main()
{
        cout<<"快使用双截棍"<<endl;
        return 0;
}

添加到暂存区里

git$ git add hello.cpp 
$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <file>..." 撤出暂存区)

    修改:     hello.cpp

再修改hello.cpp文件

cpp#include<iostream>
using namespace std;
int main()
{
        cout<<"快使用双截棍,嗯哪咋地"<<endl;
        return 0;
}

这时候工作区、暂存区、版本区的文件都不一样啦

git$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <file>..." 撤出暂存区)

    修改:     hello.cpp

尚未暂存以备提交的变更:
  (使用 "git add <file>..." 更新要提交的内容)
  (使用 "git checkout -- <file>..." 丢弃工作区的改动)

    修改:     hello.cpp

使用git diff命令来一一查看哈

git$ git diff hello.cpp
diff --git a/hello.cpp b/hello.cpp
index 4cbc284..32531fa 100644
--- a/hello.cpp
+++ b/hello.cpp
@@ -2,6 +2,6 @@
 using namespace std;
 int main()
 {
-       cout<<"快使用双截棍"<<endl;
+       cout<<"快使用双截棍,嗯哪咋地"<<endl;
        return 0;
 }

上面第10行是暂存区中的内容,而第11行是工作区中的内容,说明git diff 文件名 比较的是暂存区与工作区的内容。其实这里如果用git diff -- 文件名也能达到相同的效果,关于 -- 的用法会在后面相信讨论。

git$ git diff --cached
diff --git a/hello.cpp b/hello.cpp
index 4cadd9e..4cbc284 100644
--- a/hello.cpp
+++ b/hello.cpp
@@ -2,6 +2,6 @@
 using namespace std;
 int main()
 {
-       cout<<"快使用"<<endl;
+       cout<<"快使用双截棍"<<endl;
        return 0;
 }

第10行是版本库的内容,第11行是暂存区中的内容,说明git diff --cached比较的是版本库与暂存区的内容

git$ git diff HEAD hello.cpp
diff --git a/hello.cpp b/hello.cpp
index 4cadd9e..32531fa 100644
--- a/hello.cpp
+++ b/hello.cpp
@@ -2,6 +2,6 @@
 using namespace std;
 int main()
 {
-       cout<<"快使用"<<endl;
+       cout<<"快使用双截棍,嗯哪咋地"<<endl;
        return 0;
 }

比较的是版本库与工作区的内容;

git checkout -- 文件名

case 1. git checkout -- 文件名,在修改文件后add到暂存区之前用版本区的文件替换工作区的

case 2. 在add到缓存区后,commit到版本区之前,再一次修改文件,就用暂存区中的文件覆盖工作区

git$ git checkout -- hello.cpp
$ cat hello.cpp
#include<iostream>
using namespace std;
int main()
{
    cout<<"快使用双截棍"<<endl;
    return 0;
}
dragon@dragon-virtual-machine:~/code/learngit$ 

case 3.在add到缓存区后,commit到版本区之前,再一次修改文件,如果想用版本区的文件覆盖可以有两种做法:

方法一:

git$ git checkout HEAD hello.cpp
$ cat hello.cpp
#include<iostream>
using namespace std;
int main()
{
    cout<<"快使用"<<endl;
    return 0;
}
$ git status
位于分支 master
无文件要提交,干净的工作区

HEAD是当前版本库的意思,这种做法顺便将暂存区清空了

方法二:

git$ git reset HEAD 
重置后撤出暂存区的变更:
M   hello.cpp
$ git checkout -- hello.cpp
$ cat hello.cpp 
#include<iostream>
using namespace std;
int main()
{
    cout<<"快使用"<<endl;
    return 0;
}


先清空暂存区,然后再使用git checkout -- 文件名,用版本去来替换工作区,相当于case 1.;

git的删除与恢复操作

在工作区,我们可以直接rm命令手动删除一个文件,但是这样在版本库里面并没有变化。所以我们如果想在版本库里面删除这个文件。可以不用手动删除,直接用git rm 文件名
然后git commit -m " 删除。。。"来提交到版本库;但是如果出现勿删还是可以恢复的

case 1.手动删除没有提交到暂存区,使用git checkout -- 文件名,用版本区文件覆盖工作区

case 2.使用git rm删除.还没有提交

git
$ ls hehe hello.cpp readme.txt $ git rm hello.cpp rm 'hello.cpp' $ ls hehe readme.txt t$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <file>..." 撤出暂存区) 删除: hello.cpp $ git checkout HEAD hello.cpp $ ls hehe hello.cpp readme.txt $ git status 位于分支 master 无文件要提交,干净的工作区

当然也可以使用git checkout 的第二种方法

case 3. 提交删除,可以使用版本回退的方法来恢复文件,键上面git命令表格里的git reset