【发布时间】:2011-10-12 00:54:28
【问题描述】:
在 GIT 中,我有两个分支和两个提交:
A(master)---B(branch "topic")
- “master”分支的 HEAD 是提交 A
- 分支“主题”的 HEAD 是提交 B
- 提交 A 是提交 B 的父级
我想在“主题”分支中创建一个合并提交 C(它将 A 和 B 作为父级)。 (我知道这看起来很奇怪,而且合并提交是空的。)
A(master)---B---C (branch "topic")
\-------------/
我设法以一种过于复杂的方式创建了这个合并提交(见下文)。有没有更简单的方法来创建这个合并提交?
感谢您的回答!
初始状态:
$ git init plop
Initialized empty Git repository in /tmp/plop/.git/
$ cd plop/
$ git commit -m "Initial commit (commit A)" --allow-empty
[master (root-commit) a687d4e] Initial commit (commit A)
$ git checkout -b topic
Switched to a new branch 'topic'
$ git commit -m "Some work on my topic branch (commit B)" --allow-empty
[topic d4d1c71] Some work on my topic branch (commit B)
$ #OK, we now reached the initial state
一些尝试:
$ git merge master #Does not work
Already up-to-date.
$ git merge --no-ff -s ours master #Does not work
Already up-to-date.
有没有更简单的方法来实现以下目标?
$ #Let's try another way (too complex!)
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff topic
Already up-to-date!
Merge made by recursive.
$ git checkout topic
Switched to branch 'topic'
$ git merge master
Updating d4d1c71..641e7ae
Fast-forward
$ git checkout master
Switched to branch 'master'
$ git reset --hard HEAD^1
HEAD is now at a687d4e Initial commit
$ git checkout topic
Switched to branch 'topic'
$ git log #This is what I wanted to reach
commit 641e7aeb614d9b49796e8f11abd3a0290ac08b40
Merge: a687d4e d4d1c71
Author: xxx <yyy.zzz>
Date: Sat Jul 23 12:52:41 2011 +0200
Merge branch 'topic'
commit d4d1c71c87b94335c8852ab7675cbb663965ef7d
Author: xxx <yyy.zzz>
Date: Sat Jul 23 12:50:11 2011 +0200
Some work on my topic branch (commit B)
commit a687d4eb88b9f6d661122a5766dd632dd462fbaa
Author: xxx <yyy.zzz>
Date: Sat Jul 23 12:49:52 2011 +0200
Initial commit (commit A)
【问题讨论】:
-
你为什么要这样做?这没有意义。可以在
master上创建一个新的提交,并合并到topic中(这也很有意义)。 -
这是合并祖先提交的一个可能用例:假设分支包含我们现在想要恢复的文件的一些更改(例如,它是某种下游分支)。做一个简单的
git revert会使git blame在该属性之后将所有恢复的行归因于恢复提交,但是将它们归因于上游会更有帮助。进行还原提交并将其标记为与上游的合并可以实现这一点。 -
好问题。这是一个示例,说明您为什么要这样做,每个人都在问“为什么”。我有一个
gh-pages分支,它构建了文档,以及仅在该分支上签入的 dist/prod 文件,用于部署。我的dev分支在master之前,我合并了dev -> gh-pages并重建,然后部署。但后来我意识到我失败了,因为我希望部署我的主构建,而不是我的开发构建。所以我checkout gh-pages并尝试了merge --no-commit master,但它警告“已经是最新的。”在这种情况下强制下游(空)合并会很有帮助。 -
刚刚遇到这个问题,master刚刚合并到主题中,当主题合并到master中时我想要另一个提交......但是遇到了这个问题。这对于需要知道要遵循哪个合并祖先的工具很重要。此外,当 git log --graph 在主题分支的右侧或中间显示您的主节点时,它也无济于事。