gitselect性恢复从文件的本地更改

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

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

我希望能够查看文件上的差异,放弃(恢复)我不想要的更改,并保留所需的更改。

git add -i 

命令似乎有一个select,但我不想这个阶段呢。

你可以直接用git checkout -p来做到这一点。 请参阅下面的Daniel Stutzbach的答案 。


老回答( checkout -pcheckout -p被介绍):

你可以这样做:

 git add -i 

(select你想保留的帅哥)

 git commit -m "tmp" 

现在,只有您想要保留的更改才能进行提交,而其余部分则处于暂停状态。

 git reset --hard HEAD 

此时,未提交的更改已被丢弃,因此您有一个干净的工作目录,并且想要保持最新的更改。

 git reset --mixed HEAD^ 

这将删除最后一个提交('tmp'),但保留在您的工作目录中的修改,unstaged。

编辑:取代 – --soft --mixed ,清理中转区。

我相信你可以做到最简单的:

 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. 

您可以在文件上运行git diff ,保存结果差异,编辑它以删除您想要保存的更改,然后通过patch -R运行它以撤销剩余的差异。

  git diff file.txt> patch.tmp
 #编辑patch.tmp删除你想保留的区块
 patch -R <patch.tmp 

看起来像你想要的

  git revert --no-commit $REVSISON 

你可以使用

  git diff --cached 

看看在提交之前会做什么改变(因为回复只是一个向前的方向的提交,它复制了过去改变的反面)

如果你使用的是纯粹的Git仓库,那么根据你的目标,你可能会利用交互式rebase( git rebase -i )返回你不喜欢的提交,并追溯地编辑提交,这样,就像从来没有发生过,但通常只有当你知道你永远不会想再看到它。

重新阅读这个问题,听起来像是要恢复工作树中的更改,而不是之前已经提交的更改,但其他答案使其听起来像我的阅读可能是错误的。 你能澄清吗?

如果更改只是在您的工作副本中,那么执行此操作的最简单方法是逐步更改要保留的更改:

 git add -i <file> 

然后通过检查索引版本,抛弃您不想保留的更改:

 git checkout -- <file> 

然后,如果你不想让他们上演的话,

 git reset -- <file> 

这个配方只会恢复文件(或您指定的文件)的选定更改,并不会创build任何需要还原的临时提交。

如果您只想有select地应用以前提交中所做的某些更改,则可以先将文件重置为先前提交的状态:

 git reset <commit_before_first_unwanted_change> -- <file> 

然后你可以按照之前的git add -i <file>来configuration你希望保留的更改, git checkout -- <file>把不需要的更改扔掉, git reset -- <file>更改为'unstage'变化。

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

在netbeans编辑器中打开文件(它附带了git支持)。 Netbeans在行号处标出红色/绿色/蓝色标记,以指示删除/添加/修改的东西(分别)。

右击这些标记中的任何一个,都可以让您select撤消该更改。 另外,您可以右键点击红色和蓝色的标记,在popup窗口中查看旧版本。