Edited at

Git困ったぞこれ集

著者の身の回りで起きた、Git利用で陥りがちな状況から立ち直るためのコマンド集。備忘録としてシチュエーション別でまとめます。


状況別


【コミット前】


ファイル変更を無かったことにしたい

全ファイルの変更を最後のコミット時点まで戻す。(要注意)

$ git reset --hard HEAD


  • 特定のファイルのみ最後のコミットまで戻す場合は以下を使用する。

  $ git checkout ファイル名


addだけを取り消したい

ファイルの変更はそのままに、Addだけ取り消したい場合。


  • HEADの位置、インデックスのみ最後のコミット位置に動かす(詳細後述)

  $ git reset HEAD

($ git reset --mixed HEADと同じ。)


  • 実行後、addして緑文字になったファイル群が再び赤文字になっていることを確認。


間違ってmasterで実装を始めてしまった。


  • 書きかけのコードはコミットせず、以下を実行する。

  $ git stash


  • stashリストに変更点が退避されるので、新規にブランチを作成、切り替えた後に以下を実行するとstashリストの変更が反映される。

  $ git stash apply


【コミット後】


コミットを取り消したい


  • ファイルの変更とAddはそのままに、コミットのみ取り消す。

  $ git reset --soft HEAD^


  • 最新のコミットを取り消し、Addも取り消す場合は以下。

  $ git reset HEAD^


コミットメッセージを間違えた。


  • 直前のメッセージを変更

  $ git commit --amend -m "{メッセージ}"


間違ってmasterで実装を始めてしまった。(コミット後)

ex)コミットは要らない、ファイルの変更点のみ欲しい。

ex)コミット履歴も新しいブランチに移動したい。



  • ブランチを作るべき位置からブランチを作成する


    • (コミット位置=「origin/master」にするとリモートの最新コミット位置を選択できる)



  $ git branch {新ブランチ名} {コミット位置(=origin/master)}


  • ブランチを移動し、移動したいコミット番号を調べる。

  $ git checkout {新ブランチ名}

$ git log --graph {旧ブランチ名(=master)}


  • 新ブランチに移動したいコミットをcherry-pickコマンドでコピーする。

  $ git cherry-pick {コミット番号}



  • 古いコミット番号から実行すること。


    • (masterから引っ越す場合)間違えたコミットを削除する。



  • 不要になったコミットをgit resetで削除する。


  $ git reset --hard HEAD~{削除するコミット数}


【その他】


ブランチのコミット履歴を全てリモートの状態にしたい

以下でリモートのコミットログをローカルに完全コピー可能。(≒git pull -f)


  1. 残したいファイルをバックアップ。


  2. リモートの最新を取得する


   $ git fetch origin {ブランチ名}


  1. ローカルをリモートに合わせる

   $ git reset --hard origin/{ブランチ名}



解説


git resetについて

Git resetではHEAD位置、インデックス、ワーキングツリーの3要素をリセットできる。


  • HEAD位置 ... 最新commitの位置

  • インデックス ... addされたファイルの一覧表

  • ワーキングツリー ... ファイルの変更差分

オプションでリセットする範囲を指定する。(デフォルト:--mixed)



  • git reset --soft : HEAD位置


    • 最新commitの位置のみリセットする。




  • git reset --mixed : HEAD位置 + インデックス(ステージング)



    • --soft に加えファイルのステージング(add)も取り消す。




  • git reset --hard : HEAD位置 + インデックス + ワーキングツリー



    • --mixed に加えファイルの変更もリセットする



どの時点までリセットするかはオプションの後で指定する。


  • HEAD ... 最新のコミット位置

  • HEAD^ ... 最新から1つ前のコミット位置

  • HEAD^^ ... 最新から2つ前のコミット位置

HEAD位置をずらしてコミットを取り消す場合、取り消されるのはローカルのみのため、リモートとのコミットの不整合に気を付ける。