2

我想问一下Git在以下场景中的合并:

branchA  -*-*-*-*-*
                   \
            branchB *-*-*-*

在这种情况下可以进行 git merge 并获得以下结果?

branchA  -*-*-*-*-*---------*
                   \       /
            branchB *-*-*-*

我想要获得的是在branchA 上进行一次合并提交,它包含来自branchB 的所有更改。我知道 git merge 命令中有 --squash 选项,但是我不确定这是否 100% 等同于标准合并。

因此,允许我阻止我的分支拓扑,而不仅仅是快进。

非常感谢您的帮助!

4

2 回答 2

3

尝试git merge branchb --no-ff(从brancha)。来自git-merge(1)

--no-ff

即使合并解析为快进,也要创建合并提交。

即使 git 意识到当前的 HEAD(分支 A,因为这是您将合并表单的地方)只是分支 B 上的提交的祖先,它也可以防止快进,而没有在分支 A 上并行发生任何更改.

于 2013-03-29T13:12:37.733 回答
1

不,您不能生成包含来自分支的所有更改的真正合并提交。git merge --squash将生成包含更改的单个提交,但它不会是合并提交。

Git 提交记录了存储库在给定时间的完整状态,而不是先前提交的更改。因此,当您稍后检查历史记录而不是创建提交时会产生差异。

However, if you use git commit --no-ff branchB to create the merge that will ensure that a commit is created even if it would be possible to do a fast-forward merge without creating a new commit. Then if you use git log -m --first-parent it would ignore the commits that were made on branchB making it appear that all of those changes were introduced by that merge commit, and the -m option would cause the full diff to be displayed for the merge commit (if diffs are otherwise being displayed).

于 2013-03-29T13:20:49.777 回答