154

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

ここで、これらの変更を元に戻したい (svn revert など) が、ファイルの一部のみです。

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

git add -i 

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

4

6 に答える 6

314

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

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.
于 2010-03-04T22:55:57.243 に答える
92

で直接行うことができますgit checkout -p以下のDanielStutzbachの回答を参照してください。


古い答え(checkout -p導入前):

あなたはこのようにそれを行うことができます:

git add -i

(保持したいハンクを選択します)

git commit -m "tmp"

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

git reset --hard HEAD

この時点で、コミットされていない変更は破棄されているため、コミットしたい変更が最上位にあるクリーンな作業ディレクトリがあります。

git reset --mixed HEAD^

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

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

于 2009-07-10T12:15:05.440 に答える
3

ファイルを実行し、結果の差分を保存し、編集して保存たいgit diff変更を削除してから、実行して残りの差分を元に戻すことができます。patch -R

git diff file.txt> patch.tmp
#patch.tmpを編集して、保持したいハンクを削除します
パッチ-R<patch.tmp
于 2009-07-10T11:44:36.867 に答える
3

あなたが望むように見えます

 git revert --no-commit $REVSISON 

その後、使用することができます

 git diff --cached

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

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

于 2009-07-10T11:47:18.017 に答える
1

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

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

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>破棄して、変更を「ステージング解除」できます。

于 2009-07-10T15:32:12.210 に答える