那里没人singlegit 命令来完成此操作,但您只需几个命令即可完成。
不过,第一个问题是:您是否希望至少resemble合并(在这种情况下,它真的是合并)?也就是说,您希望提交图看起来像什么——它应该显示来自branch_B
(其中提交P
生命),啦:
A <--- ... -- I <----- J <----- K <--- * Branch_A
/
M <------ N <----- O <----- P Branch_B
where *
是你的新提交吗?或者你希望它完全独立?
低级命令git commit-tree
将进行具有任意父母年龄的新提交(您提供父母 ID-p
、一条消息和一个现有的“树”对象)。它打印生成的提交对象 ID。因此,要使用低级命令来执行此操作:
tree=$(git rev-parse B^{tree}) # or similar to find the tree ID
commit=$(git commit-tree -p ... -m message $tree) # or use -F, or stdin
然后设置Branch_A
指向$commit
(using git branch
or git update-ref
)。这可以变成单行 shell 的东西,因此可以作为 git 别名来完成,但它有点棘手,可能值得成为一个 shell 脚本。仅选择一个 ID 作为父项,使您的新提交成为常规(非合并)提交,或选择多个 ID 作为父项,使其成为合并;如果您确实将其合并,请根据您的需要选择父 ID 排序--first-parent
以便将来工作。
或者,您可以使用更高级别的 git 命令来完成此操作。例如,如果您don't希望它是(并且类似于)合并,您可以简单地开始Branch_A
,删除所有内容(从索引和工作树中删除整个树),从提交中重新填充所有内容P
(根据提交创建新的索引内容和工作树P
),然后提交:
$ git checkout Branch_A
$ git rm -rf . # cd to top dir first if needed
$ git checkout Branch_B -- . # index and work tree = commit P
$ git commit
或者,将上述操作作为真正的合并进行:请参阅答案这个问题 https://stackoverflow.com/q/28573000/1256452.