LoginSignup
9
5

More than 3 years have passed since last update.

git rebase -i のサンプル実行メモ(reword, edit, squash, drop)

Last updated at Posted at 2019-05-26

はじめに

  • この前、チーム内で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

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5