web-dev-qa-db-ja.com

git選択的にファイルからローカルの変更を元に戻す

Svnリポジトリを追跡しているgitリポジトリで、1つのファイルにいくつかの編集を加えました。

今、私はそれらの変更を元に戻したい(svn revertのような)が、ファイルの一部だけをしたい。

ファイルの差分を表示し、不要な変更を破棄(元に戻す)し、必要な変更を保持できるようにします。

その

git add -i 

コマンドにはそれを行うオプションがあるようですが、まだこれをステージングしたくありません。

143
Pradeep

git checkout -pを使用して直接行うことができます。 Daniel Stutzbach's answer を参照してください。


古い回答(checkout -pが導入される前):

次のようにできます:

git add -i

(保持する塊を選択します)

git commit -m "tmp"

これで、保持したい変更のみを含むコミットができ、残りはステージングされません。

git reset --hard HEAD

この時点で、コミットされていない変更は破棄されているので、作業ディレクトリがクリーンになり、コミットしたい変更を常にトップに維持できます。

git reset --mixed HEAD^

これにより、最後のコミット(「tmp」)は削除されますが、作業ディレクトリの変更はステージングされずに保持されます。

編集:ステージング領域をクリーンアップするために、--soft--mixedに置き換えました。

88
Paolo Capriotti

私はあなたが最も簡単にそれを行うことができると信じています:

git checkout -p <optional filename(s)>

マンページから:

   −p, −−patch
       Interactively select hunks in the difference between the <tree−ish>
       (or the index, if unspecified) and the working tree. The chosen
       hunks are then applied in reverse to the working tree (and if a
       <tree−ish> was specified, the index).
       This means that you can use git checkout −p to selectively discard
       edits from your current working tree.
302

ファイルに対してgit diffを実行し、結果の差分を保存し、編集して変更を削除しますdo保存したい場合は、patch -Rを実行して残りの差分を元に戻します。

git diff file.txt> patch.tmp 
#patch.tmpを編集して、保持したい塊を削除します
 patch -R <patch.tmp
3
Greg Hewgill

あなたが望むように見える

 git revert --no-commit $REVSISON 

次に使用できます

 git diff --cached

コミットする前にどのような変更が行われるかを確認します(元に戻すことは、過去の変更の逆を複製する順方向のコミットにすぎないため)

純粋なGitリポジトリを使用している場合、目標に応じて、インタラクティブなリベース(git rebase -i)気に入らないコミットに戻り、コミットをさかのぼって編集して、気に入らない変更が発生しないようにしますが、それは一般的にあなただけ[〜#〜] know [〜 #〜]もう二度と見たくないでしょう。

2
Kent Fredric

質問を読み直すと、以前にコミットされた変更ではなく、作業ツリーにある変更を元に戻したいように聞こえますが、他の回答のいくつかは私の読書が間違っているように聞こえます。明確にできますか?

変更が作業コピーにある場合、これを行う最も簡単な方法は、保持する変更をステージングすることです。

git add -i <file>

次に、インデックスバージョンをチェックアウトして、保持したくない変更を破棄します。

git checkout -- <file>

次に、まだステージングしたくない場合は、変更のステージングを解除します。

git reset -- <file>

このレシピは、ファイル(または指定したファイル)に対して選択した変更のみを元に戻し、元に戻す必要がある一時的なコミットを作成しません。

以前のコミットで行われた変更の一部のみを選択的に適用する場合、最初にファイルを以前のコミット状態にリセットできます。

git reset <commit_before_first_unwanted_change> -- <file>

次に、以前のgit add -i <file>のレシピに従って、保持したい変更をステージングし、git checkout -- <file>で不要な変更を破棄し、git reset -- <file>で変更を「ステージング解除」します。

1
CB Bailey

ここでの回答で説明されているコマンドラインオプションは、sshターミナル経由でアクセスしているサーバー上にファイルがある場合に便利です。ただし、ファイルがローカルマシンにある場合は、次の方法をお勧めします。

NetBeansエディターでファイルを開きます(これにはgitサポートが付属しています)。 Netbeansは、行番号に赤/緑/青のマークを付けて、それぞれが削除/追加/変更された場所を示します。

これらのマークを右クリックすると、その変更を取り消すオプションが表示されます。さらに、赤と青のマークを右クリックして、ポップアップで古いバージョンを確認できます。

0
Abhishek Anand