3分でわかるGitで間違えてコミットや削除したときに使用するコマンド

3分でわかるGitで間違えてコミットや削除したときに使用するコマンド

目次

間違えてコミットしたので1つ前に戻したい

git reset ORIG_HEAD

すでにプッシュしていて他の人も同じブランチで作業している場合はrevertしてから再プッシュしたほうが良い。

git revert 【commit識別番号】

間違った名前のブランチを作成した

git branch -m 【正しいブランチ名】

でブランチ名を変更する。

必要のないブランチを作成した

git branch -D 【ブランチ名】

でブランチを削除。

間違ったブランチをプッシュした

git push origin :【削除するブランチ名】

のようにブランチ名の頭に:(コロン)を追加すればプッシュしたブランチを削除できる。

プッシュしたらエラーが出てGitHubに反映されない

プッシュした際にerror: failed to push some refs toが表示されたら最新の状態が作業用ブランチにプルされていないのでgit pullしてからpushする。

この際にコンフリクトが発生した場合は解消してからプッシュする。

GitHubに反映したくないコミットをプッシュした

git commit -m "add h3"

とコミットしたがGitHub上にはまだ反映したくなかったのだが間違えてpushしてしまいGitHubのCommitsに反映してしまい、これを取り消したい場合…

git reset --hard ORIG_HEAD
git push -f origin master

# 作業用ブランチのほうを戻す
git reflog --oneline
git reset --hard HEAD@{1}

ただしこのやり方はgit push -f で強制的にGitHubの内容を上書きしているので複数人でブランチを作業している場合は注意が必要。

間違ってaddした

git reset

で戻す。

間違ってコミットした

git reset --soft ORIG_HEAD

で戻す。

間違って新規ファイルを追加した

add前の場合

rm foo.txt

add後の場合

git reset foo.txt && rm foo.txt

コミット済みの場合

git rm foo.txt
git commit -m "delete foo.txt"

最新のコミットの状態に戻す

git reset --hard

git reset --hard ORIG_HEAD などで間違えて消した

git reset --hard ORIG_HEAD で消すとgit logから最新のコミットが消える。

そのため初心者の方だと戻せないと考えている方がたまにいるがgit reflogコマンドのほうには履歴が残っているため

git reflog --oneline

を実行すると下記のような履歴一覧が表示される。

aa84583 HEAD@{0}: reset: moving to ORIG_HEAD
a65764a HEAD@{1}: commit: title C
ab84583 HEAD@{2}: commit: title B
883c49c HEAD@{3}: commit: title A
13c826f HEAD@{4}: commit (initial): first

これにはresetの履歴も含まれており、この場合titleをBからCに変更したあとにgit reset --hard ORIG_HEADで
間違えてtitle B (HEAD@{2}) に戻してしまったため、title C (HEAD@{1})に戻すためには

git reset --hard HEAD@{1}

を実行すれば良い。

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

git commit --amend

でメッセージを修正。

コミットし忘れたファイルがあった

git add .

で追加したあと

git commit --amend

で再度コミット。

コマンドラインに「>」が表示される

git commit "foo のようにダブルクォーテーション(")で正しく囲まずに実行した際に発生する。

Ctrl + C でキャンセル可能。

git commit "foo
>

ファイルを間違えて削除した

git checkout 【削除したファイルパス】

1ファイルを間違えて削除してコミットした

例えば何回かコミットしたあとに過去に削除した1ファイルだけを戻して、関係のないファイルは戻したくないときは…

git log --onelineで以下のような経緯でn.pngを削除してしまい、これを戻したいときは以下のコマンドでファイルを戻したあとコミットする。

# a7267bdでn.pngを追加してa4ace15で削除して、
# その後31624c7のコミットがされている例
31624c7 add h2
a4ace15 delete n.png
adb362a h1 typo
a7267bd new image
b65763a h1 C
git checkout $(git rev-list -n 1 HEAD -- n.png)^ -- n.png
git commit -m "n.png 差し戻し"

間違えてマージした

マージ直後であれば

git reset --hard ORIG_HEAD

error: you need to resolve your current index first

インデックスの状態がコンフリクト状態だったため解決が必要。たいていは以下のコマンドで解決できる。

fatal: You have not concluded your merge. (MERGE_HEAD exists)が表示されたときも同様。

git reset --merge

ブランチを間違えて削除した

git reflog

で過去の作業を表示したら戻したいHEADの番号を指定して

git branch 【削除したブランチ名】 HEAD@{番号}

で戻す。

stashを間違えて削除した

git fsck

で削除したstashのcommit識別番号を探して

git cherry-pick -n -m1 【commit識別番号】

でインデックに適用後に

git stash

で再びstashに保存。

間違えてコンフリクトマーカーを入れた

コンフリクトマーカーとはコンフリクト時に含まれる<<<<<<< HEADのようなテキストのこと。

目視で発見した場合は手動で削除後、念のためほかに残っていないか下記のコマンドで調べる。

git diff --check

コンフリクトした場合

例えばfooをbarに修正してコミットしたが実は修正する必要がなく、さらに別の人がfooをbazに変更してプッシュしたものをプルすればコンフリクトとなる。

その際、以下のような状態となる。

<<<<<<< HEAD
<h1>bar</h1>
=======
<h1>baz</h1>
>>>>>>> ab8251f642ea97ea1262adec505b62d60986b8ac

この際、git checkout --theirsで相手の修正内容を適用できる。

git checkout --theirs
<!-- git checkout --theirs の結果 -->
<h1>baz</h1>

逆にgit checkout --oursで自分の修正内容を適用できる。

git checkout --ours
<!-- git checkout --ours の結果 -->
<h1>bar</h1>

間違えて特定のファイルの修正を別ブランチで行った

hogeブランチでfoo.txtを修正しようと思ったが間違えてfugaブランチのfoo.txtで行ってしまった場合はhogeブランチから

git cherry-pick 【commit識別番号】

で該当コミットをhogeブランチに取り込む。

ただし、fugaブランチでfoo.txt以外にもbar.txt, baz.txtを修正している場合はこれらを取り込んでしまう。

そのため、この場合はcheckoutを下記にように実行して修正したファイルだけを取り込むようにする。

git checkout fuga -- foo.txt

fooさんが間違えてコミットした

例えばfooさんという人がいて間違えてコミット不要なファイルをコミットした場合、どこでコミットを行ったか調べる必要がある。

調査のためには--author="foo"でfooさんのみのログを以下のように絞り込んで一覧を表示すると確認しやすい。

git log --oneline --graph --decorate --author="foo"

予定数と違うファイルをaddした?

ファイルをすべてaddした際に何ファイルaddされたか調べたい場合はgit diff --stat --cachedを実行する。

iwbjp$ git diff --stat --cached
img/s1.jpg | Bin 0 -> 9437184 bytes
img/s2.jpg | Bin 0 -> 10911744 bytes
img/s3.jpg | Bin 0 -> 11370496 bytes
3 files changed, 0 insertions(+), 0 deletions(-)

commit識別番号の内容が不明の場合

commit識別番号の内容が不明の場合は

git show 【commit識別番号】

で内容を確認する。

ログだけでは変更したファイルが不明の場合

git logだけでは変更されたファイル名は表示されない。

変更されたファイル名も表示したい場合は--name-statusを付ける。

git log --name-status

特定のファイル名だけのログを見たい場合

git log 【ファイル名】

ログのコメントにfooが含まれているものだけ表示

git log --grep="foo"

ORIG_HEADとHEAD^の違いについて

Macだと同じだがWindowsは^は特殊記号で""で囲まないと実行できないため最新の一つ手前のコミットを指定はORIG_HEADで統一してある。

git log --grep="foo"

ファイルを除外する

コミットする必要がないファイルの場合は、必ず.gitignoreか.git/info/excludeに除外ファイルを記載してコミットしないようにしたほうが良い。

Gitコマンドのハイフンが正しくないサイトがある

Gitコマンドを解説しているWordPressブログで--mergeなどが–mergeのようになっている場合がある。

これはWordPressではハイフンの--を–に自動変換するようになっているからである。

自動変換例
http://blogcdn.rutake.com/techmemo/2015/09/09/git-error-you-need-to-resolve-your-current-index-first%E3%81%AE%E8%A7%A3%E6%B1%BA%E7%AD%96/

iwb.jpではハイフンの自動変換取り消す設定を追加しているため正しく表示されている。

// functions.php
// ハイフンの自動変換取り消し
remove_filter('the_title', 'wptexturize');
remove_filter('the_content', 'wptexturize');
カテゴリーgit