gitselect性恢复从文件的本地更改
在我跟踪svn回购的git repo中,我对一个文件进行了一些编辑。
现在我想恢复这些更改(如svn恢复),但只有部分的文件。
我希望能够查看文件上的差异,放弃(恢复)我不想要的更改,并保留所需的更改。
该
git add -i
命令似乎有一个select,但我不想这个阶段呢。
你可以直接用git checkout -p
来做到这一点。 请参阅下面的Daniel Stutzbach的答案 。
老回答( checkout -p
前checkout -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窗口中查看旧版本。