Motomichi Works Blog

モトミチワークスブログです。その日学習したことについて書いている日記みたいなものです。

gitその0001-04 git rebase入門 ブランチを統合する

参考にさせて頂いたページ

Git - リベース

はじめに

公式ドキュメントからの引用ですが。

Git には、あるブランチの変更を別のブランチに統合するための方法が大きく分けて二つあります。merge と rebase です。

ということで、mergeとrebaseについて少しやってみようと思います。

vimの操作方法についてはこのページでは細かくは触れません。

gitのコミットidはご自身の環境として読み替えてください。

準備

以前の記事「gitその0001-01 git rebase入門 indexと準備 - Motomichi Works Blog」のとおりrebase_tutorialリポジトリを準備して、masterブランチとhogeブランチを作成しましたので、それを使います。

mergeコマンドでの統合をやってみる

記事タイトルがrebase入門ですが、まずmergeコマンドからやってみます。

hogeブランチのログを表示してみる

以下のコマンドを実行して、hogeブランチのログを表示してみます。

git checkout hoge
git log --oneline

以下のように表示されました。

3d16339 6行目を追加
e3e9b30 5行目を追加
356d95e 4行目を追加
97029ec 3行目を追加
407e6f9 2行目を追加
30596dc 1行目を追加
d5d7400 Initial commit

masterブランチのログを表示してみる

作業ブランチをmasterに切り替えて、masterブランチのログを表示してみます。

git checkout master
git log --oneline

以下のように表示されました。

1a35929 sample_2.txt 1行目を追加
97029ec 3行目を追加
407e6f9 2行目を追加
30596dc 1行目を追加
d5d7400 Initial commit

mergeコマンドで統合してみる

現在の作業ブランチがmasterの状態で、以下のように統合したいブランチを指定します。

git merge hoge

以下のように表示されます。
マージコミットのメッセージ編集ができますが、このままにしておきます。

Merge branch 'hoge'

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.

このまま:wqします。 以下のように表示されました。

Merge made by the 'recursive' strategy.
 sample.txt | 3 +++
 1 file changed, 3 insertions(+)

統合されたログを確認してみます。

git log --oneline

以下のように表示されました。

c501ee7 Merge branch 'hoge'
1a35929 sample_2.txt 1行目を追加
3d16339 6行目を追加
e3e9b30 5行目を追加
356d95e 4行目を追加
97029ec 3行目を追加
407e6f9 2行目を追加
30596dc 1行目を追加
d5d7400 Initial commit

コミットを実行した日時の順に統合されて、それぞれのコミットidに変化が無いことがわかります。
また、マージコミットが新たに追加されたことがわかります。

ブランチ一覧を確認してみます。

git branch 

以下のように表示されました。

  hoge
* master

統合前の状態に戻す

rebaseコマンドによる統合をしたいので、mergeコマンドを実行する前の状態に戻します。

以下のコマンドで、git操作履歴を表示します。

git reflog

以下のように表示されました。

c501ee7 HEAD@{0}: merge hoge: Merge made by the 'recursive' strategy.
1a35929 HEAD@{1}: checkout: moving from hoge to master
3d16339 HEAD@{2}: checkout: moving from master to hoge

~以下略~

ブランチ統合直前の状態にもどしたいので、以下のコマンドを実行して、HEAD@{1}に戻します。

git reset --hard HEAD@{1}

以下のコマンドを実行して、masterブランチのログを確認してみます。

git log --oneline

以下のように表示されました。

1a35929 sample_2.txt 1行目を追加
97029ec 3行目を追加
407e6f9 2行目を追加
30596dc 1行目を追加
d5d7400 Initial commit

masterブランチが統合前の状態に戻ったことが確認できました。

rebaseコマンドでの統合をやってみる

rebaseコマンドでの統合をやってみます。

hogeブランチのログを表示してみる

以下のコマンドを実行して、hogeブランチのログを表示してみます。

git checkout hoge
git log --oneline

以下のように表示されました。

3d16339 6行目を追加
e3e9b30 5行目を追加
356d95e 4行目を追加
97029ec 3行目を追加
407e6f9 2行目を追加
30596dc 1行目を追加
d5d7400 Initial commit

rebaseコマンドで統合してみる

現在の作業ブランチがhogeの状態で、以下のように統合したいブランチを指定します。
mergeコマンドを実行するときとは逆です。

git rebase master

以下のように表示されます。
rebaseの場合は統合コミットは作成されず以下のように表示されます。

First, rewinding head to replay your work on top of it...
Applying: 4行目を追加
Applying: 5行目を追加
Applying: 6行目を追加

hogeブランチのコミットログを表示してみます。

git log --oneline

以下のように表示されました。

d97b9dd 6行目を追加
cb0d079 5行目を追加
35f9c3b 4行目を追加
1a35929 sample_2.txt 1行目を追加
97029ec 3行目を追加
407e6f9 2行目を追加
30596dc 1行目を追加
d5d7400 Initial commit

masterブランチでコミットされていた以下のコミットに、hogeブランチでコミットされた4~6行目の変更が適用されたのがわかります。
このときmergeと違うのは、4~6行目のコミットidが変化していて、masterの後ろに履歴が追加される点です。

masterブランチで行った変更と、hogeブランチで行った変更とが交互に並んだりすることなく、ブランチ毎の作業のまとまりが見やすくなったりします。

ブランチ一覧を確認してみます。

git branch 

以下のように表示されました。

* hoge
  master

公開リポジトリにプッシュしたコミットをリベースしてはいけない

以下のページからの引用になります。

公開リポジトリにプッシュしたコミットをリベースしてはいけない

Git - リベース

同じ編集内容にもかかわらず、C4C4'の異なるコミットidが存在することになり、コンフリクトしたり混乱を招くことになる。ということについて書かれています。

rebaseに限らずコミットidが変化してしまうコマンドは、公開リポジトリにプッシュしたコミットに使用してはいけないということになります。

記事中でresetを使用していますが、resetも公開リポジトリにプッシュしたコミットに使用してはいけないということになります。