🐷

Git コミットの編集・統合

2021/03/26に公開

コミットメッセージを編集

パターン1:直前のコミットメッセージの編集

$ git commit --amend

パターン2:N個前のコミットメッセージの編集

編集したい箇所の一つ前のコミットIDを指定して下さい。
編集したいコミットを「edit」に変更します(複数指定可)
この時点でコミットメッセージを編集しても反映されません。

※共用のリポジトリにプッシュ済のコミットは編集しないようにして下さい。

$ git rebase -i 448a955

pick be5fd83 cを追加 編集2
edit 0d495f1 eを追加
pick 75a78b3 fを追加
pick 236c73e gを追加 編集した
pick 8167971 hを追加 編集3
edit 04d26e3 iを追加

editを指定したコミットメッセージを編集

$ git commit --amend

git rebaseの確定(ある場合は次のコミットメッセージの編集を行う)
HEADが修正するコミットごとに動いていくイメージです。

git rebase --continue

コミットメッセージ編集時の注意

「#」を先頭につけるとコメントとして認識されてしまいます

Aborting commit due to empty commit message.

対策

  • 先頭にスペースを入れる
  • 先頭に文字列をいれる

https://qiita.com/ritukiii/items/371ca6fa9bf6d7551bcf

既にプッシュ済のコミットメッセージを編集

コミットメッセージをgit rebaseで編集した後に強制プッシュを行います。
(コミット履歴が変わる為通常のプッシュだと競合が発生しエラーになる)

git push -f origin master

コミットを統合する

https://dev-yakuza.posstree.com/git/git-squash/
https://www-creators.com/archives/2850
https://iwb.jp/git-commit-rebase-squash/
https://qiita.com/KTakata/items/d33185fc0457c08654a5

コミットメッセージの変更が必要ない場合

「cを追加」のコミットに「dを追加」のコミットを統合します。
コミットメッセージは編集できません。

git rebase -iで指定するコミットIDは、統合したいコミットの一つ前を指定して下さい。

$ git rebase -i 7676538

pick d0ae625 cを追加
fixup 73dc69a dを追加

コミットメッセージの変更が必要な場合

$ git rebase -i 7676538

pick d0ae625 cを追加
squash 73dc69a dを追加

git rebaseを中断する

$ git rebase --abort

git rebaseを戻す

git rebaseする前(HEAD@{6})に戻す
https://gist.github.com/naokazuterada/9e45a937f7574ebf91a7

$ git reflog
d38bae4 (HEAD -> master) HEAD@{0}: rebase (finish): returning to refs/heads/master
d38bae4 (HEAD -> master) HEAD@{1}: rebase (pick): iを追加
45d3440 HEAD@{2}: rebase (squash): gを追加
d4126a8 HEAD@{3}: rebase (pick): gを追加
4ae429b HEAD@{4}: rebase (squash): eを追加 squash
96dec9c HEAD@{5}: rebase (start): checkout ff417c7
1e5bf5a HEAD@{6}: commit: iを追加
6c8d4ab HEAD@{7}: commit: hを追加
6a2d1d9 HEAD@{8}: commit: gを追加
6449cb7 HEAD@{9}: commit: fを追加
96dec9c HEAD@{10}: commit: eを追加
ff417c7 HEAD@{11}: rebase (finish): returning to refs/heads/master
ff417c7 HEAD@{12}: rebase (fixup): cを追加
d0ae625 HEAD@{13}: rebase (start): checkout 7676538
73dc69a HEAD@{14}: rebase (abort): updating HEAD
7676538 HEAD@{15}: rebase (start): checkout 7676538
73dc69a HEAD@{16}: rebase (abort): updating HEAD
7676538 HEAD@{17}: rebase (start): checkout 7676538
73dc69a HEAD@{18}: commit: dを追加
d0ae625 HEAD@{19}: commit: cを追加
7676538 HEAD@{20}: commit: bを追加
448a955 HEAD@{21}: commit (initial): first commit

HEAD@{6}に戻りました

$ git reset --hard 'HEAD@{6}'
HEAD is now at 1e5bf5a iを追加

変更内容の取り込み

git rebaseでコミットメッセージを編集した場合、git pullして
リモートリポジトリの変更内容を取り込んで下さい。

git pull origin develop

コミットを戻す

指定のコミットIDまで戻す

$ git reset --hard b57f728279275daf911799dd0273999b0d77abff

指定のコミットIDまで戻す(変更内容をステージに残す)

$ git reset --soft b57f728279275daf911799dd0273999b0d77abff

別ブランチのコミットを移す

対象のコミットIDをメモしておく。(git logで確認)
移したいブランチにチェックアウトしたのち、下記コマンド実行するとコミットを移せます。

$ git cherry-pick b57f728279275daf911799dd0273999b0d77abff

https://qiita.com/Rock22/items/e53d6135c59099149592

特定のファイルだけ過去のコミットまで戻す

https://mementomori.info/gitコマンドで特定のファイルだけ過去のコミット/

Discussion