git rerere 功能是一個隱藏的功能。 正如它的名字 「reuse recorded resolution」 所指,它容許你讓 Git 記住解決一個塊衝突的方法,這樣在下一次看到相同衝突時,Git 能夠爲你自動地解決它git
(嗚呼呼~ 最近真的有點忙,差點我都忘了寫博客了!趕忙補上一篇)vim
相信你們也在日常工做中會用到 git,我也在不斷持續學習 git,畢竟說實話 git 多是 21 世紀裏最流行的開源分佈式版本控制系統了。bash
而後我在學習 git 的過程當中,發現了一個隱蔽很深但至關實用的 git 工具命令 —— git rerere。如下我將帶你們用從 0 到 1 創建倉庫並演示一遍 git rerere 的使用流程。分佈式
初始化一個示例倉庫工具
$ mkdir git-rerere-example
$ cd git-rerere-example/
$ git init
複製代碼
進行一個初始化提交學習
$ echo 'v1.0' > README.md
$ git add .
$ git commit -m "version 1.0"
複製代碼
用 git status 查看當前工做樹狀態測試
$ git status
On branch master
nothing to commit, working tree clean
複製代碼
ok,當前咱們在 master 分支,咱們來建立一個特性分支 feat 用來開發某個功能ui
$ git checkout -b feat
Switched to a new branch 'feat'
複製代碼
很好此時咱們有兩個分支了。準備工做完成!spa
$ git branch
* feat
master
複製代碼
等等!咱們還沒開啓 git rerere 功能,這個很簡單!我選擇全局配置 git config。固然也能夠只是配置當前倉庫,把 --global 標識符給去掉便可。命令行
$ git config --global rerere.enabled true
複製代碼
查看是否配置成功,能夠看到 rerere.enabled=true,因而準備工做 done!
$ git config --global --list
user.email=USERNAME@gmail.com
user.name=USERNAME
core.editor=vim
rerere.enabled=true
複製代碼
假設團隊成員 Tom 在 feat 分支上作了一些激動人心的功能,而且發了個特性版本!而且將 README.md 的版本內容聲明改爲了 v1.1,以下:
$ echo 'feat: blah' > feat-blah.txt
$ echo 'v1.1' > README.md
複製代碼
因而成員 Tom 淡定的在 feat 分支上提交了一個 commit
$ git add .
$ git commit -m "version v1.1"
[feat b1c500b] version v1.1
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 feat-blah.txt
複製代碼
查看當前提交狀況,可知咱們目前 HEAD 指針在 feat 分支,commit 領先於 master
$ git log --graph --oneline
* b1c500b (HEAD -> feat) version v1.1
* 03bf028 (master) version 1.0
複製代碼
讓咱們切換到 master 分支,同時假設咱們身份是另外一個團隊成員 Jerry。
$ git checkout master
Switched to branch 'master'
複製代碼
成員 Jerry 默默地在 master 分支上工做,同時發了一個大版本 v2.0,以下:
$ echo 'enjoy weekend!' > daily.txt
$ echo 'v2.0' > README.md
$ git add .
$ git commit -m "version 2.0"
[master 4ab5514] version 2.0
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 daily.txt
複製代碼
再查看當前提交狀況!
$ git log --graph --oneline
* 4ab5514 (HEAD -> master) version 2.0
* 03bf028 version 1.0
複製代碼
過了一段時間,成員 Jerry 以爲能夠合併成員 Tom 的特性分支 feat 了~ 因而以下:
$ git merge feat
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Recorded preimage for 'README.md'
Automatic merge failed; fix conflicts and then commit the result.
複製代碼
看看衝突內容
$ cat README.md
<<<<<<< HEAD
v2.0
=======
v1.1
>>>>>>> feat
複製代碼
可是留意以上 Recorded preimage for 'README.md' 這句提示,git 正在記錄你解決衝突的操做!
成員 Jerry 保留本身的改動(由於 master 版本大於 feat 版本),解決了衝突!
$ git checkout --ours README.md
$ cat README.md
v2.0
複製代碼
因而提交一個新的 commit!
$ git add .
$ git commit -m "merge feat"
Recorded resolution for 'README.md'.
[master f1ed9a5] merge feat
複製代碼
此時發現 git 提示和以往不同了,多了一句 Recorded resolution for 'README.md'.
在此以前,查看當前提交狀況!可見成功合併了 feat,而且 HEAD 指針在 f1ed9a5
$ git log --graph --oneline
* f1ed9a5 (HEAD -> master) merge feat
|\
| * b1c500b (feat) version v1.1
* | 4ab5514 version 2.0
|/
* 03bf028 version 1.0
複製代碼
既然 git 已經記錄咱們解決衝突的操做,此時讓咱們重置到 4ab5514(合併 feat 分支以前),也就是上一個提交,可用 HEAD^ 表示
$ git reset --hard HEAD^
HEAD is now at 4ab5514 version 2.0
複製代碼
很好,讓咱們再嘗試一下合併 feat 分支!
$ git merge feat
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Resolved 'README.md' using previous resolution.
Automatic merge failed; fix conflicts and then commit the result.
複製代碼
此時 git 提示咱們 Resolved 'README.md' using previous resolution. 告訴咱們自動用咱們以前的衝突解決策略解決了 README.md 的衝突
親眼見證一下!果真成功了,並且在它裏面沒有合併衝突標記
$ cat README.md
v2.0
複製代碼
固然若是改變想法了,不想用以前的合併衝突策略,也能夠
$ git checkout --conflict=merge README.md
$ cat README.md
<<<<<<< ours
v2.0
=======
v1.1
>>>>>>> theirs
複製代碼
這時候就能夠從新解決了!
而後你想了想,又想用回以前的合併衝突策略,這時候就直接能夠用 git rerere 命令來指示 git 操做
$ git rerere
Resolved 'README.md' using previous resolution.
複製代碼
反而言之,咱們變基特性分支 feat,同樣能夠!
$ git checkout feat
$ git rebase master
...
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Resolved 'README.md' using previous resolution.
...
複製代碼
一樣 git 提示了咱們 Resolved 'README.md' using previous resolution. 同樣複用了以前的合併衝突策略
$ cat README.md
v2.0
複製代碼
而後咱們確認無誤,以下操做進行提交
$ git add .
$ git rebase --continue
Applying: version v1.1
複製代碼
此時咱們查看 commit 提交狀況,變基成功!
$ git log --graph --oneline
* 2e34640 (HEAD -> feat) version v1.1
* 4ab5514 (master) version 2.0
* 03bf028 version 1.0
複製代碼
至此演示已經基本結束了,同窗們 get 到了麼?
由於 git rerere 會記住解決一個塊衝突的方法,所以至少有如下應用場景:
總而言之,git rerere 是個至關不錯的工具,使用得當的狀況下,對工做效率的提高頗有幫助~
建議同窗們能夠根據以上流程在命令行中體驗一次,而後也能夠在工做中使用,說不定會有意外之喜~ 同時也建議你們能夠參考官方文檔 Git 工具 - Rerere 學習。
最後,這篇文章對你們若有助益,不勝榮幸~