Git應用詳解第二講:Git刪除、修改、撤銷操做

前言

前情提要:Git應用詳解第一講:Git分區,配置與日誌html

在第一講中咱們對Git進行了簡單的入門介紹,相信聰明的你已經瞭解Git的基本使用了。java

image-20200412134325276

這一講咱們來進一步深刻學習Git應用,着重介紹Git的一些常見操做,包括:刪除文件、比較文件、撤銷修改、修改註釋與查看幫助文檔。linux

1、刪除文件

1.git rm <file>

該命令用於刪除版本庫中的文件;刪除工做區和暫存區中的文件都會報錯:git

  • 若用該指令刪除工做區中的文件,會報找不到文件的錯誤:

image-20200405195803132

  • 若用該指令刪除暫存區中的文件,報以下錯誤:

image-20200405201638233

所謂版本庫中的文件指的是:已經經過commit指令提交的文件,而不是工做區中的文件(紅色),或暫存區中的文件(綠色)。vim

git rm完成了兩步操做:編輯器

  • 第一步:將版本庫中的文件刪除;
  • 第二步:將刪除操做歸入暫存區(stage)。以下圖所示,至關於執行了git add test.txt,隨後可直接提交,完成test.txt的刪除;

image-20200405201927597

2.rm <file>

該命令用於刪除工做區和版本庫中的文件,不能刪除暫存區文件學習

注意:沒有添加到git倉庫中的本地文件,都屬於工做區文件。命令行

  • 刪除工做區中的文件時:

image-20200405222915798

  • 刪除版本庫中的文件時:

image-20200405223040208

git rm不一樣的是,該指令不會將刪除操做歸入暫存區。須要先將刪除的test.txt歸入暫存區,再提交到版本庫才能完成test.txt文件的刪除;3d

  • 刪除暫存區中文件時:

image-20200405223452369

從圖中可知rm命令只能刪除工做區中的test3.txt,不能刪除暫存區中的test3.txt;:rest

2、重命名文件

1.git mv <file1> <file2>

使用git命令git mv

git mv test.txt test3.txt

​ 將test.txt重命名爲test3.txtmv命令可理解爲剪切的同時進行改名

image-20200310092256341

changes to be committed 表示該修改已經歸入暫存區,能夠進行提交操做;

通常綠色的文件(操做)表示已經提交到暫存區了,不用再進行git add ,能夠直接進行提交(git commit)。

從上文可知git mv作了兩件事:

  • 第一步:將文件test.txt重命名爲test3.txt
  • 第二步:將重命名操做test.txt -> test3.txt歸入暫存區

2.mv <file1> <file2>

使用系統命令mv

mv test2.txt test3.txt

執行該語句後查看狀態git status

image-20200310095219961

發現工做區中多出兩步操做:

  • 刪除文件test2.txt

  • 新建文件text3.txt

再使用git add test2.txt test3.txt 將操做提交到暫存區,經過git status查看狀態:

image-20200310095715353

此時git當即就能識別出來這是一個文件重命名;

由此說明git mv進行了三步操做:

  • 第一步:刪除工做區中重命名前的文件test2.txt
  • 第二步:在工做區中建立重命名後的文件test3.txt
  • 第三步:將上述的兩個操做提交到暫存區中;

git mvmv的區別至關於git rmrm 之間的區別。

3、比較文件

1.本地文件 <-> 本地文件

diff file_a file_b

這是系統提供的比較命令,用於比較本地文件或已經提交到版本庫的文件。建立文件a和文件b,使用上述指令進行比較:

image-20200406231641027

diff -u a b的輸出信息中:

加上參數-u能夠更詳細地顯示比較信息。

  • --- a表示a爲原文件;

  • +++ b表示b爲目標文件;

  • -1,3- 表示原文件即a1 表示原文件中的第一行,3 表示到第3行。合起來的意思爲:在原文件a中的1~3

  • 同理:+1,3 表示:目標文件b中的1~3

  • 數據前面有三種符號,分別表示不一樣的信息:

    • 空格:表示該行在兩個文件中都存在,如上圖所示AABB這一行文件ab都有;
    • - :表示原文件a去掉該行就能變爲目標文件b
    • + :表示原文件a加上該行就能變爲目標文件b

    因此整個輸出信息的意思爲:AABB這一行兩文件都有,只要原文件a去掉:

a1
a2

並加上:

b1
b2

就能變爲目標文件b

2.工做區 <- 暫存區

如下爲git提供的比較命令,做用爲:比較暫存區工做區中的同一文件。而且:原始文件暫存區中的文件,目標文件工做區中的文件。示例以下:

git diff

首先,新建文件A.txtB.txt,修改其內容並提交到暫存區

image-20200412120920654

而後,在工做區中再次修改文件A.txtB.txt的內容:

image-20200412121509360

此時使用git diff進行比較:

image-20200412122316757

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.txtB.txt進行比較。

3.工做區 <- 版本庫

如下指令做用爲:比較版本庫工做區中的同一文件。而且:原始文件版本庫中的文件,目標文件工做區中的文件。

git diff commit_id

用於比較指定commit id提交上的A文件和工做區中的A文件;

git diff HEAD

用於比較最新提交上的A文件和工做區中的A文件:

上面的A文件僅爲一個示例,如下同理。

以下圖所示,先初始化test.txt爲:版本庫中的修改,而後進行一次提交;隨後在工做區中爲test.txt添加工做區的修改;而後執行上述比較指令,從顯示出來的比較結果可知,工做區中的test.txt文件比最新一次提交的test.txt文件多了一行工做區中的修改內容。

image-20200412115931597

4.暫存區 <- 版本庫

如下指令做用爲:比較版本庫暫存區中的同一文件,其中原始文件版本庫中的文件,目標文件暫存區中的文件:

git diff --cached commit_id

用於比較指定提交上的A文件和暫存區中的A文件;

git diff --cached

用於比較最新提交上的A文件和暫存區中的A文件。示例以下:

image-20200407000812878

能夠看到,暫存區中的A.txt文件比最新提交中的A.txt文件多了一行hello java;暫存區中的B.txt文件比最新提交中的B.txt文件多了一行hello java2

5.總結

  • 關於目標文件與原始文件的斷定,遵循的順序爲:工做區 <- 暫存區 <-版本庫(提交);

  • 上述比較指令的比較以下表所示:

    指令 做用 原始文件 目標文件
    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文件僅爲示例。

4、撤銷修改

主要是將已經歸入暫存區的修改(綠色),先恢復到工做區紅色),再恢復到修改前。好比撤銷git rm這一刪除操做:

1.將暫存區修改恢復到工做區(unstage

也就是將對文件的修改操做由綠色變爲紅色

法一:git reset head <file>

以下圖所示,經過git rm刪除了版本庫中的test3.txt文件,並將該操做提交到了暫存區。隨後經過以上命令,將這一刪除操做恢復到了工做區;

image-20200405225413462

法二:git restore --stage <file>

這裏的參數--stage寫成--staged效果是同樣的,做用與法一相同:

image-20200405225640532

2.撤銷工做區操做

好比撤銷工做區中對文件的修改、新增和刪除操做:

法一:git restore <file>

以下圖所示,在工做區中刪除了test3.txt文件。而後,經過上述指令撤銷了工做區中對test3.txt的刪除操做:

image-20200405230055203

法二:git checkout -- <file>

做用與法一相同:

image-20200405230315968

5、修改提交註釋與做者

1.修改最近一次提交信息

git commit --amend -m '修正信息'

若是寫錯了提交消息:

image-20200310101619708

能夠經過:git commit --amend -m '註釋' 來修改上一次的提交信息:(amend是修復的意思)

image-20200310101729451

git commit --amend

當須要爲最近一次提交添加大量註釋時,能夠直接使用該指令進入vim編輯器編輯:

image-20200407111646674

image-20200407111918667

這樣的好處是:錯誤的提交和修正後的提交通過該命令修正後,只變爲一次提交,而不是兩次提交;

git commit --amend --author 'Name<email>'

用於修改最近一次提交的配置信息,包含做者和註釋信息。執行命令時會進入vim編輯器編輯註釋信息:

image-20200407112745165

修改前該分支上最近兩次的提交信息爲:

image-20200407113017530

修改後的最近兩次提交信息爲:

image-20200407112949897

能夠看到成功地改變了最新一次提交的做者和提交註釋。

注意:修改提交註釋的同時,雖然提交的內容相同,可是提交先後的commit_id是不一樣的,說明建立了一個新提交替換了原來須要修正的提交。以下圖中的提交5與提交3所示:

image-20200412135216028

2.修改特定提交信息

如圖所示,在test分支進行了四次提交。如今咱們想要修改第三次提交的提交信息:

image-20200409220741630

git rebase -i commit_id

經過以上指令能夠進入rebase交互模式,並顯示commit_id以後的提交信息。好比:若命令中的commit_id爲第一次提交的commit_id,那麼就會顯示第2~4次的提交信息。這裏咱們須要修改第三次提交的信息,只須要將它指定爲第二次提交的commit_id便可。執行如下命令,進入vim編輯器:

git rebase -i 678e0

image-20200409221442183

在這個界面中,咱們能夠經過將pick參數修改成其餘rebase提供的參數,從而對第三次錯誤提交進行修改。有兩個參數能夠實現這一目的:

這裏涉及到vim編輯器的使用方式:

  • shift + A爲插入命令,可進入vim編輯器的編輯模式;
  • 編輯完成後,先按ESC回到vim編輯器的命令行模式,再輸入:wq表示保存並退出編輯器;

reword參數

該參數的意思是:直接修改設置了該參數的提交的提交註釋。這裏應該將第三次提交的pick參數改成reword

image-20200409221729553

經過:wq保存並退出,隨後再次進入vim編輯器,此次是修改設置了reword參數的提交的提交註釋:

image-20200409222313064

將它改成正確的提交信息:

image-20200409222354009

經過:wq保存並退出vim編輯器,完成錯誤提交信息的修改,再次查看歷史提交信息:

image-20200409222546686

能夠發現:錯誤的提交信息獲得了糾正,而且此次提交及其以後的提交的commit_id都發生了變化。說明git新建立了對應數目的提交,並對原有提交進行了覆蓋,可是內容沒有發生變化;

事實上:rebase的含義爲變換基準,git rebase -i commit_id中的commit_id所指的提交節點就是新的基準點。該基準點以後的提交都會被git新建立的,內容同樣的新提交所覆蓋。rebase指令以後會詳細介紹。

edit參數

該參數也能夠達到上述效果,只不過稍微多了幾個步驟。這個參數的意思是:停下rebase進程,編輯添加了該參數的提交,編輯完以後,經過調用git rebase --continue繼續進行rebase;具體以下:

將添加了錯誤提交信息的提交的pick參數改成edit參數:

image-20200409223222526

經過:wq保存並退出:

image-20200409223307520

能夠看到,edit參數將rebase操做停了下來。根據提示,能夠經過:

git commit --amend

進入vim編輯器,修改當前提交的註釋信息:

image-20200409223703479

修改完後,經過:wq保存並退出vim編輯器。再調用:

git rebase --continue

繼續進行rebase操做,由此完成錯誤提交信息的修改:

image-20200409223842997

此時查看test分支的提交歷史,會發現錯誤的提交信息獲得了更正,而且與上reword參數同樣,建立了新的提交,對原有提交進行了覆蓋,一樣內容也不發生變化:

image-20200409224153743

git rebase -i HEAD~n

經過上述指令也能夠進入rebase交互模式,其中n表示須要顯示的最近n次提交記錄。好比經過如下指令,顯示test分支最近的三次提交記錄:

git rebase -i HEAD~3

image-20200409224856810

進入rebase的交互界面以後,後續的操做和結果都與第一種方法同樣,這裏就再也不贅述了。

6、獲取幫助

1.git help config

該命令會打開git安裝目錄下的git-config幫助文檔:

image-20200412143709617

文檔中詳細地顯示了相關操做指令的使用:

image-20200412143856397

2.git config --help

效果與上述同樣,都是彈出一樣的幫助網頁;

3.man git-config

manlinux中自帶的幫助文檔,也能夠查看幫助;

4.git

直接在命令窗口顯示經常使用的指令:

image-20200310181313462

相關文章
相關標籤/搜索