Hatena::Groupmotememo

やる夫で学ぶ gitcore-tutorial/Committing git state

やる夫で学ぶ gitcore-tutorial/Committing git state

           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j  コミットもさらに2段階の手順に分けられる
          ヽム:.} ii;_j    ii;リ ル iレヽ.   
                `ヘ:ゝ   _     小/    
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |
  1. tree オブジェクトを作成し、
  2. その tree を commit オブジェクトとしてコミットする
      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\ tree と commit はどう違うのかお?
. |   (__ノ ̄  | てか tree てなんだお?
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |


           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j  ファイルの内容を指す blob に対し
          ヽム:.} ii;_j    ii;リ ル iレヽ.   tree はディレクトリの内容を指す
                `ヘ:ゝ   _     小/     commit は tree に加えてコミットメッセージや時刻などの情報を含んでいる
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |

       ____
     /⌒  ⌒\
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \ 分かったような気がするお!
  |     |r┬-|     | はやく tree を作ってみるお!  
  \      `ー'´     /


           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j  インデックスの内容を tree オブジェクトとして作成するには
          ヽム:.} ii;_j    ii;リ ル iレヽ.   git-write-tree を使う
                `ヘ:ゝ   _     小/    
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |
$ git write-tree
8988da15d077d4829fc51d8544c097def6644dbb

     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   
  |i │ l |リノ    `ヽ}_}ハ.  
  |i | 从 ●     ●l小N   これが何か分かるかい?
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒)
  | ヽ  ヽx>、 __, イl |::::ヽ/.
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´


       ____
     / \  /\ キリッ
.   / (ー)  (ー)\  40桁のSHA1だから git のオブジェクトに違いないお!
  /   ⌒(__人__)⌒ \ きっと今作成された tree オブジェクトだお!!
  |      |r┬-|    |  git-cat-file してみるお!
   \     `ー'´   /  
  ノ            \
$ git cat-file -t 8988da
tree
             (ヽ三/) ))
         __  ( i)))
        /⌒  ⌒\ \
      /( ●)  (●)\ )  思った通りだおwww
    ./:::::: ⌒(__人__)⌒::::\  やる夫は天才だおwwww
    |    (⌒)|r┬-|     |  次はどうせ git cat-file tree すればいいんだお!!
    ,┌、-、!.~〈`ー´/   _/
    | | | |  __ヽ、   /
    レレ'、ノ‐´   ̄〉  |
    `ー---‐一' ̄
$ git cat-file tree 8988da
100644 example�Lt����2�k��R���b100644 helloU}�=��jJ��:�"[�8
       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\
  /    (__人__)   \ なんぞこれ!
  |   ヽ |!!il|!|!l| /   |
  \    |ェェェェ|     /


           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j  tree に対して git-cat-file しても有用なものは得られない
          ヽム:.} ii;_j    ii;リ ル iレヽ.   あなたは言われたことだけしてればいい
                `ヘ:ゝ   _     小/    
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |

       ____
     /      \
   /  _ノ  ヽ、_  \   悪かったお…
  /  o゚⌒   ⌒゚o  \   ちょっと有希ちゃんにカッコいいとこ見せたかっただけだお…
  |     (__人__)    |
  \     ` ⌒´     /


           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j  commit オブジェクトを作るには git-commit-tree を使う
          ヽム:.} ii;_j    ii;リ ル iレヽ.   これは標準入力からコミットメッセージを受け取る
                `ヘ:ゝ   _     小/     そして git-write-tree と同様に commit オブジェクトのSHA1を出力する
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |
$ tree=$(git write-tree)
$ commit=$(echo 'Initial commit' | git commit-tree $tree)
$ git update-ref HEAD $commit|
      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\ git-update-ref ってなんだお?
. |   (__ノ ̄  | 
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |


           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j HEAD が差すファイル .git/refs/heads/master は
          ヽム:.} ii;_j    ii;リ ル iレヽ.   master ブランチの最新コミットへの参照になっている
                `ヘ:ゝ   _     小/     git-update-ref で今作成した commit オブジェクトを格納させる
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |


     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   
  |i │ l |リノ    `ヽ}_}ハ.  .git/refs/heads/master ってファイルができてるはずだよっ
  |i | 从 ●     ●l小N   この中身は $commit と同じになってるはずさっ
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ    
  | i⌒ヽ j  (_.ノ   ノi|__/⌒)
  | ヽ  ヽx>、 __, イl |::::ヽ/.
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´


           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j  ちなみに普通のコミットは親コミットを持つ
          ヽム:.} ii;_j    ii;リ ル iレヽ.    これは最初のコミットだったから要らなかったけど  
                `ヘ:ゝ   _     小/     以降は git-commit-tree には親コミットのSHA1を渡す必要がある
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |


       ____
     /      \
   /  _ノ  ヽ、_  \  手順多すぎだお…
  /  o゚⌒   ⌒゚o  \  やる夫はゆとり世代なんだからもっと配慮してほしいお…
  |     (__人__)    |
  \     ` ⌒´     /



           /.:.:.         \
              /:,:.:.:  /   ヽ    \
          /.:.l:.:.:/:/   :/  ', :l   ヾ`ー
            /!:.:.|:.: l/  〃 / j } :|    ハ
        /イ:.:.i|:.:.jL∠/_/ | /l.ム_/| l  l }
         N:.ハ:.:.:lィfアト/ レ ィ=ト | /| ∧j  …大丈夫
          ヽム:.} ii;_j    ii;リ ル iレヽ.    今の3つのコマンドを行う git-commit というスクリプトがある
                `ヘ:ゝ   _     小/     普通これを使う
                  ヾ:{>、 _ ィ<}/|/       
           _, ィr'´ヽ{ ___`} ヽ、_
         /| l:|   | ===|   |:l゙ヽ
          /  | l:l   l     l   l::l l
           l  ヽハ    l    l  //  |

       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\  またかお!
  /    (__人__)   \ なら最初からそれを教えてほしかったお!!
  |   ヽ |!!il|!|!l| /   |
  \    |ェェェェ|     /



     , '´ ̄ ̄` ー-、     
   /   〃" `ヽ、 \    
  / /  ハ/     \ハヘ   
  |i │ l |リノ    `ヽ}_}ハ.  ようやくコミットまで辿りつけたねっ
  |i | 从 ●     ●l小N   ちなみに言われた通りにやってれば
  |i (| ⊂⊃ 、_,、_, ⊂li|ノ     commit 以外のオブジェクトのSHA1はこのチュートリアルとまったく同じになってるはずだよっ
  | i⌒ヽ j  (_.ノ   ノi|__/⌒)  commit には時刻やコミッタの情報が含まれてるから環境によって違うんだねっ
  | ヽ  ヽx>、 __, イl |::::ヽ/.
  | ∧__,ヘ}::ヘ三|:::::/l| |',:::::ハ  
  | ヾ_:::ッリ :::∨:/ | | >'''´

やる夫で学ぶ gitcore-tutorial/Making a change