2

我的存储库看起来像:

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 

即我想让 branch:release 与 branch:master 完全相同,并从 master 的 HEAD 分叉它。

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

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

4

2 回答 2

1

你说人家已经拉了release分支,所以不能reset。这也意味着您不能变基 - 无论哪种方式,您都以非合并方式移动 ref,并让其他人感到不安。

假设您想丢弃发布分支上的所有内容(我对 有点困惑M)并使其与 master 相同(为什么要显示*?),您可以执行以下操作:

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将丢弃发布中的所有更改;它只是为了确保发布快进。从文档中:

我们的

这解决了任意数量的头,但合并的结果树始终是当前分支头的树,有效地忽略了所有其他分支的所有更改。它旨在用于取代分支的旧开发历史。

这正是你的情况!

在合并上使用该选项也不错--no-commit,然后手动提交,这样您就有机会编辑消息并记下您所做的事情。

于 2010-04-21T21:45:42.353 回答
0

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

于 2010-04-21T21:25:41.690 回答