当手动将相同的更改应用于两个分支时,如何强制使用rebase?

时间:2010-04-21 21:15:20

标签: git merge conflict reset rebase

我的存储库看起来像:

X - Y- A - B - C - D - E             branch:master
     \                  \
      \                  \ merge master -> release
       \                  \
        M  ---  BCDE  ---  N         branch:release 

这里“M - BCDE - N”是手动(不幸!)应用的变化,大致与单独的提交“A - B - C - D - E”相同(但似乎GIT不知道这些变化是相同的)。我想重新定义并获得以下结构:

X - Y- A - B - C - D - E     branch:master
                        \
                         *   branch:release 

即。我想创建分支:release与分支完全相同:master并从master的HEAD中分叉它。

但是当我在分行发布时运行“git rebase master”时,GIT会报告很多冲突并拒绝改变。我怎么能解决这个问题?

对此的其他解释:我想“重新创建”分支:从头开始从主人的HEAD中释放。并且还有很多其他人已经为分支做了“git pull”:release,所以我不能使用git reset + git push -f。

2 个答案:

答案 0 :(得分:1)

你说人们已经拉出了发布分支,所以你无法重置。这也意味着你无法改变 - 无论是哪种方式,你以非合并的方式移动引用,并使其他人感到不安。

假设您想要在发布分支上丢弃所有(我对M感到有点困惑)并使其与master相同(为什么要显示{ {1}}?),这是你可以做的:

*

你最终会得到这个:

git checkout master
git merge --strategy=ours release   # merge in release, but keep master's contents
git checkout release
git merge master                    # fast-forward

合并提交X - Y- A - B - C - D - E ----- Z (master, release) \ \ / \ \ / \ \ / M --- BCDE --- N 将放弃发布中的所有更改;它只是确保释放在快进中发挥作用。来自文档:

  

我们

     

这解决了任意数量的头,但是合并的结果树始终是当前分支头的树,实际上忽略了来自所有其他分支的所有更改。它旨在用来取代边支的旧发展历史。

这正是你的情况!

在合并中使用Z选项,然后手动提交也是一个不错的主意,这样您就有机会编辑消息并记下您的操作。

答案 1 :(得分:0)

您可以使用git rebase -i master并删除BCDE的行,以完全放弃该修订版。如果它真的与A-B-C-D-E相同,那么你应该没有问题。