2009-04-21 8 views
78

作業ディレクトリのファイルへの変更を部分的に取り消すコマンドがありますか?Gitのファイルを選択的に元に戻したり、チェックアウトしたりしますか?

ファイルをたくさん編集したとしますが、変更の一部をコミットされた状態に元に戻したいが、他の変更は元に戻したくないとわかっているとします。

git add -pとよく似た働きをするオプションが考えられています。つまり、ファイルをハンクで処理し、保持したいかどうかを尋ねます。

答えて

74

あなたが維持したくなかった作業ツリーの変更を破棄し、その後、

git checkout -- <path> 

を使用すると、特定のファイルに保存しておきたいチャンクをステージングする

git add -p <path> 

を使用することができますファイルのステージングされたバージョンをチェックアウトしてください。

最後に、あなたはあなたの変更unstagedであなたを残すために、ファイルの最新コミットバージョンにファイルの段階的なバージョンを元に戻す

git reset -- <path> 

を使用することができます。 Gitのバージョンで

+0

私はこれが私が感謝のために探していると思います –

+0

他のすべてのバージョン管理システムが単に "復帰"と呼ぶこの単純なユースケースでは、なぜGitコマンドがあいまいであるのですか? –

+5

@Jan他のバージョン管理システムの 'revert'コマンドでは、ファイル内のどの変更を元に戻すことができますか?私はCVSとGitの経験しかないので、真剣に尋ねます。 Gitでは 'git checkout-path/to/file'はそのファイルのすべての変更を元に戻すコマンドですが、これは上記とは異なります。 – spacemanaki

8

git checkout $fileは、ファイル$fileの状態を最後に確定した状態に戻します。私はgit checkout SHA-1 -- $fileを使ってファイルをSHA-1によって識別されるコミットに戻すことができると思います。

+1

私がファイル内で行った変更の一部を保存して他のものを元に戻したいので、正確には私が望むものではありません –

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 reset HEAD^を行うと、バックシェルに落ちたときにコミットやり直し、editとしてコミットマーキング)git rebase -iにコミット編集を含んでいます。

あなたが選択しなければならない変更が一連のコミットに広がっている場合は、それらをパッチ(またはそのすべてをカバーするパッチ)として抽出し、パッチを手動で編集して残しておきたい残渣をgit apply --reverseに送ります。

+0

私は実際にコミットされたものを元に戻したくないのですが、私の作業コピーにのみあります –

99

> = 1.7.1私は

git checkout -p 

私はこの機能が導入された際に確認していないことができます。

+8

'git reset -p'を実行して、ステージング領域/インデックスからの変更を選択的に解除することもできることに言及することは重要です。私はまた、これが導入されたGitのバージョンで私の頭の上から知りません。 –

+0

正解ですが、なぜ受け入れられていないのですか? – wukong

+0

@ wukongこの回答は2年後に投稿されているためです。この瞬間(2009年)、チャールズの答えが最善の解決策でした – pomeh

関連する問題