如何将多个提交还原为单个提交的一部分

Jim*_*Joo 56 git revert

这不是一个主要问题,只是我想知道是否可能.

假设我们有两个提交,abcd123并且wxyz789发生在非相邻的,分开的地方,远在回购历史中.现在让我们说我们想要还原它们.干

git revert abcd123 wxyz789
Run Code Online (Sandbox Code Playgroud)

将导致两个单独的提交,一个恢复abcd123,另一个恢复wxyz789.

这一切都很好,但是如果我们想要在两个提交中修复的错误在逻辑上是链接的,并且为了自我记录的目的,我们想做一个单独的提交包含一个单词" 我现在打破了一些东西 " 我正在恢复文件x,y和z "评论?有没有这样做的git命令?

(我当然知道有可能创建一个提交,我只需手动修复所有更改然后推送.这对于所有的不良原因都是痛苦的.)

Mar*_*air 71

你可以做:

git revert abcd123
git revert --no-commit wxyz789
git commit --amend
Run Code Online (Sandbox Code Playgroud)

...然后编写一个适当的提交消息,描述恢复两个提交的综合效果.

  • 更简洁:`git revert abcd123 wxyz789 --no-commit``git commit` (33认同)
  • 这里有更全面的答案:http://stackoverflow.com/questions/1463340/revert-multiple-git-commits.基本上将`--no-commit`标志添加到要还原的所有提交中,然后提交结果并为整批添加消息. (2认同)

Ely*_*avi 37

如果复杂的恢复相互改变,则revert --no-commit可能存在问题.

我的简单解决方案是做真正的还原和壁球:

git revert <all commits>
git rebase -i
Run Code Online (Sandbox Code Playgroud)

然后将所有恢复标记为squash(第一个除外),以创建单个提交.

  • +1.对于git学习者:1.阅读有关提交的内容,2.熟悉交互式rebase:压缩,删除,编辑,重新定位,重新提交提交.一旦你让它熟悉它(提示:它只是时间旅行),这个解决方案变得比转换像`--no-commit`这样的东西更自然.(并且不要害怕"不要重新发布"规则 - 只要你在当地或私人分支机构执行,你就可以*做任何事情*.) (4认同)

lyu*_*lyu 22

git revert -n <commits>
git commit
Run Code Online (Sandbox Code Playgroud)

第一个命令将执行所有恢复,而不创建任何提交并暂存最终结果(-n选项).之后,commit命令创建一个提交.