🎅

Gitの過去コミットを編集する方法

2024/11/15に公開

インターンやサークルでよく使用したりしてて、今回後輩に教えたからこれを機にZennまとめる。

まず、ローカルで該当ブランチに移動する

git checkout '該当のブランチ名'

移動したら、編集したいコミットのハッシュ値を取得するためにログを確認する

git log

または、

git log --oneline

これを実行すると以下のようなものがブワーって出てくる。

cece9d9 commit1
2bf772e commit2
e41d8c4 commit3
04fa1c3 commit4
6f92332 commit5
7ff83a6 commit6
257cfa9 commit7

この中から編集したいコミットのハッシュ値をメモしとく。

次に、インタラクティブリベースを起動する(ここではローカルの最新コミットから過去5件を取得している)

git rebase -i HEAD~5

そしたら下のようなのがコマンドライン上に出てくると思う

pick cece9d9 commit1
pick 2bf772e commit2
pick e41d8c4 commit3
pick 04fa1c3 commit4
pick 6f92332 commit5
pick 7ff83a6 commit6
pick 257cfa9 commit7

# Rebase 7f1934a..257cfa9 onto 7f1934a (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 [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# 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
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
#                       to this position in the new commits. The <ref> is
#                       updated at the end of the rebase
#
# 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.

ここで i キーを押してvimを編集モードに切り替える。

さっきメモったハッシュ値のコミットのpickのところを消して、editに書き換える。

editに変えられたら、キーボードの一番左上の esc キーを押して、:wq を入力してvimを閉じる。

こうすることで、該当コミットをコミットする前の状態に戻せる。

諸々編集できたら、ステージングをして、以下のコマンドを実行してコミットを上書き保存する。

git commit --amend

そしたら以下のコマンドを実行してリベースを終了する。

git rebase --continue

これで完了。

なお、githubにプッシュする際はフォースプッシュが必要ですので、ご注意ください。

Discussion