在我跟踪 svn 存储库的 git 存储库中,我对单个文件进行了多次编辑。
现在我想恢复这些更改(如 svn revert),但只是文件的一部分。
我希望能够查看文件上的差异,丢弃(还原)我不想要的更改并保留我想要的更改。
这
git add -i
command 似乎可以选择这样做,但我还不想进行此操作。
在我跟踪 svn 存储库的 git 存储库中,我对单个文件进行了多次编辑。
现在我想恢复这些更改(如 svn revert),但只是文件的一部分。
我希望能够查看文件上的差异,丢弃(还原)我不想要的更改并保留我想要的更改。
这
git add -i
command 似乎可以选择这样做,但我还不想进行此操作。
我相信您可以通过以下方式最简单地做到这一点:
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 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 diff
在文件上运行,保存生成的差异,编辑它以删除您想要保存的更改,然后运行它patch -R
以撤消剩余的差异。
git diff file.txt >patch.tmp # 编辑 patch.tmp 删除你想要保留的块 补丁 -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>
此配方仅恢复对文件(或您指定的文件)的选定更改,并且不会创建任何需要恢复的临时提交。
如果您只想选择性地应用之前提交中所做的一些更改,那么您可以首先将文件重置为之前提交的状态:
git reset <commit_before_first_unwanted_change> -- <file>
然后,您可以按照之前的方法git add -i <file>
来暂存您想要保留的那些更改,git checkout -- <file>
丢弃不需要的更改并git reset -- <file>
“取消暂存”这些更改。
当文件位于我通过 ssh 终端访问的服务器上时,此处答案中描述的命令行选项很方便。但是,当文件在我的本地机器上时,我更喜欢以下方式:
在 netbeans 编辑器(带有 git 支持)中打开文件。Netbeans 在行号处放置红色/绿色/蓝色标记,以指示删除/添加/修改内容的位置(分别)。
右键单击这些标记中的任何一个,您都可以选择撤消该更改。此外,您可以右键单击红色和蓝色标记以在弹出窗口中查看旧版本。