記事を書くきっかけ
ゴールデンウイークにgitのハンズオン勉強会に参加していました。
https://oss.connpass.com/event/129794
今は7月の終わりです。三ヶ月弱経ってから当時の資料を見直すと、もう何をやっていたのか思い出せません…。
そこで、記憶に定着させるために自分自身で記事を書いてみたいと思います。
適宜、勉強会で使用されたスライドを確認します。
https://kslides.page.link/2019-05-01_GitLv3
環境
MacBook Air (13-inch, 2017)
macOS Mojave 10.14.6
git version 2.21.0
Sourcetree Version 3.1.2(216) ※コミットログの確認に使用します
準備
以下のコマンドを実行し、コミットを作成しておきます。
REPOS_NAME=repos35
cd
rm -rf $REPOS_NAME
mkdir $REPOS_NAME
cd $REPOS_NAME
git init
echo 1 > 1.txt && git add . && git commit -m "1"
echo 2 > 2.txt && git add . && git commit -m "2"
echo 3 > 3.txt && git add . && git commit -m "3"
echo 4 > 4.txt && git add . && git commit -m "4"
git checkout -b BranchX HEAD~~
echo A > A.txt && git add . && git commit -m "A"
echo B > B.txt && git add . && git commit -m "B"
git log --graph --all --oneline
作成後のコミットツリーをSourceTreeで確認すると、次のようになります。
masterブランチの 2.txt が追加されたコミット。画像だと「e830b49」のコミットを起点とし、
masterブランチでは、「f27dd54」「01d1a9a」のコミットが、
BranchXブランチでは、「45f4255」「ea5e56c」のコミットが追加されています。
この準備作業は何度も行うので、コミットIDはそのたびに変わります。
以降では、コミットの説明にある、1, 2, 3, 4, A, Bで、コミットの識別をします。
git rebase
git rebase -i からできる操作をいくつか確認します。
コミットの削除
準備
現在はBranchXのHEAD(コミットBの後ろ)にいます。
この状態からコミットAを削除するために、git rabase を使用します。
git rebaseには -i オプションをつけます。git rebase -i のあとに、コミット2のIDを指定します。
余談ですが、rabaseは「土台」という意味で、特定のコミットを土台にして作業することを意味するようです。
コミット2のIDを指定するのは、「コミット2を土台としてコミットを編集する」ことですね。
-i オプションは「--interactive」の略で、interactiveは「対話的」を意味します。
まとめると、「コミット2を土台としてコミットを編集する」を「対話的」に行う。ということでしょうか。
さて、本題に戻ります。
git rebase -i にコミット2のIDを指定します。コマンドにすると次のようになります。
git rebase -i e830b49
実行すると自動的にviが起動し次のような画面になります。
この状態で1, 2行目の編集を行い、保存することでコミットの編集が可能になります。
コミットAを削除するために、1行目を削除し、保存します。
ここまで操作したら、SourceTreeでコミットツリーを確認します。
コミットAが消えました。
作業コピーを確認すると、コミットAで追加したA.txtも削除されています。
コミットの順序入れ替え
コミットAとコミットBを入れ替えます。
git rebase -i にコミット2のIDを指定します。
git rebase -i 2986ff9
viが起動します。
コミットAとコミットBを入れ替えます。
viでの操作としては、コミットAの行で
dd
を入力し切り取り、
コミットBの行で
p
を入力し貼り付けます。
保存し、SourceTreeのコミットツリーを確認すると、コミットAとコミットBの順序が入れ替わっています。
コミットメッセージの変更
準備
過去のコミットメッセージを変更します。
git rebase -i にコミット2のIDを指定します。
git rebase -i 11d2af2
viが起動します。
コミットAのコミットメッセージを変更するために、コミットAの「pick」を「reword」に書き換え、保存します。
rewordは「書き換え」という意味です。
保存後にviを終了すると、コミットAのコミットメッセージ変更のために再度viが開かれます。
コミットメッセージを変更し保存します。
SourceTreeで確認すると、コミットAのコミットメッセージが変更されていることが確認できました。
コミット統合
準備
コミットAとコミットBを一つにまとめます。
git rebase -i にコミット2のIDを指定します。
git rebase -i 9783485
viが起動します。
コミットBの「pick」を「squash」に変更します。
squashは押しつぶすといった意味で、この指示によりコミットBで行った変更は、一つ前のコミットであるコミットAと一つにまとまります。
保存しviを終了すると、一つにまとめるコミットメッセージを編集するために再度viが起動します。
コミットBのコミットメッセージを削除し、コミットAのコミットメッセージを変更してみました。
SourceTreeで確認すると、コミットAとコミットBが一つになったコミットが作成されています。
変更内容にはコミットAとコミットBの両方の変更内容が含まれています。
分岐元の変更
準備
いまBranchXはコミット2を分岐元としています。
これを、コミット4が分岐元となるように、分岐元のコミットを変更します。
git rebase masterを実行します。
git rebase master
SourceTreeで確認すると、BranchXの分岐元がコミット2からコミット4に変更されています。
この、「git rebase master」は、
ブランチを切ったあとにmasterブランチが更新された場合に使用されることが多いそうです。
コミットログが見やすくなりますし、マージの回数をへらすことが出来ます。