在我们的存储库中,我们遵循基于git-flow的工作流程。我们有一个已完成的版本(已在生产中安装),因此发布分支已合并为master。
B---C---D---E [release/1]
/ \
A---------------F [master]
E - head of the release branch
F - merge of release/1 into master
生产中存在问题,因此软件已移回旧版本。我们的部署过程保留了备份,因此这是独立于源代码控制完成的。此时,主分支与生产中的软件不匹配,因此我们将将发布合并到主服务器的提交还原。这使得主人和生产中的软件部署同步。
B---C---D---E
/ \
A---------------F---G [master]
G - revert of release, effectively bring master back to A
发现版本不是问题,因此我们将该软件重新安装到生产中。我们通过在与旧发布分支相同的提交上创建新的发布分支来实现此目的。
B---C---D---E [release/2]
/ \
A---------------F---G [master]
但是,当我们关闭发布分支时,Git没有创建合并提交,因为发布分支的头部指向一组提交,这些提交位于主历史记录中(通过原始合并)。
B---C---D---E-------+
/ \ \
A---------------F---G---H
H - merge of release/2 into master (this is what we want!!)
但是,由于恢复该版本中的实际更改现在已丢失。如何强制Git第二次合并发布分支的负责人?
答案 0 :(得分:2)
正如您所指出的,git不会进行合并,因为它看到这些提交已经在分支的历史记录中。恢复是阻碍的。
我以前打过这个。您需要做的是首先恢复还原。这将删除删除提交的提交。 : - )
git revert G
然后你可能想重新合并只是为了获取之后发生的任何事情。
答案 1 :(得分:0)
一般来说,"还原还原"技术是要走的路。
您可以使用以下内容强制创建提交。您需要调整各种HEAD引用以获取所需的值。
git update-ref HEAD $(git log --format =%B -n 1 HEAD~1 | git commit-tree -p HEAD -p HEAD~1 ^ 2 HEAD ^ {tree} -F - )
git update-ref HEAD - 这应该是头 --format =%B -n 1 HEAD ?? - 使用这个只是抓取随机提交消息 commit-tree -p HEAD - 指定第一个父指向的位置(G) -p HEAD~1 ^ 2-这指定第二个父项(发布/ 2) HEAD~1 ^ {TREE} - 这需要指向具有您想要使用的树的提交(提交F)