7.9 Rerere

2018-02-24 15:22 更新

Rerere

git rerere?功能是一個隱藏的功能。 正如它的名字 “reuse recorded resolution” 所指,它允許你讓 Git 記住解決一個塊沖突的方法,這樣在下一次看到相同沖突時,Git 可以為你自動地解決它。

有幾種情形下這個功能會非常有用。 在文檔中提到的一個例子是如果你想要保證一個長期分支會干凈地合并,但是又不想要一串中間的合并提交。 將?rerere?功能打開后偶爾合并,解決沖突,然后返回到合并前。 如果你持續(xù)這樣做,那么最終的合并會很容易,因為?rerere?可以為你自動做所有的事情。

可以將同樣的策略用在維持一個變基的分支時,這樣就不用每次解決同樣的變基沖突了。 或者你將一個分支合并并修復了一堆沖突后想要用變基來替代合并 - 你可能并不想要再次解決相同的沖突。

另一個情形是當你偶爾將一堆正在改進的特性分支合并到一個可測試的頭時,就像 Git 項目自身經(jīng)常做的。 如果測試失敗,你可以倒回合并之前然后在去除導致測試失敗的那個特性分支后重做合并,而不用再次重新解決所有的沖突。

為了啟用?rerere?功能,僅僅需要運行這個配置選項:

$ git diff-tree -p rack_remote/master

也通過在特定的倉庫中創(chuàng)建?.git/rr-cache?目錄來開啟它,但是設置選項更干凈并且可以應用到全局。

現(xiàn)在我們看一個簡單的例子,類似之前的那個。 假設有一個像這樣的文件:

#! /usr/bin/env ruby

def hello
  puts 'hello world'
end

在一個分支中修改單詞 “hello” 為 “hola”,然后在另一個分支中修改 “world” 為 “mundo”,就像之前一樣。

重置揭密?看到的?reset?來回滾分支。

$ git reset --hard HEAD^
HEAD is now at ad63f15 i18n the hello

我們的合并被撤消了。 現(xiàn)在讓我們變基特性分支。

$ git checkout i18n-world
Switched to branch 'i18n-world'

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: i18n one word
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging hello.rb
CONFLICT (content): Merge conflict in hello.rb
Resolved 'hello.rb' using previous resolution.
Failed to merge in the changes.
Patch failed at 0001 i18n one word

現(xiàn)在,正像我們期望的一樣,得到了相同的合并沖突,但是看一下?Resolved FILE using previous resolution?這行。 如果我們看這個文件,會發(fā)現(xiàn)它已經(jīng)被解決了,而且在它里面沒有合并沖突標記。

$ cat hello.rb
#! /usr/bin/env ruby

def hello
  puts 'hola mundo'
end

同樣,git diff?將會顯示出它是如何自動地重新解決的:

$ git diff
diff --cc hello.rb
index a440db6,54336ba..0000000
--- a/hello.rb
+++ b/hello.rb
@@@ -1,7 -1,7 +1,7 @@@
  #! /usr/bin/env ruby

  def hello
-   puts 'hola world'
 -  puts 'hello mundo'
++  puts 'hola mundo'
  end

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號