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}

を実行すれば良い。

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');
カテゎリヌgit