Gitのファイルへの変更を選択的に元に戻すかチェックアウトしますか?


88

作業ディレクトリ内の1つまたは複数のファイルへの変更を部分的に元に戻すことができるコマンドはありますか?

ファイルを何度も編集したが、一部の変更を元に戻してコミット状態に戻したいが、他の変更は元に戻さないことに気付いたとします。

私はgit checkoutそのためのオプションが非常によく機能することを想像していますgit add -p。つまり、ファイルをハンクごとに調べて、それを保持するかどうかを尋ねます。

回答:


85

あなたが使うことができます

git add -p <path>

特定のファイルに保持するチャンクをステージングするには、

git checkout -- <path>

ファイルのステージングされたバージョンをチェックアウトすることにより、保持したくない作業ツリーの変更を破棄します。

最後に、あなたは使用することができます

git reset -- <path>

ステージングされたバージョンのファイルを最新のコミットされたバージョンのファイルに戻し、変更をステージングされないままにします。


他のすべてのバージョン管理システムが単に「元に戻す」と呼ぶこの単純なユースケースの場合、Gitコマンドがそれほどあいまいなのはなぜですか?
Jan Hettich 2011年

5
@Jan他のバージョン管理システムのrevertコマンドを使用すると、ファイル内のどの変更を元に戻すかを選択できますか?私はCVSとGitの経験しか持っていないので、真剣に尋ねます。Gitでは、git checkout -- path/to/fileはそのファイル内のすべての変更を元に戻す単一のコマンドですが、これは上記と同じではありません。
michiakig 2011年

3
最新のgitのように機能するものもgit checkout --patchあります。git reset --patchgit add --patch
マットコノリー

2
@Rudieは--通常、オプションの解析の終了を示し、その後に続く引数はすべて文字通りに解釈されることを示します。これは./、ファイル名が--。の後にある場合、マイナス記号で始まるファイル名の前に追加する必要がないことを意味します。
zrajm 2014年

使用するとgit checkout --patch、差分が逆に表示されます。マイナス記号は作業コピーにテキストを追加し、プラス記号は作業コピーから行を削除します。
フェリペアルバレス

115

gitバージョン> = 1.7.1でできる

git checkout -p

この機能がいつ導入されたかはわかりません。


11
git reset -pステージング領域/インデックスから変更を選択的にステージング解除するためにも実行できることは言及する価値があります。また、これがどのバージョンのGitで導入されたのかも頭からわかりません。

これが正解です。なぜ受け入れられないのですか。
wukong 2017年

1
@wukongは、この回答が質問の2年後に投稿されたためです。現時点(2009年)では、チャールズの答えが最善の解決策でした
pomeh 2017

8

git checkout $fileファイルの状態を$file最後にコミットされた状態に戻します。git checkout SHA-1 -- $fileファイルをSHA-1で識別されるコミットに戻すために使用できると思います。


1
ええ、私は望んでいない、まさに、私がファイルで作られ、他の人を元に戻した変更のいくつか残しておきたいので、
1800 INFORMATION

1

何回コミットして戻って選択する必要がありますか?1つだけの場合は、その直前にブランチを作成し、コミットしたファイルをチェックアウトしてgit add -pから、必要な方法でファイルを追加します。次に、元の場所に戻って、一時ブランチからファイルをチェックアウトできます。

あれは:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

他の選択肢は背中を行くとしてコミット編集を含めるgit rebase -i(マーキングをコミットとしてedit、次にやって、git reset HEAD^そしてシェルに戻って落としたときにコミットやり直し)。

選択する必要のある変更が一連のコミットに分散している場合は、それらをパッチ(またはそれらすべてをカバーするパッチ)として抽出し、パッチを手動で編集して、保持したい変更を削除する方がよい場合があります。残差をにフィードしgit apply --reverseます。


コミットされたものを実際に元に戻すのではなく、作業コピーにのみある変更を元に戻したい
1800 INFORMATION
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.