首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一次提交中还原整个分支的方法

在一次提交中还原整个分支的方法
EN

Stack Overflow用户
提问于 2013-10-14 17:53:08
回答 4查看 4.5K关注 0票数 6

我需要用这样的单次提交来还原整个分支:

代码语言:javascript
复制
          [topic]
     o---o---o-------X
    /
   |      [master]
---o---o---o

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

我的解决办法是:

代码语言:javascript
复制
git rev-list --reverse master..topic | while read SHA; do
   git revert -n ${SHA}
done
git commit -m "Reverted topic branch"

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

--的目的

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

代码语言:javascript
复制
              [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中,因为更多“正确”的解决方案已经在这里了,但是由于某种原因不能应用到release-3分支。所以我必须做以下几件事..。

代码语言:javascript
复制
                                    [release-3]
       o---o---o---o--------------------M
      /         \       [fix-for-rc-3] /
     /           o---o---o----------------X
    /                                      \
   |                                        \[development]
---o---o---o---------------------------------D

我必须将fix-for-rc-3合并到release-3 (点M),然后执行“revert this -该死”提交(点X),并将它合并为development (点D),这样代码就永远不会出现在这里,即使这样,整个release-3分支也合并到development中,然后发布就完成了。

所以我需要恢复整个分支..。

问题

虽然根本问题已经解决了,但是如果topic已经合并到release merge-base中,那么获得分支的分叉点仍然存在问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-14 17:57:39

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

代码语言:javascript
复制
# 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分支的任何更改。但是,这可以通过使用"ours“合并策略来实现,而无需添加还原提交。来自git-合并文档

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

例如:

代码语言:javascript
复制
git checkout master
git merge -s ours topic
票数 5
EN

Stack Overflow用户

发布于 2013-10-14 18:16:43

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

代码语言:javascript
复制
git checkout topic
git read-tree master~2
git commit -m 'revert complete branch'

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

票数 2
EN

Stack Overflow用户

发布于 2013-10-14 18:16:55

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

代码语言:javascript
复制
$ 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

与另一种解决方案相比,该解决方案更好,因为它创建了合并提交,它显式地显示了指向要恢复到的提交的确切历史。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19366142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档