最近学习了一下git命令来操做一下库,发现git命令虽然很少(固然也不算少),可是它们组合起来功能很强大,更重要的是不少命令在不一样的状态下发挥的效果不同,本博文总结了一下git命令,并详细说明了一些命令的使用场景。ios
命令 | 功能 |
---|---|
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 创建库,咱们是在工做区中修改文件的,工做区能够有不少文件;
git add 能够把工做区(working tree)下修改的文件或添加的文件添加到暂时存储的区域(index file);
git commit 作的事情是把index file中修改提交到分支里,默认的分区是master;缓存
diff 就是difference的意思,查看不一样,根据工做区(working tree)、缓存区(index file)和版本区(master)的不一样,药效不同哦 -_-!学习
在工做区新建一个文件hello.cppspa
cpp#include<iostream> using namespace std; int main() { cout<<"快使用"<<endl; return 0; }
而后添加到版本库里面code
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文件it
cpp#include<iostream> using namespace std; int main() { cout<<"快使用双截棍"<<endl; return 0; }
添加到暂存区里io
git$ git add hello.cpp $ git status 位于分支 master 要提交的变动: (使用 "git reset HEAD <file>..." 撤出暂存区) 修改: hello.cpp
再修改hello.cpp文件table
cpp#include<iostream> using namespace std; int main() { cout<<"快使用双截棍,嗯哪咋地"<<endl; return 0; }
这时候工做区、暂存区、版本区的文件都不同啦ast
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; }
比较的是版本库与工做区的内容;
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.;
在工做区,咱们能够直接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