Chapters ā–¾ 2nd Edition

7.9 Git ć®ć•ć¾ć–ć¾ćŖćƒ„ćƒ¼ćƒ« - Rerere

Rerere

git rerere ć‚³ćƒžćƒ³ćƒ‰ćÆćƒ™ćƒ¼ćƒ«ć«åŒ…ć¾ć‚ŒćŸę©Ÿčƒ½ćØć„ć£ć¦ć‚‚ć„ć„ć§ć—ć‚‡ć†ć€‚ć“ć‚ŒćÆ ā€œreuse recorded resolutionā€ ć®ē•„ć§ć™ć€‚ćć®åćŒē¤ŗć™ćØćŠć‚Šć€ć“ć®ć‚³ćƒžćƒ³ćƒ‰ćÆć€ć‚³ćƒ³ćƒ•ćƒŖć‚ÆćƒˆćŒć©ć®ć‚ˆć†ć«č§£ę¶ˆć•ć‚ŒćŸć‹ć‚’čØ˜éŒ²ć—ć¦ćć‚Œć¾ć™ć€‚ćć—ć¦ć€åŒć˜ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć«ę¬”ć«å‡ŗćć‚ć—ćŸćØćć«ć€č‡Ŗå‹•ć§č§£ę¶ˆć—ć¦ćć‚Œć‚‹ć®ć§ć™ć€‚

ć„ćć¤ć‚‚ć®å “é¢ć§ć€ć“ć®ę©Ÿčƒ½ćŒćØć¦ć‚‚å½¹ē«‹ć¤ćØę€ć„ć¾ć™ć€‚Git ć®ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć§ęŒ™ć’ć‚‰ć‚Œć¦ć„ć‚‹ä¾‹ćÆć€é•·ęœŸć«ć‚ćŸć£ć¦é–‹ē™ŗćŒē¶šć„ć¦ć„ć‚‹ćƒˆćƒ”ćƒƒć‚Æćƒ–ćƒ©ćƒ³ćƒć‚’å•é”ŒćŖććƒžćƒ¼ć‚øć•ć‚Œć‚‹ć‚ˆć†ć«ć—ć¦ćŠććŸć„ć‘ć‚Œć©ć€ćć®ćŸć‚ć®ćƒžćƒ¼ć‚øć‚³ćƒŸćƒƒćƒˆćŒć„ćć¤ć‚‚ē”Ÿć¾ć‚Œć‚‹ć‚ˆć†ćŖēŠ¶ę³ćÆéæć‘ćŸć„ć€ćØć„ć†ć‚‚ć®ć§ć™ć€‚rerere ć‚’ęœ‰åŠ¹ć«ć—ćŸēŠ¶ę…‹ć§ć€ćƒžćƒ¼ć‚øć‚’ćØććŠć‚Šå®Ÿč”Œć—ć€ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć‚’ćć®ćŸć³ć«č§£ę¶ˆć—ćŸć†ćˆć§ć€ćƒžćƒ¼ć‚øć‚’å–ć‚Šę¶ˆć—ć¦ćæć¦ćć ć•ć„ć€‚ć“ć®ę‰‹é †ć‚’ē¶™ē¶šēš„ć«č”Œć£ć¦ćŠć‘ć°ć€ęœ€ēµ‚ēš„ćŖćƒžćƒ¼ć‚øćÆå®¹ę˜“ćŖć‚‚ć®ć«ćŖć‚‹ćÆćšć§ć™ć€‚rerere ćŒć™ć¹ć¦ć‚’č‡Ŗå‹•ć§å‡¦ē†ć—ć¦ćć‚Œć‚‹ć‹ć‚‰ć§ć™ć€‚

ćƒŖćƒ™ćƒ¼ć‚¹ć™ć‚‹åŗ¦ć«åŒć˜ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć‚’å‡¦ē†ć™ć‚‹ć“ćØćŖćć€ćƒ–ćƒ©ćƒ³ćƒć‚’ćƒŖćƒ™ćƒ¼ć‚¹ć•ć‚ŒćŸēŠ¶ę…‹ć«äæć£ć¦ćŠććØćć«ć‚‚ć“ć®ę–¹ę³•ćŒä½æćˆć¾ć™ć€‚ć‚ć‚‹ć„ćÆć€ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć‚’ć™ć¹ć¦č§£ę¶ˆć—ć¦ć€ć‚ˆć†ć‚„ć£ćØćƒžćƒ¼ć‚øć—ēµ‚ćˆćŸå¾Œć«ć€ćƒŖćƒ™ćƒ¼ć‚¹ć‚’ä½æć†ć“ćØć«ę–¹é‡ć‚’å¤‰ę›“ć—ćŸćØć—ć¾ć—ć‚‡ć†ć€‚rerere ć‚’ä½æćˆć°ć€åŒć˜ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć‚’å†åŗ¦å‡¦ē†ć›ćšć«ęøˆćæć¾ć™ć€‚

ćć®ä»–ć«ć‚‚ć€é–‹ē™ŗäø­ć®ćƒˆćƒ”ćƒƒć‚Æćƒ–ćƒ©ćƒ³ćƒć‚’ć„ćć¤ć‚‚ć¾ćØć‚ć¦ćƒžćƒ¼ć‚øć—ć¦ć€ćƒ†ć‚¹ćƒˆåÆčƒ½ćŖ HEAD ć‚’ē”Ÿęˆć™ć‚‹ćØćļ¼ˆGit ęœ¬ä½“ć®ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć§ć‚ˆćč”Œć‚ć‚Œć¦ć„ć¾ć™ļ¼‰ć«ć‚‚ć“ć®ć‚³ćƒžćƒ³ćƒ‰ćŒä½æćˆć¾ć™ć€‚ćƒ†ć‚¹ćƒˆćŒå¤±ę•—ć—ćŸć‚‰ć€ćƒžćƒ¼ć‚øć‚’å–ć‚Šę¶ˆć—ćŸć†ćˆć§å¤±ę•—ć®åŽŸå› ćØćŖć£ćŸćƒ–ćƒ©ćƒ³ćƒć‚’é™¤å¤–ć—ć¦ć‹ć‚‰ćƒ†ć‚¹ćƒˆć‚’å†å®Ÿč”Œć™ć‚‹ć‚ć‘ć§ć™ćŒć€rerere ć‚’ä½æćˆć°ćć®éš›ć«ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć‚’č§£ę¶ˆć™ć‚‹åæ…č¦ćŒćŖććŖć‚‹ć®ć§ć™ć€‚

rerere ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆć€ä»„äø‹ć®čØ­å®šć‚³ćƒžćƒ³ćƒ‰ć‚’å®Ÿč”Œć—ć¾ć—ć‚‡ć†ć€‚

$ git config --global rerere.enabled true

č©²å½“ć®ćƒŖćƒć‚øćƒˆćƒŖć« .git/rr-cache ćØć„ć†ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖć‚’ä½œęˆć—ć¦ć‚‚ rerere ćÆęœ‰åŠ¹ć«ćŖć‚Šć¾ć™ćŒć€čØ­å®šć™ć‚‹ć»ć†ćŒć‚ć‹ć‚Šć‚„ć™ć„ć§ć—ć‚‡ć†ć€‚čØ­å®šć§ć‚ć‚Œć°ć€å…ØćƒŖćƒć‚øćƒˆćƒŖć«é©ē”Øć™ć‚‹ć“ćØć‚‚ć§ćć¾ć™ć€‚

ć§ćÆå®Ÿéš›ć®ä¾‹ć‚’č¦‹ć¦ćæć¾ć—ć‚‡ć†ć€‚ä»„å‰ä½æć£ćŸć‚ˆć†ćŖå˜ē“”ćŖä¾‹ć§ć™ć€‚ hello.rb ćØć„ć†ćƒ•ć‚”ć‚¤ćƒ«åć®ć€ä»„äø‹ć®ć‚ˆć†ćŖćƒ•ć‚”ć‚¤ćƒ«ćŒć‚ć£ćŸćØć—ć¾ć™ć€‚

#! /usr/bin/env ruby

def hello
  puts 'hello world'
end

ä»Šć„ć‚‹ćƒ–ćƒ©ćƒ³ćƒć§ćÆć“ć®ćƒ•ć‚”ć‚¤ćƒ«ć® ā€œhelloā€ ćØć„ć†å˜čŖžć‚’ ā€œholaā€ ć«å¤‰ę›“ć—ć€åˆ„ć®ćƒ–ćƒ©ćƒ³ćƒć§ćÆ ā€œworldā€ 悒 ā€œmundoā€ ć«å¤‰ę›“ć—ćŸćØć—ć¾ć™ć€‚å‰å›žćØåŒę§˜ć§ć™ć­ć€‚

rerere1

恓悌悉2ć¤ć®ćƒ–ćƒ©ćƒ³ćƒć‚’ćƒžćƒ¼ć‚øć—ć‚ˆć†ćØć™ć‚‹ćØć€ć‚³ćƒ³ćƒ•ćƒŖć‚ÆćƒˆćŒē™ŗē”Ÿć—ć¾ć™ć€‚

$ git merge i18n-world
Auto-merging hello.rb
CONFLICT (content): Merge conflict in hello.rb
Recorded preimage for 'hello.rb'
Automatic merge failed; fix conflicts and then commit the result.

ć‚³ćƒžćƒ³ćƒ‰å‡ŗåŠ›ć« Recorded preimage for FILE ćØć„ć†č¦‹ę…£ć‚ŒćŖć„č”ŒćŒć‚ć‚‹ć®ć«ę°—ć„ć‹ć‚ŒćŸć§ć—ć‚‡ć†ć€‚ä»–ć®éƒØåˆ†ćÆć€ć‚ˆćć‚ć‚‹ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć®ćƒ”ćƒƒć‚»ćƒ¼ć‚øćØå¤‰ć‚ć‚Šć‚ć‚Šć¾ć›ć‚“ć€‚ć“ć®ę™‚ē‚¹ć§ć€rerere ć‹ć‚‰ć‚ć‹ć‚‹ć“ćØćŒć„ćć¤ć‹ć‚ć‚Šć¾ć™ć€‚ć“ć†ć„ć£ćŸå “åˆć€ć„ć¤ć‚‚ć§ć‚ć‚Œć°ä»„äø‹ć®ć‚ˆć†ć« git status ć‚’å®Ÿč”Œć—ć€ä½•ćŒć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć—ć¦ć„ć‚‹ć®ć‹ć‚’ē¢ŗčŖć™ć‚‹ć‚‚ć®ć§ć™ć€‚

$ git status
# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#	both modified:      hello.rb
#

恧恙恌态恓恓恧 git rerere status ć‚’å®Ÿč”Œć™ć‚‹ćØć€ć©ć®ćƒ•ć‚”ć‚¤ćƒ«ć®ćƒžćƒ¼ć‚øå‰ć®ēŠ¶ę…‹ćŒ git rerere ć«ć‚ˆć£ć¦äæå­˜ć•ć‚ŒćŸć‹ćŒć‚ć‹ć‚Šć¾ć™ć€‚

$ git rerere status
hello.rb

ꛓ恫态git rerere diff ć‚’å®Ÿč”Œć™ć‚‹ćØć€ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆč§£ę¶ˆć®ēŠ¶ę³ćŒć‚ć‹ć‚Šć¾ć™ć€‚å…·ä½“ēš„ć«ćÆć€ē€ę‰‹å‰ćŒć©ć†ć„ć†ēŠ¶ę…‹ć§ć‚ć£ćŸć‹ć€ć©ć†ć„ć†é¢Øć«č§£ę¶ˆć—ćŸć®ć‹ć€ćŒć‚ć‹ć‚Šć¾ć™ć€‚

$ git rerere diff
--- a/hello.rb
+++ b/hello.rb
@@ -1,11 +1,11 @@
 #! /usr/bin/env ruby

 def hello
-<<<<<<<
-  puts 'hello mundo'
-=======
+<<<<<<< HEAD
   puts 'hola world'
->>>>>>>
+=======
+  puts 'hello mundo'
+>>>>>>> i18n-world
 end

また(rerere ē‰¹ęœ‰ć®č©±ć§ćÆć‚ć‚Šć¾ć›ć‚“ćŒļ¼‰ć€ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć—ć¦ć„ć‚‹ćƒ•ć‚”ć‚¤ćƒ«ćØć€ćć®ćƒ•ć‚”ć‚¤ćƒ«ć®3ćƒćƒ¼ć‚øćƒ§ćƒ³ļ¼ˆćƒžćƒ¼ć‚øå‰ćƒ»ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆćƒžćƒ¼ć‚«ćƒ¼å·¦å‘ććƒ»ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆćƒžćƒ¼ć‚«ćƒ¼å³å‘ćļ¼‰ćŒ ls-files -u ć‚’ä½æć†ćØć‚ć‹ć‚Šć¾ć™ć€‚

$ git ls-files -u
100644 39804c942a9c1f2c03dc7c5ebcd7f3e3a6b97519 1	hello.rb
100644 a440db6e8d1fd76ad438a49025a9ad9ce746f581 2	hello.rb
100644 54336ba847c3758ab604876419607e9443848474 3	hello.rb

ć•ć¦ć€ć“ć®ć‚³ćƒ³ćƒ•ćƒŖć‚ÆćƒˆćÆ puts 'hola mundo' ćØäæ®ę­£ć—ć¦ćŠćć¾ć™ć€‚ćć—ć¦ć€ もう一度 rerere diff ć‚³ćƒžćƒ³ćƒ‰ć‚’å®Ÿč”Œć™ć‚‹ćØć€rerere ćŒčØ˜éŒ²ć™ć‚‹å†…å®¹ć‚’ē¢ŗčŖć§ćć¾ć™ć€‚

$ git rerere diff
--- a/hello.rb
+++ b/hello.rb
@@ -1,11 +1,7 @@
 #! /usr/bin/env ruby

 def hello
-<<<<<<<
-  puts 'hello mundo'
-=======
-  puts 'hola world'
->>>>>>>
+  puts 'hola mundo'
 end

ć“ć‚Œć‚’čØ˜éŒ²ć—ćŸćØć„ć†ć“ćØćÆć€hello.rb ć«åŒć˜ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆļ¼ˆäø€ę–¹ćÆ ā€œhello mundoā€ ć§ć‚‚ć†äø€ę–¹ćŒ ā€œhola worldā€ļ¼‰ćŒč¦‹ć¤ć‹ć£ćŸå “åˆć€č‡Ŗå‹•ēš„ć« ā€œhola mundoā€ ć«äæ®ę­£ć•ć‚Œć‚‹ćØć„ć†ć“ćØć«ćŖć‚Šć¾ć™ć€‚

ć§ćÆć€ć“ć®å¤‰ę›“å†…å®¹ć‚’ć‚³ćƒŸćƒƒćƒˆć—ć¾ć—ć‚‡ć†ć€‚

$ git add hello.rb
$ git commit
Recorded resolution for 'hello.rb'.
[master 68e16e5] Merge branch 'i18n'

ć‚³ćƒžćƒ³ćƒ‰å‡ŗåŠ›ć‹ć‚‰ć€Git ćŒć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆč§£ę¶ˆę–¹ę³•ć‚’čØ˜éŒ²ć—ćŸļ¼ˆ"Recorded resolution for FILE"ļ¼‰ć“ćØćŒć‚ć‹ć‚Šć¾ć™ć€‚

rerere2

ć§ćÆć“ć“ć§ć€ć“ć®ćƒžćƒ¼ć‚øć‚’å–ć‚Šę¶ˆć—ć¦ master ćƒ–ćƒ©ćƒ³ćƒć«ćƒŖćƒ™ćƒ¼ć‚¹ć—ć¦ćæć¾ć—ć‚‡ć†ć€‚ćƒŖć‚»ćƒƒćƒˆć‚³ćƒžćƒ³ćƒ‰č©³čŖ¬ ć§ē“¹ä»‹ć—ćŸćØćŠć‚Šć€ćƒ–ćƒ©ćƒ³ćƒć‚’å·»ćęˆ»ć™ć«ćÆ reset を使います。

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

ćƒžćƒ¼ć‚øćŒå–ć‚Šę¶ˆć•ć‚Œć¾ć—ćŸć€‚ē¶šć„ć¦ćƒˆćƒ”ćƒƒć‚Æćƒ–ćƒ©ćƒ³ćƒć‚’ćƒŖćƒ™ćƒ¼ć‚¹ć—ć¦ćæć¾ć™ć€‚

$ 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

äŗˆęƒ³ć©ćŠć‚Šć€ćƒžćƒ¼ć‚øć‚³ćƒ³ćƒ•ćƒŖć‚ÆćƒˆćŒē™ŗē”Ÿć—ć¾ć—ćŸć€‚äø€ę–¹ć€Resolved FILE using previous resolution ćØć„ć†ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚‚å‡ŗåŠ›ć•ć‚Œć¦ć„ć¾ć™ć€‚č©²å½“ć®ćƒ•ć‚”ć‚¤ćƒ«ć‚’ē¢ŗčŖć—ć¦ćæć¦ćć ć•ć„ć€‚ć‚³ćƒ³ćƒ•ćƒŖć‚ÆćƒˆćÆć™ć§ć«č§£ę¶ˆć•ć‚Œć¦ć„ć¦ć€ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć‚’ē¤ŗć™ćƒžćƒ¼ć‚«ćƒ¼ćÆęŒæå…„ć•ć‚Œć¦ć„ćŖć„ćÆćšć§ć™ć€‚

#! /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
rerere3

ćŖćŠć€checkout ć‚³ćƒžćƒ³ćƒ‰ć‚’ä½æć†ćØć€ćƒ•ć‚”ć‚¤ćƒ«ćŒć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć—ćŸēŠ¶ę…‹ć‚’å†ē¾ć§ćć¾ć™ć€‚

$ git checkout --conflict=merge hello.rb
$ cat hello.rb
#! /usr/bin/env ruby

def hello
<<<<<<< ours
  puts 'hola world'
=======
  puts 'hello mundo'
>>>>>>> theirs
end

ć“ć‚ŒćÆ é«˜åŗ¦ćŖćƒžćƒ¼ć‚øę‰‹ę³• ć§ä½æē”Øć—ćŸä¾‹ćØåŒć˜å†…å®¹ć§ć™ćŒć€ć“ć“ć§ćÆ rerere ć‚’ä½æć£ć¦ć‚³ćƒ³ćƒ•ćƒŖć‚Æćƒˆć‚’ć‚‚ć†äø€åŗ¦č§£ę¶ˆć—ć¦ćæć¾ć—ć‚‡ć†ć€‚

$ git rerere
Resolved 'hello.rb' using previous resolution.
$ cat hello.rb
#! /usr/bin/env ruby

def hello
  puts 'hola mundo'
end

rerere ćŒć‚­ćƒ£ćƒƒć‚·ćƒ„ć—ćŸč§£ę¶ˆę–¹ę³•ć§ć€å†å‡¦ē†ćŒč‡Ŗå‹•ēš„ć«č”Œć‚ć‚ŒćŸć‚ˆć†ć§ć™ć€‚ēµęžœć‚’ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć«čæ½åŠ ć—ć¦ć€ćƒŖćƒ™ćƒ¼ć‚¹ć‚’å…ˆć«é€²ć‚ć¾ć—ć‚‡ć†ć€‚

$ git add hello.rb
$ git rebase --continue
Applying: i18n one word

ćƒžćƒ¼ć‚øć®å†å®Ÿč”Œć‚’ä½•åŗ¦ć‚‚č”Œć†ć“ćØćŒć‚ć‚‹ć€é »ē¹ć« master ćƒ–ćƒ©ćƒ³ćƒć‚’ćƒžćƒ¼ć‚øć›ćšć«ćƒˆćƒ”ćƒƒć‚Æćƒ–ćƒ©ćƒ³ćƒć‚’ęœ€ę–°ć®ēŠ¶ę…‹ć«äæć”ćŸć„ć€ćƒŖćƒ™ćƒ¼ć‚¹ć‚’ć‚ˆćč”Œć†ā€¦ā€¦ć„ćšć‚Œć‹ć«å½“ć¦ćÆć¾ć‚‹å “åˆćÆ rerere ć‚’ęœ‰åŠ¹ć«ć—ć¦ćŠćć¾ć—ć‚‡ć†ć€‚ę—„ć€…ć®ē”Ÿę“»ćŒć”ć‚‡ć£ćØć ć‘ę„½ć«ćŖć‚‹ćØę€ć„ć¾ć™ć€‚

scroll-to-top