Git 交互式暫存

2018-09-27 15:50 更新

Git提供了很多腳本來輔助某些命令行任務(wù)。這里,你將看到一些交互式命令,它們幫助你方便地構(gòu)建只包含特定組合和部分文件的提交。在你修改了一大批文件然后決定將這些變更分布在幾個各有側(cè)重的提交而不是單個又大又亂的提交時,這些工具非常有用。用這種方法,你可以確保你的提交在邏輯上劃分為相應(yīng)的變更集,以便于供和你一起工作的開發(fā)者審閱。如果你運(yùn)行g(shù)it add時加上-i或者--interactive選項(xiàng),Git就進(jìn)入了一個交互式的shell模式,顯示一些類似于下面的信息:

$ git add -i
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now>

你會看到這個命令以一個完全不同的視圖顯示了你的暫存區(qū)——主要是你通過git status得到的那些信息但是稍微簡潔但信息更加豐富一些。它在左側(cè)列出了你暫存的變更,在右側(cè)列出了未被暫存的變更。

在這之后是一個命令區(qū)。這里你可以做很多事情,包括暫存文件,撤回文件,暫存部分文件,加入未被追蹤的文件,查看暫存文件的差別。

暫存和撤回文件

如果你在What now>的提示后輸入2或者u,這個腳本會提示你那些文件你想要暫存:

What now> 2
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

如果想暫存TODO和index.html,你可以輸入相應(yīng)的編號:

Update>> 1,2
           staged     unstaged path
* 1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

每個文件旁邊的*表示選中的文件將被暫存。如果你在update>>提示后直接敲入回車,Git會替你把所有選中的內(nèi)容暫存:

Update>>
updated 2 paths

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 1
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

現(xiàn)在你可以看到TODO和index.html文件被暫存了同時simplegit.rb文件仍然未被暫存。如果這時你想要撤回TODO文件,就使用3或者r(代表revert,恢復(fù))選項(xiàng):

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 3
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> 1
           staged     unstaged path
* 1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> [enter]
reverted one path

再次查看Git的狀態(tài),你會看到你已經(jīng)撤回了TODO文件

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

要查看你暫存內(nèi)容的差異,你可以使用6或者d(表示diff)命令。它會顯示你暫存文件的列表,你可以選擇其中的幾個,顯示其被暫存的差異。這跟你在命令行下指定git diff --cached非常相似:

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 6
           staged     unstaged path
  1:        +1/-1      nothing index.html
Review diff>> 1
diff --git a/index.html b/index.html
index 4d07108..4335f49 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,7 @@ Date Finder

 <p id="out">...</p>

-<div id="footer">contact : support@github.com</div>
+<div id="footer">contact : email.support@github.com</div>

 <script type="text/javascript">

通過這些基本命令,你可以使用交互式增加模式更加方便地處理暫存區(qū)。

暫存補(bǔ)丁

只讓Git暫存文件的某些部分而忽略其他也是有可能的。例如,你對simplegit.rb文件作了兩處修改但是只想暫存其中一個而忽略另一個,在Git中實(shí)現(xiàn)這一點(diǎn)非常容易。在交互式的提示符下,輸入5或者p(表示patch,補(bǔ)?。?。Git會詢問哪些文件你希望部分暫存;然后對于被選中文件的每一節(jié),他會逐個顯示文件的差異區(qū)塊并詢問你是否希望暫存他們:

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..57399e0 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -22,7 +22,7 @@ class SimpleGit
   end

   def log(treeish = 'master')
-    command("git log -n 25 #{treeish}")
+    command("git log -n 30 #{treeish}")
   end

   def blame(path)
Stage this hunk [y,n,a,d,/,j,J,g,e,?]?

此處你有很多選擇。輸入?可以顯示列表:

Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

如果你想暫存各個區(qū)塊,通常你會輸入y或者n,但是暫存特定文件里的全部區(qū)塊或者暫時跳過對一個區(qū)塊的處理同樣也很有用。如果你暫存了文件的一個部分而保留另外一個部分不被暫存,你的狀態(tài)輸出看起來會是這樣:

What now> 1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:        +1/-1        +4/-0 lib/simplegit.rb

simplegit.rb的狀態(tài)非常有意思。它顯示有幾行被暫存了,有幾行沒有。你部分地暫存了這個文件。在這時,你可以退出交互式腳本然后運(yùn)行g(shù)it commit來提交部分暫存的文件。

最后你也可以不通過交互式增加的模式來實(shí)現(xiàn)部分文件暫存——你可以在命令行下通過git add -p或者git add --patch來啟動同樣的腳本。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號