はじめに
- この前、チーム内でgitの解説的な時間があり、その時に
git rebase -i
の使い方をライブプログラミング的に聞いた。今までよく分からなかったので、調べるのが面倒であまり使っていなかったのだが、この機会に色々触ってみたので、サンプルコマンドの結果をまとめたメモ- 解説は無し
- ★が事後コメント
- 利用の機会がありそうな reword, edit, squash, drop が対象
初期状態(準備)
- テキストファイルを適当に6個([a..f].txt)作成する
- それぞれのファイルの作成に対してcommitするがb,cのみコミットをまとめておく
% tig
16cc549 2019-05-26 15:39 kuredev o [master] add f.txt
3e55df3 2019-05-26 15:39 kuredev o add e.txt
16734b1 2019-05-26 15:38 kuredev o add d.txt
00f95df 2019-05-26 15:38 kuredev o add b.txt and c.txt
ae36142 2019-05-26 15:37 kuredev o add a.txt
reword
add a.txt
のコミットメッセージを修正する
% git rebase -i HEAD~5
1 reword ae36142 add a.txt ★rewordに修正
2 pick 00f95df add b.txt and c.txt
3 pick 16734b1 add d.txt
4 pick 3e55df3 add e.txt
5 pick 16cc549 add f.txt
:wq ★保存
1 add a.txt by git rebase -i ★修正
2
3 # Please enter the commit message for your changes. Lines starting
...(省略)
:wq ★保存
%tig
f749d8b 2019-05-26 15:39 kuredev o [master] add f.txt
bc1b2da 2019-05-26 15:39 kuredev o add e.txt
cb4bf08 2019-05-26 15:38 kuredev o add d.txt
1b3df3a 2019-05-26 15:38 kuredev o add b.txt and c.txt
d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i ★
修正された。
あと、それ以後のコミットIDがすべて更新された。
edit
コミットを分割してみる
事前に add b.txt and c.txt
が2つのファイルをまとめたコミットとしてあったので、これを2つのコミットに分けてみる
初期状態
%tig
f749d8b 2019-05-26 15:39 kuredev o [master] add f.txt
bc1b2da 2019-05-26 15:39 kuredev o add e.txt
cb4bf08 2019-05-26 15:38 kuredev o add d.txt
1b3df3a 2019-05-26 15:38 kuredev o add b.txt and c.txt ★これを分割してみる
d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i
rebase -i
% git rebase -i HEAD~5
1 pick d7cf3d2 add a.txt by git rebase -i
2 edit 1b3df3a add b.txt and c.txt ★
3 pick cb4bf08 add d.txt
4 pick bc1b2da add e.txt
5 pick f749d8b add f.txt
:wq ★保存
★この時点でログを見るとadd b.txt and c.txtのコミットまでで止まっている(という表現が正しいか不明)
% tig
1b3df3a 2019-05-26 15:38 kuredev o [HEAD] add b.txt and c.txt
d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i
★ファイルの実体もある
kure@ubuntu ~/test-repo % ls
a.txt b.txt c.txt
コミット再作成
★コミットを1つ取り消す
% git reset HEAD^
% tig
d7cf3d2 2019-05-26 15:37 kuredev o [HEAD] add a.txt by git rebase -i
★実体(ワーキングツリー)はある
kure@ubuntu ~/test-repo % ls
a.txt b.txt c.txt
★add/commitし直す
kure@ubuntu ~/test-repo % git add b.txt
kure@ubuntu ~/test-repo % git commit -m "b.txt"
[detached HEAD a59668d] b.txt
1 file changed, 2 insertions(+)
create mode 100644 b.txt
kure@ubuntu ~/test-repo % git add c.txt
kure@ubuntu ~/test-repo % git commit -m "c.txt"
[detached HEAD a3bc22b] c.txt
1 file changed, 2 insertions(+)
create mode 100644 c.txt
★ rebase
kure@ubuntu ~/test-repo % git rebase --continue
確認
★ 確認:コミットが別れた!
kure@ubuntu ~/test-repo % tig
7123fe0 2019-05-26 15:39 kuredev o [master] add f.txt
0cbbe5b 2019-05-26 15:39 kuredev o add e.txt
1ad7908 2019-05-26 15:38 kuredev o add d.txt
a3bc22b 2019-05-26 16:05 kuredev o c.txt
a59668d 2019-05-26 16:05 kuredev o b.txt
d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i
コミットの内容を書き換える
初期状態
kure@ubuntu ~/test-repo % tig
166a2f9 2019-05-26 15:39 kuredev o [master] add f.txt
cbe6fa0 2019-05-26 15:39 kuredev o add e.txt
29bed98 2019-05-26 15:38 kuredev o add d.txt
a3bc22b 2019-05-26 16:05 kuredev o c.txt
a59668d 2019-05-26 16:05 kuredev o b.txt ★このコミットの内容を書き換える
★Typoしてる
kure@ubuntu ~/test-repo % cat b.txt
crate
git rebase -i
kure@ubuntu ~/test-repo % git rebase -i d7cf3d2~1
1 pick d7cf3d2 add a.txt by git rebase -i
2 edit a59668d b.txt ★
3 pick a3bc22b c.txt
4 pick 29bed98 add d.txt
5 pick cbe6fa0 add e.txt
6 pick 166a2f9 add f.txt
kure@ubuntu ~/test-repo % vim b.txt
kure@ubuntu ~/test-repo % cat b.txt
create
kure@ubuntu ~/test-repo %
★add/commitし直す
kure@ubuntu ~/test-repo % git add b.txt
kure@ubuntu ~/test-repo % git commit --amend
[detached HEAD 6c86aaf] b.txt
Date: Sun May 26 16:05:05 2019 +0900
1 file changed, 2 insertions(+)
create mode 100644 b.txt
★rebase
kure@ubuntu ~/test-repo % git rebase --continue
確認
%tig
7f9a0bd 2019-05-26 15:39 kuredev o [master] add f.txt
1a2c3f5 2019-05-26 15:39 kuredev o add e.txt
7251eeb 2019-05-26 15:38 kuredev o add d.txt
da4ddb6 2019-05-26 16:05 kuredev o c.txt
6c86aaf 2019-05-26 16:05 kuredev o b.txt
kure@ubuntu ~/test-repo % git show 6c86aaf
b.txt
diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..0cbdfe6
--- /dev/null
+++ b/b.txt
@@ -0,0 +1,2 @@
+create ★
+
★内容書き換わった!
squash
- 指定したコミットを一つ前のコミットにまとめる
- b.txt と c.txt の作成のコミットを一つのコミットとしてみる
- c.txt に対して squashする
初期状態
★初期状態
kure@ubuntu ~/test-repo % tig
7f9a0bd 2019-05-26 15:39 kuredev o [master] add f.txt
1a2c3f5 2019-05-26 15:39 kuredev o add e.txt
7251eeb 2019-05-26 15:38 kuredev o add d.txt
da4ddb6 2019-05-26 16:05 kuredev o c.txt
6c86aaf 2019-05-26 16:05 kuredev o b.txt
rebase -i
★ rebase -i
kure@ubuntu ~/test-repo % git rebase -i HEAD~5
1 pick d7cf3d2 add a.txt by git rebase -i
2 pick 6c86aaf b.txt
3 s da4ddb6 c.txt ★ squash
4 pick 7251eeb add d.txt
5 pick 1a2c3f5 add e.txt
6 pick 7f9a0bd add f.txt
2 # This is the 1st commit message:
3
4 b.txt
5
6 # This is the commit message #2:
7
8 # c.txt ★コミットメッセージの編集:今回はコメントアウトする
確認
% tig
64d01fa 2019-05-26 15:39 kuredev o [master] add f.txt
e398f2e 2019-05-26 15:39 kuredev o add e.txt
b267e94 2019-05-26 15:38 kuredev o add d.txt
3cc9b19 2019-05-26 16:05 kuredev o b.txt
d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i
★c.txt が消えた。
★一つのコミットにまとめられてる。
kure@ubuntu ~/test-repo % git show 3cc9b19
commit 3cc9b190ad7a390e4473b7e2360dd8afcc4d3640
Author: kuredev <@gmail.com>
Date: Sun May 26 16:05:05 2019 +0900
b.txt
diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..0cbdfe6
--- /dev/null
+++ b/b.txt
@@ -0,0 +1,2 @@
+create
+
diff --git a/c.txt b/c.txt
new file mode 100644
index 0000000..0cbdfe6
--- /dev/null
+++ b/c.txt
@@ -0,0 +1,2 @@
+create
+
drop
初期状態
★初期状態 add e.txt のコミットを消す
kure@ubuntu ~/test-repo % tig
64d01fa 2019-05-26 15:39 kuredev o [master] add f.txt
e398f2e 2019-05-26 15:39 kuredev o add e.txt
b267e94 2019-05-26 15:38 kuredev o add d.txt
3cc9b19 2019-05-26 16:05 kuredev o b.txt
rebase -i
kure@ubuntu ~/test-repo % git rebase -i HEAD~4
Successfully rebased and updated refs/heads/master.
1 pick 3cc9b19 b.txt
2 pick b267e94 add d.txt
3 d e398f2e add e.txt ★
4 pick 64d01fa add f.txt
確認
★コミットが消えた。
kure@ubuntu ~/test-repo % tig
5059dfc 2019-05-26 15:39 kuredev o [master] add f.txt
b267e94 2019-05-26 15:38 kuredev o add d.txt
3cc9b19 2019-05-26 16:05 kuredev o b.txt
d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i
★ eもなくなった。
kure@ubuntu ~/test-repo % ls
a.txt b.txt c.txt d.txt f.txt
参考
gitのコミットの歴史を改変する(git rebase) 1 / 2 · けんごのお屋敷 http://tkengo.github.io/blog/2013/05/16/git-rebase-reference/
[git]特定のコミットの内容を修正する - dackdive's blog https://dackdive.hateblo.jp/entry/2014/09/21/122200