Hatena::Groupmotememo

やる夫で学ぶ gitcore-tutorial/Merging two branches

やる夫で学ぶ gitcore-tutorial/Merging two branches

           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  …ブランチで何か変更を加えてみる
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j     
          ヽム:.} ii;_j    ii;リ ル iレヽ.   
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |
$ git checkout mybranch
Switched to branch "mybranch"
$ echo "Work, work, work" >>hello
$ git commit -m "Some work." -i hello
Created commit 171aa01: Some work.
 1 files changed, 1 insertions(+), 0 deletions(-)
       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\  
  /    (__人__)   \ せっかく使い方を覚えたのに vi が起動しなかったお!!
  |   ヽ |!!il|!|!l| /   |
  \    |ェェェェ|     /


     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   -m オプションでコミットメッセージを指定できるのさっ
  |i │ l |リノ    `ヽ}_}ハ.  あと -i はインデックスに hello を追加してコミットするよっ
  |i | 从 ●     ●l小N   
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒) 
  | ヽ  ヽx>、 __, イl |::::ヽ/. 
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´



           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  master に戻ってみて…
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j     
          ヽム:.} ii;_j    ii;リ ル iレヽ.   
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |
$ git checkout master
Switched to branch "master"
        ノ L____
       ⌒ \ / \
      / (○) (○)\  hello の中身が元に戻ってしまったお!
     /    (__人__)   \  謝罪と賠償を請求するお!!
     |       |::::::|     |
     \       l;;;;;;l    /l!| !



             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ ファイルの中身はオブジェクトとしてどこかに保存されているんだよっ!
         〃 {_{\    /リ| l │ i| いちいち騒ぐんじゃないよっ!
         レ!小l●    ● 从 |、i|
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│  master でもファイルを変更するにょろ!
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |


       ____
     /      \
   / ─    ─ \   ならいいんだお…
  /   (●)  (●)   \ すまなかったお
  |      (__人__)    | 
  \     ` ⌒´     /

$ echo "Play, play, play" >>hello
$ echo "Lots of fun" >>example
$ git commit -m "Some fun." -i hello example
Created commit cf8002d: Some fun.
 2 files changed, 2 insertions(+), 0 deletions(-)
           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  ここで gitk --all すると今の状況がわかる
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j      gitk が使えないなら git log --graph --all でもいい
          ヽム:.} ii;_j    ii;リ ル iレヽ.   
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |



     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   --graph オプションは最近のじゃないとないらしいから
  |i │ l |リノ    `ヽ}_}ハ.  やる夫くんのためにまたまた貼っちゃうよ!
  |i | 从 ●     ●l小N   
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒) 
  | ヽ  ヽx>、 __, イl |::::ヽ/. 
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´
$ git log --graph --all
* commit cf8002d81efe72e74ddaa6308984b41586a70cf3
| Author: yaruo <yaruo@example.com>
| Date:   Sat Jul 26 22:26:28 2008 +0900
|
|     Some fun.
|
| * commit 171aa013ad9b7f3ef0d1d1623bff88fe90c62f77
|/  Author: yaruo <yaruo@example.com>
|   Date:   Sat Jul 26 22:14:22 2008 +0900
|
|       Some work.
|
* commit bb8322210e30931a1d916b0d7d4dd24036ab6bbf
| Author: yaruo <yaruo@example.com>
| Date:   Sat Jul 26 15:24:24 2008 +0900
|
|     ⊂二二二( ^ω^)二⊃
|
* commit 71e583b286465e8ec7b92d4b642dc77fee53562e
  Author: yaruo <yaruo@example.com>
  Date:   Sat Jul 26 13:02:42 2008 +0900

      Initial commit
      ___
    / ⌒  ⌒\
   / (⌒)  (⌒) \   
 /   ///(__人__)/// \  
|   u.   `Y⌒y'´    |   なんだかかっこいいお!
  \       ゙ー ′  ,/   cf8002 と 171aa01 が同じ bb83222 を親としているということかお!
  /⌒ヽ   ー‐    ィヽ    
  / rー'ゝ       〆ヽ
 /,ノヾ ,>      ヾ_ノ,|
 | ヽ〆        |´ |



           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  …その通り
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j      git-merge でブランチをマージできる
          ヽム:.} ii;_j    ii;リ ル iレヽ.   mybranch を今いる master ブランチにマージするにはこうする
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |
$ git merge -m "Merge work in mybranch" mybranch
Auto-merged hello
CONFLICT (content): Merge conflict in hello
Automatic merge failed; fix conflicts and then commit the result.
       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\  
  /    (__人__)   \ コンフリクトとか大文字で言われたお!
  |   ヽ |!!il|!|!l| /   | やる夫が何か悪いことしたのかお!?
  \    |ェェェェ|     /



           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  …落ち着いて
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j      今のはわざとコンフリクトするようにしただけ…
          ヽム:.} ii;_j    ii;リ ル iレヽ.   mybranch を今いる master ブランチにマージするにはこうする
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |


       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\
  /    (__人__)   \ 有希ちゃんはやる夫に恨みでもあるのかお!
  |   ヽ |!!il|!|!l| /   | …とりあえず手で修正すればいいお?
  \    |ェェェェ|     /
$ cat hello
Hello World
It's a new day for git
Play, play, play
Work, work, work
           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  手で修正が終わったら
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j      git-commit でマージを完了させる
          ヽム:.} ii;_j    ii;リ ル iレヽ.   
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |
$ git commit -i hello
Merge work in mybranch

Merge branch 'mybranch'

Conflicts:

        hello
#
# It looks like you may be committing a MERGE.
# If this is not correct, please remove the file
#       .git/MERGE_HEAD
# and try again.
#

# Please enter the commit message for your changes.
# (Comment lines starting with '#' will not be included)
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   hello
#
         ____
      /::::::─三三─\
    /:::::::: ( ○)三(○)\    なんかエディタの中身がいつもと違うお!
    |::::::::::::::::::::(__人__)::::  | _________
     \:::::::::   |r┬-|   ,/ |   |          |
    ノ::::::::::::  `ー'´   \ |   |          |



           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  …気にしないで
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j      手動マージの時はいつもそう
          ヽム:.} ii;_j    ii;リ ル iレヽ.   そのまま保存すればいい
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |


       ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \     なんだか有希ちゃんが信用できなくなってきたお…
  |     (__人__)    |    でも言うとおりにするお
  \     ` ⌒´     /



     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   手動マージが無事終わったみたいだね!
  |i │ l |リノ    `ヽ}_}ハ.  もう一度 git-log --graph を見てみるよ!
  |i | 从 ●     ●l小N   (ちなみに、HEAD の親に mybranch が入ってるから --all は要らないのさっ!)
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒) 
  | ヽ  ヽx>、 __, イl |::::ヽ/. 
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´
$ git log --graph
*   commit ff47b11b42ebfc9095d8c212dd5a0b1c27518535
|\  Merge: cf8002d... 171aa01...
| | Author: yaruo <yaruo@example.com>
| | Date:   Sat Jul 26 22:39:55 2008 +0900
| |
| |     Merge work in mybranch
| |
| |     Merge branch 'mybranch'
| |
| |     Conflicts:
| |
| |             hello
| |
| * commit 171aa013ad9b7f3ef0d1d1623bff88fe90c62f77
| | Author: yaruo <yaruo@example.com>
| | Date:   Sat Jul 26 22:14:22 2008 +0900
| |
| |     Some work.
| |
* | commit cf8002d81efe72e74ddaa6308984b41586a70cf3
|/  Author: yaruo <yaruo@example.com>
|   Date:   Sat Jul 26 22:26:28 2008 +0900
|
|       Some fun.
|
* commit bb8322210e30931a1d916b0d7d4dd24036ab6bbf
| Author: yaruo <yaruo@example.com>
| Date:   Sat Jul 26 15:24:24 2008 +0900
|
|     ⊂二二二( ^ω^)二⊃
|
* commit 71e583b286465e8ec7b92d4b642dc77fee53562e
  Author: yaruo <yaruo@example.com>
  Date:   Sat Jul 26 13:02:42 2008 +0900

      Initial commit
     ____  
   /      \
  /  ─    ─\  なるほど…
/    (●)  (●) \ 確かにグラフで見ればマージ以外の何者でもないお
|       (__人__)    |  コミットメッセージを見れば
/     ∩ノ ⊃  /    どのファイルを手動マージしたか分かるということかお
(  \ / _ノ |  |
.\ “  /__|  |  
  \ /___ /  



     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   原文では git-show-branch をしてるけど
  |i │ l |リノ    `ヽ}_}ハ.  正直見づらいからあまり出番はないと思うよ!
  |i | 从 ●     ●l小N   一応解説しておくよ!
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒) 
  | ヽ  ヽx>、 __, イl |::::ヽ/. 
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´


       _________
      /     \
    /   ―  ―\
   /   ( ●)  (●)\   やる夫は興味ないから
   i    ⌒ (__人__) ⌒ i    ウコン茶でも飲んでるお
   ヽ、    `⌒ '   /      
     /     ┌─┐
     i   丶 ヽ{ .茶 }ヽ
     r     ヽ、__)一(_丿
     ヽ、___   ヽ ヽ 
     と_____ノ_ノ
$ git show-branch --topo-order --more=1 master mybranch
* [master] Merge work in mybranch
 ! [mybranch] Some work.
--
-  [master] Merge work in mybranch
*+ [mybranch] Some work.
*  [master^] Some fun.
     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   最初の2行は注目しているブランチだよ!
  |i │ l |リノ    `ヽ}_}ハ.  "*" がついてる master が今の HEAD だねっ
  |i | 从 ●     ●l小N   
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    4行目からは親のコミットを表示しているよ!
  | i⌒ヽ j  (_.ノ   ノi|__/⌒) 1列目に印があるのは master に含まれるコミット
  | ヽ  ヽx>、 __, イl |::::ヽ/.  2列目に印があるのは mybranch に含まれるコミットなのさっ!
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´


           ,.. --- ..
       ,..-.:. ̄.:..:..:.. : : : : `丶、
      /:..:..:. ..: : : : : : : : : : : : :\
    /:ヘ=、、:._: : : : __:ヽ:_: -^,.ト、
   ノ:..:..:./:..  ̄: :7´:―― : :|‐: :´、: ヽヽ
  ー-/:..:.i:../:. : : ,/:..:.:イ:.ハ:.. : j:.. :}:.、ヽ:. トヽ
    !:..:..:|:.{/:..ィ_jz≦ノ ' }:./_}_イ:. } |:.|||
    Vl:.:.|:. Vl´「_ 、` ノ′ _ノ:ソ:イ: リ ノ
.      }:ハ: : l f7「::`ハ   /:::7}7イ:/}/
     ノヘーl、: :!VZツ     ヒ:ノ/:.// 
        `ィヘ:ト、 _   _   ノ:イ/  … "-" の印はマージを表す
      rく、\` ヽ二コ:千:|K、′   普通のコミットは "*" HEAD でないブランチの親は "+"
      |:..:ヽヽ\: :Yニ|: :!:/j!:.l    
      ト:..:..:.\ヽ\!r|┴=ミ!r ァ7 master^ というのは master の親コミットのこと
     |!::.:..:.ヽ\ヽ|!    /7 / 詳しくは git-rev-parse(1) を見て
      j::.l::..:..:.⌒ーァ⌒}   / / /^}
      |::.:.\::..::.::.::>ー'―-L∠_¨´
      l::.::.:..:. ̄ ̄ト 、, --、―弋i
       ヽ::.:..:..:.::..∧/    ヽ  i _ .. -―
       ``ーニ´/ー-、   | _|
       _. -―  ̄  ト―.:「:.:l
                 ヽ:..__:L_|
                ヽ.__)ノ


       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \  終わったかお?
  |    mj |ー'´      |  
  \  〈__ノ       /
    ノ  ノ



           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ 今度は mybranch で作業していたつもりになって…
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  mybranch が master にマージされたという変更を
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j      git-merge で mybranch に取り込む
          ヽム:.} ii;_j    ii;リ ル iレヽ.   
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |


       ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \     またコンフリクトしないか心配だお…
  |     (__人__)    |    
  \     ` ⌒´     /
$ git checkout mybranch
Switched to branch "mybranch"
$ git merge -m "Merge upstream changes." master
Updating 171aa01..ff47b11
Fast forward (no commit created; -m option ignored)
 example |    1 +
 hello   |    1 +
 2 files changed, 2 insertions(+), 0 deletions(-)
      ____
     /⌒  ⌒\
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \ なんだかすんなり行ったお!いつもこうならいいのにお!
  |     |r┬-|     |  けど Fast forward って何だお?
  \      `ー'´     /


           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ mybranch には master にマージされたもの以外入っていないから…
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }  実際には mybranch のトップを master のそれにしただけ
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j      これを fast foward merge と呼ぶ
          ヽム:.} ii;_j    ii;リ ル iレヽ.   
                `ヘ:ゝ   _     小/     
                  ヾ:{>、 _ ィ<}/|/     
           _, ィr'´ヽ{ ___`} ヽ、_   
         /| l:|   | ===|   |:l゙ヽ   
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |


     ____  
   /      \
  /  ─    ─\  
/    (●)  (●) \ 確かに .git/refs/heads/{master,mybranch} は内容が一緒になってるお…
|       (__人__)    |  くっついたり離れたり急がしい奴等だお
/     ∩ノ ⊃  /    
(  \ / _ノ |  |
.\ “  /__|  |  
  \ /___ /  


     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   
  |i │ l |リノ    `ヽ}_}ハ.  git-show-branch の結果はこんな風になってるよ!
  |i | 从 ●     ●l小N    master も mybranch も、マージコミットを共通の親として持ってるんだねっ!
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒) 
  | ヽ  ヽx>、 __, イl |::::ヽ/. 
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´
$ git show-branch master mybranch
! [master] Merge work in mybranch
 * [mybranch] Merge work in mybranch
--
-- [master] Merge work in mybranch
     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   
  |i │ l |リノ    `ヽ}_}ハ.  
  |i | 从 ●     ●l小N    次は他人の変更をマージする方法だよ!
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒) 
  | ヽ  ヽx>、 __, イl |::::ヽ/. 
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´

やる夫で学ぶ gitcore-tutorial/Merging external work