我想知道有没有一种快速反转提交中特定块的方法。
我可以生成两个提交或HEAD
之间的差异。
如何仅反转其中一个块(或更好地说,一组特定的块)?
我想知道有没有一种快速反转提交中特定块的方法。
我可以生成两个提交或HEAD
之间的差异。
如何仅反转其中一个块(或更好地说,一组特定的块)?
git checkout -p $REF -- path/to/file
例如:
git checkout -p HEAD^ myfile
其中 $REF
是一个引用名称或提交ID,它指定了您想要从中获取文件状态的提交。例如,要选择性地还原最后一次提交所做的更改,请使用 HEAD^
。
add -p
命令即可:git revert --no-commit <commit>…
git reset # unstage things
git add -p [OPTIONS] [<pathspec>…] # choose hunks interactively
git restore . # wipe the rest (in root directory)
... maybe further changes ...
git commit [--fixup] ...
git revert -p
...git checkout/restore -p ...
这样的方法不能一致地从特定提交中还原hunk,而是去选择某个文件状态的部分内容——可能会丢失其他后续提交中的更改。git difftool $REF -- /path/to/file
其中$REF
是一个ref名称或提交ID,用于指定您想要从中获取文件状态的提交。例如,要选择性地还原上次提交所做的更改,请使用HEAD^。
这个问题已经被@cdhowie回答过了,但我发现使用交互式差异工具(如meld
)来选择性地恢复旧的块/代码行会更好,特别是如果代码中有新引入的难以找到的错误。
-p
选项将允许您交互式地选择要应用于您的工作树的补丁块。 - cdhowieadd
、checkout
、reset
等)可以采用这种方式使用-p
选项,并且会让您选择要处理哪些代码块。当同一文件中的两个代码块应该分别提交到不同的提交中时,这非常方便。 - cdhowiey
。这将在您之前的提交上产生一个暂存的差异,而不会修改它。然后,您可以通过取消暂存 (git reset <file>
) 然后使用git diff
查看差异。最后,您可以通过git commit --amend <file>
将其合并到您之前的提交中。 - Nick Desaulniers