Git 命令使用心得

在河之洲發表於2015-06-11

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

相關文章