154

在我跟踪 svn 存储库的 git 存储库中,我对单个文件进行了多次编辑。

现在我想恢复这些更改(如 svn revert),但只是文件的一部分。

我希望能够查看文件上的差异,丢弃(还原)我不想要的更改并保留我想要的更改。

git add -i 

command 似乎可以选择这样做,但我还不想进行此操作。

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. 请参阅下面的 Daniel Stutzbach 的回答


旧答案(之前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 存储库,您可能会根据您的目标,使用交互式 rebase ( 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 回答
0

当文件位于我通过 ssh 终端访问的服务器上时,此处答案中描述的命令行选项很方便。但是,当文件在我的本地机器上时,我更喜欢以下方式:

在 netbeans 编辑器(带有 git 支持)中打开文件。Netbeans 在行号处放置红色/绿色/蓝色标记,以指示删除/添加/修改内容的位置(分别)。

右键单击这些标记中的任何一个,您都可以选择撤消该更改。此外,您可以右键单击红色和蓝色标记以在弹出窗口中查看旧版本。

于 2015-09-07T05:05:38.713 回答