チュートリアル1 ブランチを使ってみよう!

7. rebaseでマージする

issue3ブランチをマージするとき、issue3ブランチをあらかじめrebaseしていれば履歴を一本にすることもできました。

一旦、さきほどのマージを取り消します。

$ git reset --hard HEAD~

rebase前の履歴

issue3ブランチをチェックアウトしてから、masterに対してrebaseを実行します。

$ git checkout issue3
Switched to branch 'issue3'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: pullの説明を追加
Using index info to reconstruct a base tree...
<stdin>:13: new blank line at EOF.
+
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Failed to merge in the changes.
Patch failed at 0001 pullの説明を追加

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

mergeの時と同じように、myfile.txtで競合が発生するので修正しましょう。

サルでもわかるGitコマンド
add 変更をインデックスに登録する
<<<<<<< HEAD
commit インデックスの状態を記録する
=======
pull リモートリポジトリの内容を取得する
>>>>>>> issue3

rebaseの場合、競合箇所を修正した後はコミットではなく、rebaseコマンドに --continue オプションを指定して実行します。もし、rebase自体を取り消す場合は --abort オプションを指定します。

$ git add myfile.txt
$ git rebase --continue
Applying: pullの説明を追加

現時点での履歴

これで、masterブランチはissue3ブランチをfast-forwardマージできるようになりました。masterブランチをチェックアウトしてからマージを実行してみましょう。

$ git checkout master
Switched to branch 'master'
$ git merge issue3
Updating 8f7aa27..96a0ff0
Fast-forward
 myfile.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

myfile.txtの最終的な内容はmergeと同じですが、履歴はこのようになります。

現時点での履歴