为什么GitHub允许提前提交分支&;是否隐藏但不包含要合并的更改?
最近合并了一个分支,其中包含一个3行修复程序。第二天,提交了一个分支请求,其中包含3行修复的2行。在最初合并的分支后面,有几次提交。这棵树看起来像为什么GitHub允许提前提交分支&;是否隐藏但不包含要合并的更改?,git,github,git-diff,Git,Github,Git Diff,最近合并了一个分支,其中包含一个3行修复程序。第二天,提交了一个分支请求,其中包含3行修复的2行。在最初合并的分支后面,有几次提交。这棵树看起来像 A1--A2--A3-------B3--C4 \ \ / / \ A3--B3 / \ / A2------C3 因此B3将包含3行补丁,C3将包含2行补丁。当我去检查C4时,它显示提交的差异,尽管技术上没有差异。事实上,在执行交互式重新基址时,重新基
A1--A2--A3-------B3--C4
\ \ / /
\ A3--B3 /
\ /
A2------C3
因此B3将包含3行补丁,C3将包含2行补丁。当我去检查C4时,它显示提交的差异,尽管技术上没有差异。事实上,在执行交互式重新基址时,重新基址将停止并说这是一个空提交
我知道git允许合并空提交,但我感到困惑的是:
A2
、A3
、和B3
,这意味着您的图表是错误的,我们应该有,例如:
A1--A2--A3-------B5--C4
\ \ / /
\ B3--B4 /
\ /
C2------C3
或许:
A1--A2--A3-------B4--C4
\ \ / /
\ ----B3 /
\ /
--------C3
最后,在开始之前,从Git的角度来看,将这些东西标记为An
、Bn
和Cn
s的序列并不是真正有用的,因为在查看和合并提交时,哪个分支包含提交是无关的。重要的是提交本身及其父/子关系分支名称仅适用于此处的人类。:-)让我把它重新画成:
...--A--B--C------H--I <-- branchname
\ \ / /
\ D--E /
\ /
F----G
当branchname
指向C
时,然后:
git merge --no-ff <identifier-selecting-E>
我们可以运行git签出功能
,然后运行git-rebase-branchname
(带或不带——交互式
)。Git将通过从G
开始向后工作,从H开始向后工作,枚举从功能
可访问的提交,而从分支名
无法访问这些提交。这两个“向后工作”步骤在提交B
时结合在一起,因此不会复制B
,也不会复制任何较早的提交。这样就可以按顺序复制提交的F
和G
F
的副本可能正好起作用,给出:
...--A--B--C------H <-- branchname
\ \ / \
\ D--E F' <-- HEAD
\
F----G <-- feature
一切都完成了
2git-rebase-i
有一个额外的标志,--preserve
或-p
,声称保留合并。事实并非如此:它实际上重新执行合并。也就是说,它复制足够的提交来设置合并的条件,然后运行git merge
来进行新的合并。如果您以前解决过冲突,那么您很可能不得不再次这样做。即使您以前不必解决冲突,此时也可能需要解决。如果您使用git-merge进行了早期合并--no-commit
,然后编辑内容,然后使用git-merge--continue
或git-commit
,以生成所谓的邪恶合并,git不知道您这样做了,并进行了一次新的非邪恶合并,从而消除了您的所有偷偷摸摸行为。如果这种偷偷摸摸的行为实际上是件好事,那么尽管有“邪恶合并”这个词,你还是会失去它。你如何看待提交C4
?(具体来说,您使用的是gitshow
,还是其他命令,或者GUI,或者其他什么?)
...--A--B--C------H <-- branchname
\ \ /
\ D--E
\
F----G <-- feature
...--A--B--C------H <-- branchname
\ \ / \
\ D--E F' <-- HEAD
\
F----G <-- feature
...--A--B--C------H <-- branchname
\ \ / \
\ D--E F' <-- feature (HEAD)
\
F----G <-- ORIG_HEAD