rcmdnk's blog

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

git rebase -iでコミットをまとめすぎてしまって元に戻って やり直したい、と思った時にどうやるか。

git reflogを使ってコミットを確認して戻す

こんなGitのコミットがあるとします。

$ git log --oneline
03cf5a4 (HEAD -> master) commit 10
84d8c6c commit 9
46bf42c commit 8
3d8d4f2 commit 7
cc1a120 commit 6
512dcb6 commit 5
a3b1556 commit 4
4cce44d commit 3
b3c25fc commit 2
dcc7245 commit 1
f40706d test commit

ここでcommit 7までのコミットをまとめたいとします。 rebaseでちょっと多めのコミットを見て

$ git rebase -i HEAD~5
pick cc1a120 commit 6
pick 3d8d4f2 commit 7
pick 46bf42c commit 8
pick 84d8c6c commit 9
pick 03cf5a4 commit 10

...

とかしてcommit 10とかをsquashに変更してまとめます。

$ git log --oneline
733e933 (HEAD -> master) commit 7, commit 8, commit 9, commit 10
cc1a120 commit 6
512dcb6 commit 5
a3b1556 commit 4
4cce44d commit 3
b3c25fc commit 2
dcc7245 commit 1
f40706d test commit

ここで、commit 7はまとめるべきではなかった、とかやっぱり別のコミットにした方がわかりやすい、 と考え直したとします。

git logを見ても以前の元のコミットは残ってませんが、 git reflogで各コミットの状態を見ることが出来ます。

$ git reflog
733e933 (HEAD -> master) HEAD@{0}: rebase -i (finish): returning to refs/heads/master
733e933 (HEAD -> master) HEAD@{1}: rebase -i (squash): commit 7, commit 8, commit 9, commit 10
335514b HEAD@{2}: rebase -i (squash): # This is a combination of 3 commits.
09986a1 HEAD@{3}: rebase -i (squash): # This is a combination of 2 commits.
3d8d4f2 HEAD@{4}: rebase -i (start): checkout HEAD~5
03cf5a4 HEAD@{5}: rebase -i (finish): returning to refs/heads/master
03cf5a4 HEAD@{6}: rebase -i: fast-forward
84d8c6c HEAD@{7}: rebase -i: fast-forward
46bf42c HEAD@{8}: rebase -i: fast-forward
3d8d4f2 HEAD@{9}: rebase -i (start): checkout HEAD~3
03cf5a4 HEAD@{10}: commit: commit 10
84d8c6c HEAD@{11}: commit: commit 9
46bf42c HEAD@{12}: commit: commit 8
3d8d4f2 HEAD@{13}: commit: commit 7
cc1a120 HEAD@{16}: commit: commit 6
512dcb6 HEAD@{17}: commit: commit 5
a3b1556 HEAD@{18}: commit: commit 4
4cce44d HEAD@{19}: commit: commit 3
b3c25fc HEAD@{20}: commit: commit 2
dcc7245 HEAD@{21}: commit: commit 1
f40706d HEAD@{22}: commit (initial): test commit

こんな感じで操作履歴が見れます。

ここでcommit 10の状態まで一度戻せばまた好きなようにコミットをまとめられるので、

$ git reset --hard 03cf5a4
HEAD is now at 03cf5a4 commit 10

これで

$ git log --oneline
03cf5a4 (HEAD -> master) commit 10
84d8c6c commit 9
46bf42c commit 8
3d8d4f2 commit 7
cc1a120 commit 6
512dcb6 commit 5
a3b1556 commit 4
4cce44d commit 3
b3c25fc commit 2
dcc7245 commit 1
f40706d test commit

元に戻りました。 ここからまたgit rebase -iとかで好きな様にまとめればOK。

reflogも見てみると

$ git reflog
03cf5a4 (HEAD -> master) HEAD@{0}: reset: moving to 03cf5a4
733e933 HEAD@{1}: rebase -i (finish): returning to refs/heads/master
733e933 HEAD@{2}: rebase -i (squash): commit 7, commit 8, commit 9, commit 10
335514b HEAD@{3}: rebase -i (squash): # This is a combination of 3 commits.
09986a1 HEAD@{4}: rebase -i (squash): # This is a combination of 2 commits.
3d8d4f2 HEAD@{5}: rebase -i (start): checkout HEAD~5
03cf5a4 (HEAD -> master) HEAD@{6}: rebase -i (finish): returning to refs/heads/master
03cf5a4 (HEAD -> master) HEAD@{7}: rebase -i: fast-forward
84d8c6c HEAD@{8}: rebase -i: fast-forward
46bf42c HEAD@{9}: rebase -i: fast-forward
3d8d4f2 HEAD@{10}: rebase -i (start): checkout HEAD~3
03cf5a4 (HEAD -> master) HEAD@{11}: commit: commit 10
84d8c6c HEAD@{12}: commit: commit 9
46bf42c HEAD@{13}: commit: commit 8
3d8d4f2 HEAD@{14}: commit: commit 7
cc1a120 HEAD@{15}: rebase -i (finish): returning to refs/heads/master
cc1a120 HEAD@{16}: rebase -i (start): checkout HEAD~3
cc1a120 HEAD@{17}: commit: commit 6
512dcb6 HEAD@{18}: commit: commit 5
a3b1556 HEAD@{19}: commit: commit 4
4cce44d HEAD@{20}: commit: commit 3
b3c25fc HEAD@{21}: commit: commit 2
dcc7245 HEAD@{22}: commit: commit 1
f40706d HEAD@{23}: commit (initial): test commit

こんな感じになっていて、commit 1003cf5a4に戻っていますが、 先程まとめた状態の733e933も残っていることがわかります。

やっぱりさっきので良いや、となったら同じ様にresetを使って戻ることが出来ます。

Sponsored Links
Sponsored Links

« Google Driveの100GB トライアルに申し込んでいた件 Slackでモバイルに必ず通知を送りたい(が、出来ない) »

}