前情提要:Git應用詳解第一講:Git分區,配置與日誌html
在第一講中咱們對Git
進行了簡單的入門介紹,相信聰明的你已經瞭解Git
的基本使用了。java
這一講咱們來進一步深刻學習Git
應用,着重介紹Git
的一些常見操做,包括:刪除文件、比較文件、撤銷修改、修改註釋與查看幫助文檔。linux
git rm <file>
該命令用於刪除版本庫中的文件;刪除工做區和暫存區中的文件都會報錯:git
所謂版本庫中的文件指的是:已經經過
commit
指令提交的文件,而不是工做區中的文件(紅色),或暫存區中的文件(綠色)。vim
git rm
完成了兩步操做:編輯器
stage
)。以下圖所示,至關於執行了git add test.txt
,隨後可直接提交,完成test.txt
的刪除;rm <file>
該命令用於刪除工做區和版本庫中的文件,不能刪除暫存區文件;學習
注意:沒有添加到
git
倉庫中的本地文件,都屬於工做區文件。命令行
與git rm
不一樣的是,該指令不會將刪除操做歸入暫存區。須要先將刪除的test.txt
歸入暫存區,再提交到版本庫才能完成test.txt
文件的刪除;3d
從圖中可知rm
命令只能刪除工做區中的test3.txt
,不能刪除暫存區中的test3.txt
;:rest
git mv <file1> <file2>
使用git
命令git mv
:
git mv test.txt test3.txt
將test.txt
重命名爲test3.txt
;mv
命令可理解爲剪切的同時進行改名;
changes to be committed
表示該修改已經歸入暫存區,能夠進行提交操做;
通常綠色的文件(操做)表示已經提交到暫存區了,不用再進行
git add
,能夠直接進行提交(git commit
)。
從上文可知git mv
作了兩件事:
test.txt
重命名爲test3.txt
;test.txt -> test3.txt
歸入暫存區;mv <file1> <file2>
使用系統命令mv
:
mv test2.txt test3.txt
執行該語句後查看狀態git status
:
發現工做區中多出兩步操做:
刪除文件test2.txt
;
新建文件text3.txt
;
再使用git add test2.txt test3.txt
將操做提交到暫存區,經過git status
查看狀態:
此時git
當即就能識別出來這是一個文件重命名;
由此說明git mv
進行了三步操做:
test2.txt
;test3.txt
;即git mv
與 mv
的區別至關於git rm
與 rm
之間的區別。
<->
本地文件diff file_a file_b
這是系統提供的比較命令,用於比較本地文件或已經提交到版本庫的文件。建立文件a
和文件b
,使用上述指令進行比較:
在 diff -u a b
的輸出信息中:
加上參數
-u
能夠更詳細地顯示比較信息。
--- a
表示a
爲原文件;
+++ b
表示b
爲目標文件;
-1,3
中 -
表示原文件即a
,1
表示原文件中的第一行,3
表示到第3
行。合起來的意思爲:在原文件a
中的1~3
行;
同理:+1,3
表示:目標文件b
中的1~3
行;
數據前面有三種符號,分別表示不一樣的信息:
AABB
這一行文件a
,b
都有;-
:表示原文件a
去掉該行就能變爲目標文件b
;+
:表示原文件a
加上該行就能變爲目標文件b
;因此整個輸出信息的意思爲:AABB
這一行兩文件都有,只要原文件a
去掉:
a1 a2
並加上:
b1 b2
就能變爲目標文件b
;
<-
暫存區如下爲git
提供的比較命令,做用爲:比較暫存區和工做區中的同一文件。而且:原始文件爲暫存區中的文件,目標文件爲工做區中的文件。示例以下:
git diff
首先,新建文件A.txt
和B.txt
,修改其內容並提交到暫存區:
而後,在工做區中再次修改文件A.txt
與B.txt
的內容:
此時使用git diff
進行比較:
在 git diff
的輸出信息中:
--- a/A.txt
:表示原文件爲暫存區中的A.txt
;
+++ b/A.txt
:表示目標文件爲工做區中的A.txt
;
-1
: 其中-
表示原文件,1
表示從第1
行開始。因爲暫存區中的A.txt
文件(原文件)只有1
行,因此將原來的(-1,1)
簡寫爲-1
;
+1,2
:其中+
表示目標文件,1,2
表示工做區中的A.txt
文件(目標文件)從第1
行開始有2
行;
hello world
:表示原文件和目標文件中都存在的內容;
+hello java
表示暫存區中的A.txt
加上該行,就能變得與工做區中的A.txt
同樣;
能夠看到該指令是將同一文件的工做區版本與暫存區版本進行比較,各比各的,並不會將A.txt
與B.txt
進行比較。
<-
版本庫如下指令做用爲:比較版本庫和工做區中的同一文件。而且:原始文件爲版本庫中的文件,目標文件爲工做區中的文件。
git diff commit_id
用於比較指定commit id
提交上的A
文件和工做區中的A
文件;
git diff HEAD
用於比較最新提交上的A
文件和工做區中的A
文件:
上面的
A
文件僅爲一個示例,如下同理。
以下圖所示,先初始化test.txt
爲:版本庫中的修改
,而後進行一次提交;隨後在工做區中爲test.txt
添加工做區的修改
;而後執行上述比較指令,從顯示出來的比較結果可知,工做區中的test.txt
文件比最新一次提交的test.txt
文件多了一行工做區中的修改
內容。
<-
版本庫如下指令做用爲:比較版本庫和暫存區中的同一文件,其中原始文件爲版本庫中的文件,目標文件爲暫存區中的文件:
git diff --cached commit_id
用於比較指定提交上的A
文件和暫存區中的A
文件;
git diff --cached
用於比較最新提交上的A
文件和暫存區中的A
文件。示例以下:
能夠看到,暫存區中的A.txt
文件比最新提交中的A.txt
文件多了一行hello java
;暫存區中的B.txt
文件比最新提交中的B.txt
文件多了一行hello java2
。
關於目標文件與原始文件的斷定,遵循的順序爲:工做區 <-
暫存區 <-
版本庫(提交);
上述比較指令的比較以下表所示:
指令 | 做用 | 原始文件 | 目標文件 |
---|---|---|---|
diff <file1> <file2> |
比較兩個本地文件 | 本地文件/版本庫 | 本地文件/版本庫 |
git diff |
比較暫存區和工做區中的同一文件 | 暫存區 | 工做區 |
git diff commit_id |
比較指定commit id 提交上的A 文件和工做區中的A 文件 |
版本庫 | 工做區 |
git diff HEAD |
比較最新提交上的A 文件和工做區中的A 文件 |
版本庫 | 工做區 |
git diff --cached commit_id |
比較指定提交上的A 文件和暫存區中的A 文件 |
版本庫 | 暫存區 |
git diff --cached |
比較最新提交上的A 文件和暫存區中的A 文件 |
版本庫 | 暫存區 |
表格中的
A
文件僅爲示例。
主要是將已經歸入暫存區的修改(綠色),先恢復到工做區(紅色),再恢復到修改前。好比撤銷git rm
這一刪除操做:
unstage
)也就是將對文件的修改操做由綠色變爲紅色。
git reset head <file>
以下圖所示,經過git rm
刪除了版本庫中的test3.txt
文件,並將該操做提交到了暫存區。隨後經過以上命令,將這一刪除操做恢復到了工做區;
git restore --stage <file>
這裏的參數--stage
寫成--staged
效果是同樣的,做用與法一相同:
好比撤銷工做區中對文件的修改、新增和刪除操做:
git restore <file>
以下圖所示,在工做區中刪除了test3.txt
文件。而後,經過上述指令撤銷了工做區中對test3.txt
的刪除操做:
git checkout -- <file>
做用與法一相同:
git commit --amend -m
'修正信息'若是寫錯了提交消息:
能夠經過:git commit --amend -m '註釋'
來修改上一次的提交信息:(amend
是修復的意思)
git commit --amend
當須要爲最近一次提交添加大量註釋時,能夠直接使用該指令進入vim
編輯器編輯:
這樣的好處是:錯誤的提交和修正後的提交通過該命令修正後,只變爲一次提交,而不是兩次提交;
git commit --amend --author 'Name<email>'
用於修改最近一次提交的配置信息,包含做者和註釋信息。執行命令時會進入vim
編輯器編輯註釋信息:
修改前該分支上最近兩次的提交信息爲:
修改後的最近兩次提交信息爲:
能夠看到成功地改變了最新一次提交的做者和提交註釋。
注意:修改提交註釋的同時,雖然提交的內容相同,可是提交先後的
commit_id
是不一樣的,說明建立了一個新提交替換了原來須要修正的提交。以下圖中的提交5
與提交3
所示:
如圖所示,在test
分支進行了四次提交。如今咱們想要修改第三次提交的提交信息:
git rebase -i commit_id
經過以上指令能夠進入rebase
交互模式,並顯示commit_id
以後的提交信息。好比:若命令中的commit_id
爲第一次提交的commit_id
,那麼就會顯示第2~4
次的提交信息。這裏咱們須要修改第三次提交的信息,只須要將它指定爲第二次提交的commit_id
便可。執行如下命令,進入vim
編輯器:
git rebase -i 678e0
在這個界面中,咱們能夠經過將pick
參數修改成其餘rebase
提供的參數,從而對第三次錯誤提交進行修改。有兩個參數能夠實現這一目的:
這裏涉及到
vim
編輯器的使用方式:
shift + A
爲插入命令,可進入vim
編輯器的編輯模式;- 編輯完成後,先按
ESC
回到vim
編輯器的命令行模式,再輸入:wq
表示保存並退出編輯器;
reword
參數
該參數的意思是:直接修改設置了該參數的提交的提交註釋。這裏應該將第三次提交的pick
參數改成reword
:
經過:wq
保存並退出,隨後再次進入vim
編輯器,此次是修改設置了reword
參數的提交的提交註釋:
將它改成正確的提交信息:
經過:wq
保存並退出vim
編輯器,完成錯誤提交信息的修改,再次查看歷史提交信息:
能夠發現:錯誤的提交信息獲得了糾正,而且此次提交及其以後的提交的commit_id
都發生了變化。說明git
新建立了對應數目的提交,並對原有提交進行了覆蓋,可是內容沒有發生變化;
事實上:
rebase
的含義爲變換基準,git rebase -i commit_id
中的commit_id
所指的提交節點就是新的基準點。該基準點以後的提交都會被git
新建立的,內容同樣的新提交所覆蓋。rebase
指令以後會詳細介紹。
edit
參數
該參數也能夠達到上述效果,只不過稍微多了幾個步驟。這個參數的意思是:停下rebase
進程,編輯添加了該參數的提交,編輯完以後,經過調用git rebase --continue
繼續進行rebase
;具體以下:
將添加了錯誤提交信息的提交的pick
參數改成edit
參數:
經過:wq
保存並退出:
能夠看到,edit
參數將rebase
操做停了下來。根據提示,能夠經過:
git commit --amend
進入vim
編輯器,修改當前提交的註釋信息:
修改完後,經過:wq
保存並退出vim
編輯器。再調用:
git rebase --continue
繼續進行rebase
操做,由此完成錯誤提交信息的修改:
此時查看test
分支的提交歷史,會發現錯誤的提交信息獲得了更正,而且與上reword
參數同樣,建立了新的提交,對原有提交進行了覆蓋,一樣內容也不發生變化:
git rebase -i HEAD~n
經過上述指令也能夠進入rebase
交互模式,其中n
表示須要顯示的最近n
次提交記錄。好比經過如下指令,顯示test
分支最近的三次提交記錄:
git rebase -i HEAD~3
進入rebase
的交互界面以後,後續的操做和結果都與第一種方法同樣,這裏就再也不贅述了。
git help config
該命令會打開git
安裝目錄下的git-config
幫助文檔:
文檔中詳細地顯示了相關操做指令的使用:
git config --help
效果與上述同樣,都是彈出一樣的幫助網頁;
man git-config
man
爲linux
中自帶的幫助文檔,也能夠查看幫助;
git
直接在命令窗口顯示經常使用的指令: