2020/11/01
はじめに
git はあまり使ったことがないので、また同じことをするためにメモを残す。 コードレビュー後に変更履歴をクリーンする作業
手順
master の pull
無事にマージされるためには、master の最新版にマージ可能な状態にする必要がある。(状況によって必要ない可能性位があります)
$ git fetch
$ git merge master
log の確認
まずは、どこまで遡るのか知らないといけない。普通にgit log
してもよいが、こちらのほうが見やすいのでおすすめ。
$ git log --pretty=onel d, drop <commit> = remove commite
この時点ではおそらく、以下のようになっているはず。
4444444444444444444444444444444444444444 (HEAD -> my_branch, origin/my_branch, master) fix memory leakage
3333333333333333333333333333333333333333 fix typo
2222222222222222222222222222222222222222 add my_feature
1111111111111111111111111111111111111111 (origin/master, origin/HEAD) Merge pull request #xxxx
0000000000000000000000000000000000000000 Merge pull request #xxxx
...
この履歴では、11111
に対して11111~44444
を22222
の名前でマージしてほしい。
その時、この状態でマージするとログが汚れてしまう。
ここで、33333
と44444
を22222
にまとめたい。
現在の変更がない確認
最新ログから変更があるとrebase
できない。まずはログが最新の状態になっているかどうか確認。
$ git status
rebase の開始
ここでついにrebase
をする。
この時、消したいログの一つ前(11111
)を選択するということに注意が必要。
$ git rebase -i 1111111111111111111111111111111111111111
開かれたファイルを確認
上記コマンドによって、以下のファイルが開かれる。
pick 2222222 add my_feature
pick 3333333 fix typo
pick 4444444 fix memory leakage
# Rebase 98c7b63..5e62af2 onto 89bd499 (7 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
ファイルに変更を加える
33333
,44444
を22222
にまとめるので、以下のようにし、保存。
pick 2222222 add my_feature
squash 3333333 fix typo
squash 4444444 fix memory leakage
コミットを変更
ここまで来ると、コミットログを変更する作業が必要になる。
# This is a combination of 3 commits.
# This is the 1st commit message:
add my_feature
...
プッシュ
$ git push --force-with-lease origin my_feature
nano を使わない方
私は俄然 Vim 派で、git rebase
で nano が開かれてしまったことが悲しかった。
nano は普段から使わないし、現状では使う予定がないので、消してしまった。
$ sudo apt purge nano
これで、git rebase
でのエディタが Vim になったので一件落着。