web-dev-qa-db-ja.com

Gitで1つのファイルの作業コピーの変更を元に戻しますか?

最後のコミットの後、私は自分の作業コピーでたくさんのファイルを修正しましたが、そのうちの1つのファイルに対する変更を元に戻して、最新のコミットと同じ状態にリセットしたいのです。

しかし、私はただ一つのファイルだけの作業コピーの変更を元に戻したいだけです。

それ、どうやったら出来るの?

1451
hasen

あなたが使用することができます

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
1963
Brian Campbell
git checkout <commit> <filename>

Drupal 6.10にアップグレードしたときに私のfaviconが数コミット前に上書きされていたことに気づいたので、今日これを使いました。これが私がしたことです:

git checkout 088ecd favicon.ico
123
neoneye

ただ使う

git checkout filename

これはfilenameを現在のブランチの最新バージョンに置き換えます。

警告:あなたの変更は破棄されます - バックアップは保存されません。

115
nimrodm

あなたのファイルが既にステージングされている場合(ファイルが編集された後にgit add等をした時に起こります)、あなたの変更をステージング解除します。

つかいます 

git reset HEAD <file>

それから 

git checkout <file>

まだ上演されていない場合は、単に使用してください

git checkout <file>
62
thanikkal

その1つのファイルに対する直前のコミットの変更を元に戻したいだけなら、これを試すことができます。

git checkout branchname^ filename

これは最後のコミットの前と同じようにファイルをチェックアウトします。さらにいくつかコミットを戻したい場合は、branchname~n表記を使用してください。

16
sykora

私はgit bashを使ってやりました:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Gitステータス。 [1つのファイルが変更されたのを見た。]
  2. git checkout - index.html [私はindex.htmlファイルを変更しました:
  3. git status [[これらの変更は削除されました]

enter image description here

11
Shivanandam

私はいつもこれと混同されるので、ここにリマインダーテストケースがあります。 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は変更を完全に上書きします。

8
sdaau

SHA idを使用してファイルを復元します、私がしていることはgit checkout <sha hash id> <file name>です

5
Beto

この答えは、同じまたは複数のフォルダ(またはディレクトリ)内の複数の特定のファイルにあるローカルの変更を元に戻すために必要なコマンドです。 この回答は、ユーザーが複数のファイルを持っていても、ユーザーがすべてのローカルの変更を元に戻すことを望まないという問題に特に対処しています。 

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 - これらの例のフォルダー名はすべて、問題のファイルが存在する可能性があるフォルダーまたはパッケージを示します。

4
Nirmal

まだコミットしていない、または他の方法でコミットを共有していない場合

git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend
2
Jesse Glick

私にとってはこれだけがうまくいった

git checkout -p filename

enter image description here

1
Ramesh Bhupathi

理由はわかりませんが、コードを入力しようとすると、画像として表示されます。 

enter image description here

0
Gene

すでにコミットされている場合は、ファイルの変更を元に戻して再度コミットしてから、最後のコミットで新しいコミットを破棄することができます。

0
Gina