Seasons.NET

ちょっとした技術ブログです

git rebaseって超便利じゃね?

Gitでとても便利だと思っているのが、rebaseというコマンド。


ブランチを切った時点からオリジナルは刻一刻と変化していくわけで、
自分のブランチはあくまで現在最新のオリジナルに対するパッチである
必要がある場合は、このrebaseというコマンドを使って、オリジナル(HEAD)と
マージすると、最新のオリジナル(HEAD)に対して、ブランチを切ったことになります。


これチョー便利じゃね?

以下、git-rebaseから引用

git-rebase を使用して一連のパッチを最新に保つ

リモート追跡ブランチ "origin" の上にブランチ "mywork" を作成し、幾つかコミットを作成したとします:

$ git checkout -b mywork origin
$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...

mywork にマージをしていないので、変更は "origin" から単純に並行に行なわれています。

 o--o--o <-- origin
        \
         o--o--o <-- mywork

プロジェクトの上流では他の興味深い変更が行なわれ、 "origin" は発展します:

 o--o--O--o--o--o <-- origin
        \
         a--b--c <-- mywork

この時点で、"pull" を使用して変更をマージさせることができます;
結果として新しいマージコミットが生成されます、次のようにです:

 o--o--O--o--o--o <-- origin
        \        \
         a--b--c--m <-- mywork

しかし、自分の履歴をマージ操作の無い、単純な一連のコミットの状態で保ちたいのであれば、
その代わりに git-rebase(1) を使用すると良いでしょう。

$ git checkout mywork
$ git rebase origin

これは、mywork からあなたの各コミットを削除し、一時的に 
(".dotest" という名前のディレクトリ内に)パッチとして保存し、 
mywork を origin の最新バージョンの位置に更新し、その後で保存した各パッチを新しい 
mywork ブランチに適用します。結果は次のようになります:

 o--o--O--o--o--o <-- origin
                 \
                  a'--b'--c' <-- mywork

この作業中にコンフリクトが発生するかもしれません。
その場合はコンフリクトを解決してください;
コンフリクトを解消した後に "git add" を使用してそれらの内容で索引を更新し、 
git-commit を実行する代わりに、

$ git rebase --continue

を実行します。すると、残りのパッチを適用する作業が続けられます。

どの時点でも —abort オプションを使用すると、この作業を取り消し、 
rebase を開始する前の mywork の状態に戻ることができます:

$ git rebase --abort