開発現場でGitを利用し、ソースの管理を行なっていました。
その際、「管理者からrebaseしてコミット履歴を綺麗にしてからプルリクエストしてくれ」という指示がありましたが。。。
とりあえずでrebaseコマンドを実施してしまっていたので、
理解したことをメモしておきます。
rebaseとは
rebaseとは。。。
gitのコマンドの一つであり、分岐したブランチを統合すること
統合だけでなくコミット履歴も修正することが可能
merge と rebase 比較
分岐したブランチを統合した際の違いを確認します。
(master、featureと2つのブランチを作成し、masterブランチへ統合します。)
■mergeの場合
新しいマージコミット履歴を作成し、統合されます。
複数の親コミットを持つというのが特徴です。(今回でいうと②と③)
※時系列としては上記の数字順にコミットしたとします。
コミット履歴としては「①→②→③→④」という時系列順に履歴が作成されます。
■rebaseの場合
親コミットが変更されます。(今回でいうと①から③)
親コミットが変更されるに伴いコミットが一直線になります。
最終的にmasterブランチに最新の情報を反映させるためには、rebaseしたfeatureブランチをmergeする必要があります。
この時のmergeは「Fast-forward」という種類になります。
rebaseしたおかげで履歴が一直線上となり、マージした際も統合ではなく最新のコミットを更新するだけとなります。
(③から②’)
実践
実際に分岐したブランチを一つのブランチへ統合してみます。
「merge」「rebase」どちらの場合でも実行し、比較します。
【mergeコマンドで統合】(コミットID等は省略しています)
①masterブランチのみ存在しcommit履歴が一つだけある状態にする。
$ git log --oneline
master first commit
②featureブランチを作成し、移動する
$ git checkout -b feature
③featureブランチにて変更を加えコミットする。
$ git add .
$ git commit -m "second commit"
④masterブランチに移動し、変更を加えてコミットする。
$ git checkout master
$ git add .
$ git commit -m "third commit"
⑤履歴の確認
「Atom」の「git-log」プラグインを用いて確認してみます
Atomを開き「command + shift + p (Macの場合)」でコマンドパレットを開き
「Git Log: Show」を入力すると、logを確認することができる。
ブランチが分岐され、それぞれにコミット履歴があることが確認できる。
⑥masterブランチにfeatureブランチでの変更分をmergeコマンドで取り込む
$ git merge feature
⑦履歴の確認
$ git log --oneline
Merge branch 'feature'
third commit
second commit
master first commit
【rebaseコマンドで統合】(コミットID等は省略しています)
mergeで実施した内容⑤まで同様の内容にしておきます。
⑥featureブランチにてrebaseコマンド実行
$ git rebase master
⑦履歴の確認
先ほどとは異なり、コミット履歴が一直線になりました。
さらに、変更分がfeatureブランチコミットした内容が最新のコミット履歴として反映されています。
⑧masterブランチに移動し、megeコマンド実行
⑦ではあくまでfeatureブランチの起点を変更したのに過ぎないため、masterブランチにも反映させます。
$ git checkout master
$ git merge feature
⑨履歴の確認
$ git log --oneline
second commit
third commit
master first commit
まとめ
コミットに履歴を綺麗にするという意味が以前よりはわかるようになりました。
「自分が作業したコミットを最新の履歴として取り込みたい」、「コミット履歴を綺麗に保ちたい」と行った場合にはrebaseを使うのが良さそうです。
参考文献
https://qiita.com/ganezasan/items/f7ca66f47bc8067988cf
https://qiita.com/KTakata/items/d33185fc0457c08654a5
https://git-scm.com/book/en/v2