commit 書き換え

直前のコミットを修正する|サル先生のGit入門【プロジェクト管理ツールBacklog】

commit --amend

同じブランチの直前のコミットに対して、内容の追加・コメント修正
1. commit --amend|サル先生のGit入門【プロジェクト管理ツールBacklog】

コミットや HEAD の位置は先に進めず、ファイルの内容を変更したり、コメントを書き換えたりする際に使うイメージ

  • logコマンドで履歴を確認
% gl
* 82f0447 (HEAD -> master) addの説明を追加
* 8256887 first commit
  • 内容を修正してコミット
% vim sample.txt
% ga .
% g commit --amend # 直前のコミットのコミットメッセージがエディタで表示される

% gl
* f683207 (HEAD -> master) commit インデックスの状態を記録する # コミットの位置は先には進んでいない(ID は変わる)
* 8256887 first commit

revert

指定したコミットの内容を、打ち消すコミットを作り出す
2. revert|サル先生のGit入門【プロジェクト管理ツールBacklog】

既存のコミットを取り消すためのコマンド

  • 取り消したいコミットを打ち消すようなコミットを新しく作成する」という処理によって、既存のコミットを取り消す
  • 新しくコミットを追加しているだけなので、既存コミットの履歴が消えるわけではない(コミットログに残る)
  • どんな変更があったのかということが(revertしたということも含めて)残るので、リモートにpushされて公開されているコミットに対しても安全に使うことができる
  • revert は特定のコミットを元に戻すコマンド
  • 指定したコミット以降に行なわれた処理を全て戻すのではない

reset との違い

  • 「既存のコミットを元に戻す」という点について、同じような機能を持つコマンドに reset がある
    • resetコマンドは、「コミットを取り消した」というコミットが残らない
    • 特にリモートにpush済みで公開されているコミットに関して使うことは NG

【gitコマンド】いまさらのrevert - Qiita

  • ログとファイルを確認
% gl
* 05dc5b2 (HEAD -> master) pullの説明を追加
* 05191fc commitの説明を追加
* 82f0447 addの説明を追加
* 8256887 first commit

% c sample.txt
サル先生のGitコマンド
add 変更をインデックスに登録する
commit インデックスの状態を記録する
  • revert 実行
    • コメント編集用のエディタが立ち上がる
% g revert HEAD
[master 32d286d] Revert "pullの説明を追加"
 1 file changed, 1 insertion(+), 2 deletions(-)
  • ログとファイルを確認
    • ファイルの変更が反映される
    • revert したコミットが増える
    • revert する際に指定したコミットも消えずに残る
% c sample.txt
サル先生のGitコマンド
add 変更をインデックスに登録する

% gl
* 32d286d (HEAD -> master) Revert "pullの説明を追加"
* 05dc5b2 pullの説明を追加
* 05191fc commitの説明を追加
* 82f0447 addの説明を追加
* 8256887 first commit

reset

  • 要らなくなったコミットを捨てる
  • 以下の種類がある/主な利用シーン
    • mixed (デフォルト)変更したインデックスの状態を元に戻す
    • hard 最近のコミットを完全に無かったことにする
    • soft コミットだけを無かったことにする

3. reset|サル先生のGit入門【プロジェクト管理ツールBacklog】

  • ログとファイルを確認
% gl
* 05dc5b2 (HEAD -> master) pullの説明を追加
* 05191fc commitの説明を追加
* 82f0447 addの説明を追加
* 8256887 first commit

% c sample.txt
サル先生のGitコマンド
add 変更をインデックスに登録する
commit インデックスの状態を記録する
pull リモートリポジトリの内容を取得する
  • reset 実行
    • ブランチの先頭から二つ分のコミットを削除
% g reset --hard HEAD~2 # HEAD から 2 つ分
HEAD is now at 82f0447 addの説明を追加
  • ログとファイルを確認
% gl
* 82f0447 (HEAD -> master) addの説明を追加
* 8256887 first commit

% c sample.txt
サル先生のGitコマンド
add 変更をインデックスに登録する

cherry-pick

  • 別のブランチから指定したコミットを、現在のブランチに取り込む

【Git】cherry-pickで解決🍒 - Qiita

  • 例えば上図のような場面でブランチaにブランチbのコミットA,Bのみを取り込みたい場合
    • そのままマージすると、ブランチbの全てのコミットを取り込んでしまう
git checkout a
git merge b
  • cherry-pick を使えば、以下のようにしてブランチbの特定のコミットをブランチaに取り込むことができる
git checkout a
git cherry-pick Aのコミットid Bのコミットid

rebase -i

コミットの書き換え、入れ替え、削除、統合
5. rebase -i でコミットをまとめる|サル先生のGit入門【プロジェクト管理ツールBacklog】

コミットをまとめる

↑ が ↓ になる

  • まずはログを確認
% gl
* 05dc5b2 (HEAD -> master) pullの説明を追加
* 05191fc commitの説明を追加
* 82f0447 addの説明を追加
* 8256887 first commit
  • rebase -i 実行
% g rebase -i HEAD~2 # HEAD から 2 つ分
  • エディタが立ち上がる
pick 05191fc commitの説明を追加
pick 05dc5b2 pullの説明を追加

# Rebase 82f0447..05dc5b2 onto 82f0447 (2 commands)
#
# Commands:
  • 2つ目の picks に変更する
    • ssquash の略
pick 05191fc commitの説明を追加
s 05dc5b2 pullの説明を追加

# Rebase 82f0447..05dc5b2 onto 82f0447 (2 commands)
#
# Commands:
  • 続いて、コミットメッセージを編集するためのエディタが表示される
# This is a combination of 2 commits.
# This is the 1st commit message:

commitの説明を追加

# This is the commit message #2:

pullの説明を追加
  • 以下のようにコミットメッセージを変更
# This is a combination of 2 commits.
# This is the 1st commit message:

pull と commitの説明を追加
  • これで、二つのコミットが一つのコミットにまとめられた
  • ログを確認してみる
% gl
* 1b4a217 (HEAD -> master) pull と commitの説明を追加
* 82f0447 addの説明を追加
* 8256887 first commit

rebase に失敗した場合の取り消し

  • % grb -i HEAD~2 で、コミットを統合する際にエディタから squash を指定するが、古い方を squash すると、以下のエラーメッセージが表示される
    • error: cannot 'squash' without a previous commit
  • どうやら、最古のコミットからは squash できないよう
    • squash = 「押しつぶす; ぺちゃんこにする.」
  • つまり、新しいものから → 古いものの方向に圧縮するということ?
  • こうなった場合の問題点は、コミットがその前の状態に戻ってしまい、当然ローカルのファイルも古い内容に戻ってしまう
  • これを取り消して、rebase -i を実行する前の状態に戻るには以下を実行
% git rebase --abort # abort = 「中断する」

コミットを修正する

  • ログ確認
% gl
* 05dc5b2 (HEAD -> master) pullの説明を追加
* 05191fc commitの説明を追加
* 82f0447 addの説明を追加
* 8256887 first commit
  • rebase -i 実行
% g rebase -i HEAD~2
  • 次のような出力が表示されて、修正するコミットがチェックアウトされた状態になる
% g rebase -i HEAD~2
Stopped at 05191fc...  commitの説明を追加

% gl
* 05191fc (HEAD) commitの説明を追加
* 82f0447 addの説明を追加
* 8256887 first commit
pick 05191fc commitの説明を追加
pick 05dc5b2 pullの説明を追加

# Rebase 82f0447..05dc5b2 onto 82f0447 (2 commands)
  • 1行目のpickの文字を e に変更
    • e → edit
e 05191fc commitの説明を追加
pick 05dc5b2 pullの説明を追加

# Rebase 82f0447..05dc5b2 onto 82f0447 (2 commands)
% ga .
% g commit --amend 
  • コミットメッセージ編集のエディタが立ち上がるので適宜修正
% g rebase --continue 

squash

  • そのブランチのコミット全てをまとめたコミットを追加