一种在单个提交中恢复整个分支的方法

时间:2013-10-14 17:53:09

标签: git git-revert

我需要使用这样的单个提交来恢复整个分支:

          [topic]
     o---o---o-------X
    /
   |      [master]
---o---o---o

提交X必须具有类似master~2(主题分支的原点)的状态

我的解决方案是:

git rev-list --reverse master..topic | while read SHA; do
   git revert -n ${SHA}
done
git commit -m "Reverted topic branch"

是否有更好(更短)的解决方案?

目的

想象一下,我有一种几乎基于git-flow的回购。

              [release-3]
       o---o---o---o
      /         \       [fix-for-rc-3]
     /           o---o---o
    /
   |      [development]
---o---o---o

我有一个development分支,即将到来的release-3分支和一个所谓的hot-fix-feature-for-rc-3分支。在这个分支中,我正在做一些丑陋的黑客来完成我的发布,但我根本不想要它development,因为更多“正确”的解决方案已经落在这里但不能应用于{ {1}}因某种原因而分支。所以,我必须做以下事情......

release-3

我必须将 [release-3] o---o---o---o--------------------M / \ [fix-for-rc-3] / / o---o---o----------------X / \ | \[development] ---o---o---o---------------------------------D 合并到fix-for-rc-3(点M),然后执行“revert-all-this-shit”提交(点X)并将其合并为release-3(点D)所以这段代码永远不会到达,即使这样,整个development分支也会合并到release-3,然后释放完成。

这就是我需要恢复整个分支的原因......

问题

虽然根本问题已经解决,但如果development已合并到topic release将失败,那么获取分支的叉点仍然存在问题。

4 个答案:

答案 0 :(得分:5)

您可以创建一个恢复到分支基础的提交,如下所示:

# on "topic" branch
git read-tree $(git merge-base topic master)
git commit -m "Reverted topic branch"
git checkout -- . # update working copy to match the committed tree

在您的示例使用中,您希望还原更改,以便您可以将分支合并回master(或在您的示例中调用的development),而不实际包含任何更改topic分支。但是,这可以在不使用“我们的”合并策略添加恢复提交的情况下完成。来自git-merge documentation

  

我们

     

这解决了任意数量的头,但是合并的结果树始终是当前分支头的树,实际上忽略了来自所有其他分支的所有更改。它旨在用于取代侧枝的旧发展历史。请注意,这与递归合并策略的-Xours选项不同。

例如:

git checkout master
git merge -s ours topic

答案 1 :(得分:2)

您可以将提交的树信息读入索引,然后提交索引。这样,您的新提交将具有与旧提交完全相同的树状态。

git checkout topic
git read-tree master~2
git commit -m 'revert complete branch'

我可以问你为什么这样做?你想解决什么问题?有一个分支然后完全恢复的目的是什么?

答案 2 :(得分:1)

与“我们的”策略“合并”是什么?

$ git checkout master~2
......
HEAD is now at 06a96da... c2
$ git merge -s ours topic 
Merge made by the 'ours' strategy.
kan@altegol:/tmp/g$ git checkout topic 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  cdaad73 Merge branch 'topic' into HEAD
....
Switched to branch 'topic'
$ git merge cdaad73
Updating 0b980be..cdaad73
Fast-forward

与其他解决方案相比,此解决方案更好,因为它创建了合并提交,明确显示指向您要恢复的提交的确切历史记录。

答案 3 :(得分:-1)

我不知道,如果我做对了,但不应该只是那个吗?

git checkout topic
git reset --hard master~2