参考にさせて頂いたページ
はじめに
公式ドキュメントからの引用ですが。
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
公開リポジトリにプッシュしたコミットをリベースしてはいけない
以下のページからの引用になります。
公開リポジトリにプッシュしたコミットをリベースしてはいけない
同じ編集内容にもかかわらず、C4
とC4'
の異なるコミットidが存在することになり、コンフリクトしたり混乱を招くことになる。ということについて書かれています。
rebaseに限らずコミットidが変化してしまうコマンドは、公開リポジトリにプッシュしたコミットに使用してはいけないということになります。
記事中でresetを使用していますが、resetも公開リポジトリにプッシュしたコミットに使用してはいけないということになります。