git选择性还原文件中的本地更改

时间:2009-07-10 11:40:05

标签: git version-control git-svn

在跟踪svn repo的git repo中,我对一个文件进行了大量编辑。

现在我想恢复这些更改(例如svn revert),但只保留部分文件。

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

git add -i 

命令似乎有一个选项可以做到这一点,但我还不想暂存它。

6 个答案:

答案 0 :(得分:298)

我相信你最简单的方法就是:

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.

答案 1 :(得分:85)

您可以直接使用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,以清理暂存区域。

答案 2 :(得分:3)

您可以在文件上运行git diff,保存生成的差异,编辑它以删除您 要保存的更改,然后通过patch -R运行以撤消剩下的差异。

git diff file.txt >patch.tmp
# edit patch.tmp to remove the hunks you want to keep
patch -R <patch.tmp

答案 3 :(得分:2)

看起来像你想要的

 git revert --no-commit $REVSISON 

然后您可以使用

 git diff --cached

看看在提交之前会做出什么改变(因为恢复只是向前方向提交,复制过去变化的倒数)

如果您使用纯Git存储库,您可能会根据您的目标使用交互式rebase(git rebase -i)返回您不喜欢的提交并追溯编辑提交,以便你不喜欢的改变从未发生过,但这通常只适用于你 KNOW ,你永远不想再看到它。

答案 4 :(得分: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>来“取消”更改。

答案 5 :(得分:0)

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

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

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