単一ファイルのハードリセット


1006

現在、作業ディレクトリに3つの変更されたファイルがあります。ただし、そのうちの1つをHEADステータスにリセットする必要があります。

SVNではsvn revert <filename>svn update <filename>必要に応じてその後に)を使用しgit reset --hardますが、Gitではを使用する必要があります。ただし、このコマンドは単一のファイルを操作することはできません。

Gitで単一ファイルへの変更を破棄し、新しいHEADコピーで上書きする方法はありますか?


3
git checkout以下がその答えです。gitでは、「元に戻す」はコミットに対して行うことです。「元に戻す」は、履歴コミットの逆を作業ディレクトリに再生するため、元に戻したコミットを「取り消す」新しいコミットを作成できます。これはsvnからgitに来る人々にとって頻繁に混乱するポイントです。
ダン・レイ


パスでハードリセットを実行できない理由に興味がある場合は、そこにある私の答えを確認してください。
ユーザー

この質問は、ハードリセットとは何かを知っていることを前提としています。

回答:


1810

次のコマンドを使用できます。

git checkout HEAD -- my-file.txt

...の作業コピーmy-file.txtとその状態の両方をHEADからの更新で更新します。

--基本的に、この時点以降のすべての引数をファイル名として扱いますこの回答の詳細。これを指摘してくれたVonCに感謝します。


58
より完全な答え。+1;)のために' - 'も参照stackoverflow.com/questions/6561142/...、より一般的には、(及びstackoverflow.com/questions/1192180/...を
VonC

8
また、前のコミットを参照しHEAD~1て最後から2番目のコミットを示すことができることを忘れないでください。
Ryanmt 2015

14
あなたは省くことができますHEAD参照-あなたは現在のブランチの先頭にある場合norbauer.com/rails-consulting/notes/...
CXW

4
任意の理由を洞察resetコマンドは(それが言うように)「パスでハードリセットを行うことができない」、そして、なぜcheckoutコマンドは、ハードリセットセット全体に使用(することはできません?)ではないのですか?(つまり、なぜそのように設計されているのかということです。)
Sz。

1
@cxw残念ながら、これはまったく当てはまりません。git checkout「作業ツリーのパスを、インデックスまたは<tree-ish>の内容で置き換えることによって上書きします」のマニュアルページから。つまり<tree-ish>、省略した場合、インデックス内のコンテンツは作業ツリーの更新に使用されます。これはHEADと異なる場合と異なる場合があります。
2017

137

頭にリセット:

1つのファイルをHEADにハードリセットするには:

git checkout @ -- myfile.ext

はの@略ですHEAD。古いバージョンのgitは短い形式をサポートしない場合があります。

インデックスにリセット:

インデックスが空でないと仮定して、単一のファイルをインデックスにハードリセットするには、それ以外の場合はHEADに設定します。

git checkout -- myfile.ext

ポイントは、安全のために、ということであるあなたが出たままにしたくない@か、HEADあなたは、具体的インデックスにリセットすることを意味しない限り、コマンドからのみ。


1
myfile.extの前の「-」はどうなっていますか?
ランスの種類

3
@LanceKind私が理解しているように、これはそれに続くファイル名のリストを区別するために使用されます。これがないと、gitが引数を誤って解釈する場合があります。
Acumenus 2017

2
ファイル名だけではありません。広く使用されている規則では、多くのユーティリティでオプションと位置引数を分けています。man bashページを参照してください。この回答でも言及:unix.stackexchange.com/a/187548/142855
boweeb

1
従来、は--プログラムを通知するために使用されますI've finished specifying "options", and from here on, everything will be a positional argument.。従来、「オプション」はのようなトークン--recursiveで、任意の順序で表示したり、のように短い形式で組み合わせることができrm -rfます。反対に、「位置引数」は、プログラミング言語の関数に渡される引数に非常によく似ています。トークンのリストでの位置は、プログラムがそれらをどのように処理するかを正確に定義します(これらはしばしばファイル名です)。--どちらがどちらであるかに関する曖昧さを取り除きます。
iono

42

アップストリーム/マスターに戻すには:

git checkout upstream/master -- myfile.txt

19

Git 2.23(2019年8月)以降、以下を使用できますrestore詳細):

git restore pathTo/MyFile

上記は現在のブランチの(最後のコミット)で復元さMyFileHEADます。

他のコミットから変更を取得したい場合は、コミット履歴をさかのぼることができます。以下のコマンドはMyFile、最後のコミットの前に2つのコミットを取得します。-s--source)オプションが必要になったのは、ソースを復元するときに(デフォルト)master~2ではなく、現在使用masterしているためです。

git restore -s master~2 pathTo/MyFile

他のブランチからファイルを取得することもできます!

git restore -s my-feature-branch pathTo/MyFile

1
これまでで最も簡単な方法。残念ながら、この答えは十分な注目を集めていません。
singrium


4

以下のコマンドを使用して単一ファイルをリセットできます

git checkout HEAD -- path_to_file/file_name

path_to_file/filename以下のコマンドで取得するために変更されたすべてのファイルをリストします

git status

1

次のコマンドを使用できます。

git reset -- my-file.txt

my-file.txt追加するとの両方の作業コピーが更新されます。


要求に応じて、変更されたファイルの内容を変更しません。
Rafael

stashに追加したときファイルを編集しましたか?
ADDYQU

1
それは特に@ADDQUのポイントではありません。問題は、ファイルを「ハードリセット」する方法であり、ステージングされたリストから削除しないことです。
Rafael

@ラファエルあなたは正しいですが、私にも方法があることを知らせたいと思います。
ADDYQU

0

次のコマンドを使用できます。

git checkout filename

同じファイル名のブランチがある場合は、次のコマンドを使用する必要があります。

git checkout -- filename

1
これはファイルを「ハードリセット」しません-インデックスの状態を作業ツリーにコピーするだけです。「ハードリセット」は、最初にインデックスをリセットします。
AH

-21

特にgitにあまり慣れていない場合は、お湯からあなたを救うためのシンプルで簡単な実践的な方法:

  1. ファイルのログを表示する

    git log myFile.js

    コミット1023057173029091u23f01w276931f7f42595f84f作成者:kmiklas日付:2018年8月7日火曜日09:29:34 -0400

    JIRA-12345-新しいアーキテクチャでリファクタリング。

  2. ファイルのハッシュに注意:

    1023057173029091u23f01w276931f7f42595f84f

  3. ハッシュを使用してファイルを表示します。それがあなたが望むものであることを確認してください:

    git show 1023057173029091u23f01w276931f7f42595f84f:./ myFile.js

  4. ファイルをローカルコピーにリダイレクトする

    git show 1023057173029091u23f01w276931f7f42595f84f:./ myFile.js> myFile.07aug2018.js

  5. 現在のファイルをバックアップします。

    cp myFile.js myFile.bak.js

  6. 両方のファイルをお気に入りのテキストエディターで開きます。

    vim myFile.js
    vim myFile.07aug2018.js

  7. myFile.07aug2018.jsからmyFile.jsにコードをコピーして貼り付け、保存します。

  8. myFile.jsをコミットしてプッシュする

  9. 再度ログを表示し、ファイルが適切に配置されていることを確認します。

  10. 最新バージョンを取得するようクライアントに指示し、古いバージョンが適切に機能することを確認してください。

最もセクシーな、または最もgit中心のソリューションではなく、間違いなく「手動」のリセット/復帰ですが、機能します。gitの最小限の知識が必要で、コミット履歴を乱すことはありません。


2
この答えは、何年も前から存在していたどのソリューションよりもはるかに複雑でエラーが発生しやすいものです。
Artif3x

2
なぜ誰もがこのソリューションを使用する必要があります!?本当の答えは簡単なコマンドだけです。
Milad Rahimi

1
これは、特定の状況に最適なソリューションです。これは、gitが誤動作しているバインド内のユーザー、および回避策が必要なユーザーにとってメリットがあります。
kmiklas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.