回答:
使用できます
git checkout -- file
--
(nimrodmで提案されているように)なしでも実行できますが、ファイル名がブランチやタグ(または他のリビジョンID)のように見える場合、混乱する可能性があるため、使用するの--
が最善です。
ファイルの特定のバージョンをチェックアウトすることもできます。
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 reset HEAD <filename> ; git checkout -- <filename>
HEAD^^
最新のコミットから2コミット、またはHEAD^^^
3コミット前に行うことができます。HEAD~2
またはHEAD~3
、を使用することもできます。これは、より多くのコミットを戻したい場合に便利ですが、HEAD^2
「このコミットの2番目の親」を意味します。マージコミットのため、コミットは前のコミットを複数持つことができるためHEAD^
、数値を指定するとそれらの親のどれが選択されるか、数値を指定するとHEAD~
常に最初の親が選択されますが、その数のコミットが戻ります。詳細についてはgit help rev-parse
、を参照してください。
使うだけ
git checkout filename
これにより、ファイル名が現在のブランチの最新バージョンに置き換えられます。
警告:変更は破棄されます—バックアップは保持されません。
git checkout x
、xがファイル名と同様にブランチ名である場合、デフォルトの動作が何であるかはわかりませんが、gitはブランチxに切り替えたいと思います。あなたが使用--
するとき、あなたは以下がファイル名であると言っています。
--
たようです。まだ正しいですが、@ hasenが指摘しているように、ファイル名とブランチ名のあいまいさがあると、非常に望ましくない動作が発生する可能性があります。
--
、素晴らしくて簡単です。ファイル名を使用してブランチに名前を付ける場合、どこかに悪い考えがあるはずです...
git checkout <commit> <filename>
drupal 6.10にアップグレードしたとき、私のファビコンが数回前のコミットで上書きされていることに気付いたので、今日使用したので、それを元に戻す必要がありました。これが私がしたことです:
git checkout 088ecd favicon.ico
git log --oneline <filename>
よりコンパクトなログが得られ、特定のファイルへの変更のみが含まれます
git reflog <filename>
ファイルが既にステージングされている場合(ファイルの編集後にgit addなどを実行した場合に発生します)、変更をステージング解除します。
使用する
git reset HEAD <file>
その後
git checkout <file>
まだ上演されていない場合は、
git checkout <file>
その1つのファイルに対する以前のコミットの変更を取り消すだけの場合は、次のように試すことができます。
git checkout branchname^ filename
これにより、前回のコミットの前と同じようにファイルがチェックアウトされます。もう少しコミットを取り戻したい場合は、branchname~n
表記法を使用してください。
branchname^
私はいつもこれに戸惑うので、ここにリマインダテストケースを示します。bash
テストするこのスクリプトがあるとしましょうgit
:
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
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
なりますが、変更は完全に上書きされます。
この回答は、同じまたは複数のフォルダー(またはディレクトリ)内の複数の特定のファイルにあるローカルの変更を元に戻すために必要なコマンド用です。これは、ユーザーが複数のファイルを持っているが、ユーザーがすべてのローカル変更を元に戻したくないという質問に具体的に回答します。
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-これらのサンプルフォルダー名はすべて、問題のファイルが存在する可能性のあるフォルダーまたはパッケージを示します。