在GIT中,我有两个分支和两个提交:
A(master)---B(branch "topic")
Run Code Online (Sandbox Code Playgroud)
我想在"topic"分支中创建一个合并提交C(它将A和B作为父级).(我知道这看起来很奇怪,并且合并提交将为空.)
A(master)---B---C (branch "topic")
\-------------/
Run Code Online (Sandbox Code Playgroud)
我设法以太复杂的方式创建这个合并提交(见下文).有没有更简单的方法来创建此合并提交?
谢谢你的回答!
初始状态:
$ 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
Run Code Online (Sandbox Code Playgroud)
一些尝试:
$ git merge master #Does not work
Already up-to-date.
$ git merge --no-ff -s ours master #Does not work
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法来实现以下目标?
$ #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)
Run Code Online (Sandbox Code Playgroud)
UPD:更干净的方式做同样的事情而不直接搞乱sha1:
$ echo "merge commit" | git commit-tree topic^{tree} -p master -p topic
4201b6abae6bb06f929ea00fbc35019679d55535
$ git merge 4201b6abae6bb06f929ea00fbc35019679d55535
Updating b826a8e..4201b6a
Fast-forward
Run Code Online (Sandbox Code Playgroud)
甚至是单行命令:
$ git merge $(echo "merge commit" | git commit-tree topic^{tree} -p master -p topic)
Run Code Online (Sandbox Code Playgroud)
有关正在做什么的详细信息 - 请阅读完整答案:)
我完全同意其他人的意见,因为它对我没有任何意义,但如果你真的想要它 - 可以使用如下所述的低级管道命令.
首先,您应该知道父提交的sha1.我想B有评论'从主题改变',A有评论'从主人改变',我们现在在B(主题分支).
$ git log --format=oneline -2
b826a8e93ac8da0de5bfb5b70d5f4e7c352a01fa change from topic
8b7653a529fb3ce964fda79bfd57e645441ad893 change from master
Run Code Online (Sandbox Code Playgroud)
然后你应该知道提交B的具体树对象的sha1:
$ git cat-file -p topic
tree 867f31c455a371756ec353b54d755f51d98d62c4
parent 8b7653a529fb3ce964fda79bfd57e645441ad893
author ivan-danilov <email@gmail.com> 1311518908 +0300
committer ivan-danilov <email@gmail.com> 1311518908 +0300
change from topic
Run Code Online (Sandbox Code Playgroud)
就是这样867f31c455a371756ec353b54d755f51d98d62c4.最后你应该执行git-commit-tree命令:
$ echo "merge commit" | git commit-tree 867f31c455a371756ec353b54d755f51d98d62c4 -p b826a8e93ac8da0de5bfb5b70d5f4e7c352a01fa -p 8b7653a529fb3ce964fda79bfd57e645441ad893
4201b6abae6bb06f929ea00fbc35019679d55535
Run Code Online (Sandbox Code Playgroud)
请注意,我使用管道重定向作为git-commit-tree从stdin流中提交注释.第一个参数是我们得到的树的sha1,git cat-file另外两个是我们得到的提交的sha1 git log.
命令输出是新创建的合并提交的sha1.现在你想快速转发主题分支:
$ git merge 4201b6abae6bb06f929ea00fbc35019679d55535
Updating b826a8e..4201b6a
Fast-forward
Run Code Online (Sandbox Code Playgroud)
就这样.你有你想要的.