目次
- 間違えてコミットしたので1つ前に戻したい
- 間違った名前のブランチを作成した
- 必要のないブランチを作成した
- 間違ったブランチをプッシュした
- プッシュしたらエラーが出てGitHubに反映されない
- GitHubに反映したくないコミットをプッシュした
- 間違ってaddした
- 間違ってコミットした
- 間違って新規ファイルを追加した
- 最新のコミットの状態に戻す
- git reset --hard ORIG_HEAD などで間違えて消した
- 2つ前のコミットメッセージが間違っていた
- コミットメッセージを間違えた
- コミットし忘れたファイルがあった
- コマンドラインに「>」が表示される
- ファイルを間違えて削除した
- 間違えて不要な管理外のファイルを含めた
- 1ファイルを間違えて削除してコミットした
- 間違えてマージした
- error: you need to resolve your current index first
- ブランチを間違えて削除した
- stashを間違えて削除した
- 間違えてコンフリクトマーカーを入れた
- コンフリクトした場合
- 間違えて特定のファイルの修正を別ブランチで行った
- fooさんが間違えてコミットした
- 予定数と違うファイルをaddした?
- commit識別番号の内容が不明の場合
- ログだけでは変更したファイルが不明の場合
- 特定のファイル名だけのログを見たい場合
- ログのコメントにfooが含まれているものだけ表示
- ORIG_HEADとHEAD^の違いについて
- Gitのバージョンを最新化する
- ファイルを除外する
- 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}
を実行すれば良い。
2つ前のコミットメッセージが間違っていた
c07eb76 foo 1539862 foo2 62b7c3c foo5 4f2c526 foo4
のようにfoo3と入れるところが間違えてfoo5となっていた場合は
git rebase -i 4f2c526~1
を実行して
pick 4f2c526 foo4 r 62b7c3c foo5 pick 1539862 foo2 pick c07eb76 foo
にして:wqで保存したあと
コミットメッセージのfoo5をfoo3に変更して:wqで保存すれば
ebbb16e foo 8cecadb foo2 b1609e3 foo3 4f2c526 foo4
のように修正したコミットメッセージにすることができる。
コミットメッセージを間違えた
git commit --amend
でメッセージを修正。
コミットし忘れたファイルがあった
git add .
で追加したあと
git commit --amend
で再度コミット。
コマンドラインに「>」が表示される
git commit "foo のようにダブルクォーテーション(")で正しく囲まずに実行した際に発生する。
Ctrl + C でキャンセル可能。
git commit "foo >
ファイルを間違えて削除した
git checkout 【削除したファイルパス】
間違えて不要な管理外のファイルを含めた
ファイルのみが削除対象の場合は下記で削除。
Gitのcleanは日本語ファイルだと対象ファイル以外のファイルも削除してしまうバグがあるため必ずgit clean -nで確認してから削除する。
git clean -n git clean -f
ファイルだけでなくディレクトリも削除する場合は
git clean -dn git clean -df
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のバージョンを最新化する
間違えて古いバージョンをインストールした場合は以下のコマンドで最新化する。(要Homebrew)
brew update && brew install git && exit
ファイルを除外する
コミットする必要がないファイルの場合は、必ず.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');