【问题标题】:How to undo a merge (without commit)?如何撤消合并(不提交)?
【发布时间】:2010-12-26 04:47:07
【问题描述】:

我刚刚做了一个svn merge 将更改从主干合并到一个分支:

$ svn merge -r328:HEAD file:///home/user/svn/repos/proj/trunk .
--- Merging r388 through r500 into '.':
A    foo
A    bar
   C baz1
   C baz2
U    duh
[...]

但是有太多冲突,所以我想撤消它。

一种方法是提交然后合并回来。但由于冲突,我无法提交。在这种情况下撤消的最佳方法是什么?

【问题讨论】:

    标签: svn merge commit undo


    【解决方案1】:

    我遇到了同样的情况,我也有一些我不想失去的其他变化。 因此,对于冲突的项目,而不是完全递归还原 svn revert 对我有好处

    svn revert baz1 baz2
    

    【讨论】:

      【解决方案2】:

      无论如何,只要对所有冲突执行svn resolve 并提交:

      $ svn resolved baz1
      $ svn resolved baz2
      $ svn ci -m "oops. bad merge. will revert."
      Transmitting file data ......
      Committed revision 501.
      

      然后,通过合并回到原来的位置来正式撤消它:

      $ svn merge -r501:500
      --- Reverse-merging r319 into '.':
      [...]
      

      就是这样,目录中的合并已被撤消。现在也提交:

      $ svn ci -m "bad merge has been undone"
      Transmitting file data ......
      Committed revision 502.
      

      svn revert -R . 方法相比的优点是添加的文件都被正确删除了。

      【讨论】:

      • 您真的不想将冲突标记放入存储库的永久历史记录中,对吧!?糟糕。
      • @LakshmanPrasad 如果有人在这两次提交之间签出/更新,冲突标记将最终出现在某人的工作副本中......
      【解决方案3】:

      从工作副本的顶部递归还原:

      svn revert -R .

      您需要手动删除已添加的文件。与还原后一样,添加的文件将保留在磁盘上,但它们将处于非跟踪状态(“?foo”)

      【讨论】:

      • 这个命令也会恢复在你进行合并之前存在的任何本地修改,尽管正确吗?
      • @NeilMonday 是的,但是无论如何您都不应该将与本地、非合并相关的更改合并到工作副本中。
      【解决方案4】:

      只要您还没有提交,您就可以随时进行还原以撤消所有更改。

      【讨论】:

      • 嗯,只是 svn revert . 什么都没做。
      • 好的,那么你应该先解决所有问题,然后再进行还原。
      • ...就像@rq 所说,不要忘记 -R 标志以递归方式进行还原。
      猜你喜欢
      • 2011-12-21
      • 2019-05-13
      • 2021-06-26
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多