最後のコミットの後、私は自分の作業コピーでたくさんのファイルを修正しましたが、そのうちの1つのファイルに対する変更を元に戻して、最新のコミットと同じ状態にリセットしたいのです。
しかし、私はただ一つのファイルだけの作業コピーの変更を元に戻したいだけです。
それ、どうやったら出来るの?
あなたが使用することができます
git checkout -- file
--
を使わなくても(nimrodmが推奨するように)できますが、ファイル名がブランチやタグ(または他のリビジョン識別子)のように見える場合は混乱する可能性があるので、--
を使用するのが最善です。
ファイルの特定のバージョンをチェックアウトすることもできます。
git checkout v1.2.3 -- file # tag v1.2.3
git checkout stable -- file # stable branch
git checkout Origin/master -- file # upstream master
git checkout HEAD -- file # the version from the most recent commit
git checkout HEAD^ -- file # the version before the most recent commit
git checkout <commit> <filename>
Drupal 6.10にアップグレードしたときに私のfaviconが数コミット前に上書きされていたことに気づいたので、今日これを使いました。これが私がしたことです:
git checkout 088ecd favicon.ico
ただ使う
git checkout filename
これはfilenameを現在のブランチの最新バージョンに置き換えます。
警告:あなたの変更は破棄されます - バックアップは保存されません。
あなたのファイルが既にステージングされている場合(ファイルが編集された後にgit add等をした時に起こります)、あなたの変更をステージング解除します。
つかいます
git reset HEAD <file>
それから
git checkout <file>
まだ上演されていない場合は、単に使用してください
git checkout <file>
その1つのファイルに対する直前のコミットの変更を元に戻したいだけなら、これを試すことができます。
git checkout branchname^ filename
これは最後のコミットの前と同じようにファイルをチェックアウトします。さらにいくつかコミットを戻したい場合は、branchname~n
表記を使用してください。
私はいつもこれと混同されるので、ここにリマインダーテストケースがあります。 bash
をテストするこのgit
スクリプトがあるとします。
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email [email protected]
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt
この時点では、変更はキャッシュにステージングされていないため、git status
は次のとおりです。
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
この時点からgit checkout
を実行すると、結果は次のようになります。
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
代わりにgit reset
を実行すると、結果は次のようになります。
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
したがって、この場合-変更がステージングされていない場合、git reset
は違いを生じませんが、git checkout
は変更を上書きします。
さて、上記のスクリプトからの最後の変更がステージング/キャッシュされている、つまり最後にgit add b.txt
も実行したとしましょう。
この場合、この時点でのgit status
は次のとおりです。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
この時点からgit checkout
を実行すると、結果は次のようになります。
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
代わりにgit reset
を実行すると、結果は次のようになります。
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
したがって、この場合-変更がステージングされる場合、git reset
は基本的にステージングされた変更をステージングされていない変更に変更しますが、git checkout
は変更を完全に上書きします。
SHA idを使用してファイルを復元します、私がしていることはgit checkout <sha hash id> <file name>
です
この答えは、同じまたは複数のフォルダ(またはディレクトリ)内の複数の特定のファイルにあるローカルの変更を元に戻すために必要なコマンドです。 この回答は、ユーザーが複数のファイルを持っていても、ユーザーがすべてのローカルの変更を元に戻すことを望まないという問題に特に対処しています。
1つ以上のファイルがある場合は、それぞれの場所をスペースで区切ってスペースで区切って、の各ファイルに同じコマンド(
git checkout -- file
)を適用できます。
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
name1/name2/fileOne.ext nameA/subFolder/fileTwo.extの間のスペースに注意してください。
同じフォルダに複数のファイルがある場合
特定のディレクトリ内のすべてのファイルに対する変更を破棄する必要がある場合は、次のようにgitチェックアウトを使用してください。
git checkout -- name1/name2/*
上記のアスタリスクは、name1/name2の下にあるその場所にあるすべてのファイルを元に戻すためのトリックです。
そして同様に、以下は複数のフォルダのすべてのファイルの変更を元に戻すことができます。
git checkout -- name1/name2/* nameA/subFolder/*
上記ののname1/name2/* nameA/subFolder/*の間のスペースに注意してください。
注:name1、name2、nameA、subFolder - これらの例のフォルダー名はすべて、問題のファイルが存在する可能性があるフォルダーまたはパッケージを示します。
まだコミットしていない、または他の方法でコミットを共有していない場合
git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend
すでにコミットされている場合は、ファイルの変更を元に戻して再度コミットしてから、最後のコミットで新しいコミットを破棄することができます。