Git 命令使用心得

最近學習了一下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;緩存

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.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;
 }

比較的是版本庫與工做區的內容;

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

相關文章
相關標籤/搜索