Answers:
您可以直接使用进行操作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
,以清理临时区域。
我相信您可以使用以下方法最简单地做到这一点:
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.
a
在修补程序模式下使用该选项丢弃整个文件时,我会收到那些错误,但git checkout -- <file>
仍能按预期工作。有人知道为什么吗?
您可以运行git diff
该文件,保存所生成的差异,修改或移除你的变化不希望保存,然后运行它通过patch -R
撤消剩余的diff。
git diff file.txt> patch.tmp #编辑patch.tmp以删除要保留的块 补丁-R <patch.tmp
git diff
显示整个文件已更改。当您使用与之前不同的行尾保存文件时,通常会发生这种情况。这也将导致patch
拒绝补丁文件。听起来像发生了什么吗?
看起来像你想要的
git revert --no-commit $REVSISON
然后,您可以使用
git diff --cached
在提交之前查看要进行的更改(因为还原只是在向前方向上的提交,它复制了过去所做的更改的逆过程)
如果您使用的是纯粹的Git存储库,则可以根据您的目标,使用交互式rebase(git rebase -i
)返回到您不喜欢的提交并追溯编辑该提交,以使您不喜欢的更改永远不会发生,但这通常仅是因为您知道您将再也不想看到它了。
重新阅读该问题,听起来您想还原工作树中的更改,而不是先前已提交的更改,但是其他一些答案则听起来好像我的阅读可能有误。你能澄清一下吗?
如果更改仅在您的工作副本中,那么执行此操作的最简单方法是暂存要保留的更改:
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>
“ 取消暂存”更改。
当文件位于我正在通过ssh终端访问的服务器上时,此处答案中描述的命令行选项非常方便。但是,当文件在我的本地计算机上时,我更喜欢以下方式:
在netbeans编辑器(带有git支持)中打开文件。Netbeans在行号上放置了红色/绿色/蓝色标记,以分别指示在何处删除/添加/修改了内容。
右键单击这些标记中的任何一个,您可以选择撤消该更改。此外,您可以右键单击红色和蓝色标记以在弹出窗口中查看旧版本。