nDiki

2010年11月19日 (金)

Git でローカルリポジトリの連続するコミットをまとめてから push したい時

分散型バージョン管理システムである Git では SubversionCVSVisual SourceSafe などと違って気軽にローカルリポジトリにコミットしていって、最終的に形になったところで公開/共用リポジトリに push するといったことができる。

こまめにローカルリポジトリにコミットしながら作業していくことで、いつでも後戻りしてやり直したり変更点を確認したりできる。ただちょっとした変更の連続によるたくさんのコミットを公開/共用リポジトリにそのまま push したくない。そういう場合は意味のある単位にコミットをまとめてから push したい。

Git では git-rebase でこれができる。

最新のコミット(HEAD)と1つ前のコミット(HEAD^ / HEAD~1)をひとつにまとめて HEAD~2 の次のコミットにしたい時

 A---B---C---D---E
         |   |   |
         |   |   HEAD
         |   HEAD^
         HEAD~2

最初に git rebase する。

  git rebase -i HEAD~2

すると

  pick <HEAD~1のハッシュ> <HEAD~1 のログ>
  pick <HEADのハッシュ> <HEAD のログ>

という行を含む内容でエディタが起動する。HEAD を HEAD~1 にまとめたいので 2番目の pick を squash に書き換えエディタを閉じる。

すぐにまた今度はコミットログ修正のためのエディタが開く。HEAD~1 のコミットログと HEAD のコミットログがあらかじめ含まれているので、それらを編集して2つ分の内容を反映したものに書き換えエディタを閉じる。

これで直近の2つのコミットがまとめられて新しい1つのコミットになる。

 A---B---C---F

ローカルでの試行錯誤をとりまとめて整理されたコミットになったのでここで push する。

  git push

なお squash を使えばできるというヒントは @tokuhirom 氏に教えていただきました。ありがとうございます。

スポンサード リンク
[ 11月19日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

follow us in feedly

月別インデックス
Process Time: 0.093297s / load averages: 0.59, 0.56, 0.61
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker