作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下场景:
A -- B -- C -- D -- H master
\ /
E -- F -- G topicA
\
I -- J -- K topicB
topicA
并入
master
使用 --squash 开关,这意味着
master
不知道历史
topicA
.
master
进入
topicB
然后做一个
diff master...topicB
差异搞砸了,包含许多不应该存在的更改或撤消。
master
进入
topicA
然后
topicA
进入
topicB
在做上一段所说的事情之前。但是,有时这是不可能的(例如,分支被删除)并且我以很多冲突结束。
rebase --onto master topicA topicB
正确的解决方案?
最佳答案
如 DavidN said in a comment ,你的计划看起来很合理。
(剩下的内容太长太乱了;它是在其他任务之间/期间写的。)
题外话和细节
自 H
由 git merge --squash
创建,画错了。它应该是:
A -- B -- C -- D -- H master
\
E -- F -- G topicA
\
I -- J -- K topicB
H
与
E--F--G
无关序列,至少不是在任何 Git 检测到的意义上。提交
H
的内容受
E--F--G
中发生的任何事情的影响序列(当然,根据
C--D
序列中发生的任何事情)但据 Git 现在所知,有人来写
H
连看都不看
E--F--G
.
If I now merge
master
intotopicB
A--B--C---D----H <-- master (still points to H)
\ \
E--F--G \ <-- topicA (still points to G)
\ \
I--J--K--L <-- topicB (points to new L)
L
,它必须 merge 提交
H
和
K
.为此,它必须找到它们的 merge 基础(在某些情况下可能有多个 merge 基础,但这里只有一个)。
H
和
K
)的提交,这些起始提交都可以访问。
H
开始和
K
自己先。
H
可从
H
到达(当然)但不是来自
K
.
K
可从
K
到达(当然)但不是来自
H
.现在我们可以查看
D
对比
H
和
K
:
D
可从
H
到达但不是来自
K
.现在我们可以查看
J
,但无法从
H
访问.现在我们考虑
C
和
I
, 和
F
, 和
E
,但直到我们一路回到提交
B
我们发现可以从
H
访问提交和
K
.提交
A
也可以,但它离
H
都远了和
K
,所以提交
B
是 merge 基础。
git diff B H
git diff B K
B
开始的更改至
H
.当然,
H
有我们在
C
中更改的内容和
D
,加上我们在
E
中所做的任何更改,
F
, 和
G
.第二个差异显示了我们从
B
开始的更改至
K
.当然,
K
有我们在
E
中更改的内容,加上我们在
I--J--K
中所做的任何更改.
E
中所做的更改两次,但 Git 通常——不总是,但通常——能很好地注意到这一点,并且只接收一次更改。所以提交
L
可能拥有之前每次提交的所有内容,只完成一次。
and then do a
diff master...topicB
...
语法,而不是两点
..
句法。我不确定你在这里打算做什么,但三点语法本质上意味着“找到(或一个) merge 基础”。那么让我们再次进行这个练习:
master
仍然指向提交
H
和
topicB
现在指向新的 merge 提交
L
,我们找到了
H
的 merge 基和
L
,现在我们有一个真正的 merge (对我们来说没有这种愚蠢的“ Squash merge ”假 merge 东西,不可能!)。
H
开始和
L
自己先。
L
可从
L
到达(当然)但不是来自
H
.
H
可从
H
到达(当然)也来自
L
.这意味着
H
的 merge 基础和
L
是
H
:
master
的 merge 基础和
topicB
是主人。
...
diff master...topicB
master
位于三点的左侧,它被替换为 merge 基础,即提交
H
.三点的右侧被解析为其提交,即提交
L
.然后差异会向您显示
H
之间的任何不同。和
L
.
git diff master..topicB
相同, 与
git diff master topicB
意思相同: 比较提交
H
和
L
, 以该顺序。
H
而做了可怕的假 Squash merge 。 .真正的 merge 修复了这个问题,至少对于
H
对比
L
.
git merge --squash
技术。我们新提交的内容
L
将与我们进行了真正的 merge 相同,但图形会有所不同:
A--B--C---D----H <-- master (still points to H)
\
E--F--G <-- topicA (still points to G)
\
I--J--K--L <-- topicB (points to new L)
diff master...topicB
H
之间的 merge 基数。和
L
,但现在
L
不指向两者
K
和
H
,但仅限于
K
.都没有
H
也不是
L
是 merge 基础。都没有
D
也不是
J
要么工作:我们不能倒退到
D
来自
L
,我们不能倒退到
J
来自
H
.实际上, merge 基础提交再次提交
B
,所以这意味着同样的事情:
git diff B L
the diff is messed up and contains a lot of changes or undoings which shouldn't be there.
In that case, I usually merge
master
intotopicA
and thentopicA
intotopicB
before doing what was said in the previous paragraph. However, sometimes that it's not possible (e.g. the branch was deleted) and I end with a lot of conflicts.
push
和
fetch
;等等。如果提交受到其他方式的保护——通过真正的 merge 的可达性,或者来自另一个分支或标签名称的可达性,或者其他什么——它们会留下来。如果您可以通过哈希 ID 找到它们,则可以将它们带回来。
rebase
案例,如果您可以通过
git log
找到它们,你可以剪掉它们。稍后我们将看到这一点。
git rebase
Is
rebase --onto master topicA topicB
the right solution?
git rebase
,您可以复制这些其他链—您的
topicB
,在这种情况下 - 指向新链,然后将标签 (
topicB
) 指向复制链的尖端。你想要复制的提交是那些没有被压缩的提交:这里是
I--J--K
链。使用
topicA
如
<upstream>
论据
git rebase
将选择正确的提交集。请注意
topicA
达到提交
G
,
F
,
E
,
B
, 和
A
, 而
topicB
到达
K
,
J
,
I
,
F
,
E
, 等等;所以使用
topicA
如
<upstream>
从
F
砍掉所有东西在后面,但随后需要显式
--onto
你提供的。
topicA
被删除了,你仍然可以做这个 rebase,它只是变得更棘手。您需要做的是指定任一提交
G
或
F
通过它们的散列 ID,以便切断提交
F
和更早。
G
的哈希ID从难以找到(GC 没有删除它,但无法从任何实时引用访问)到不存在(GC 已删除它)。
F
的 ID然而,就在
topicB
中链条:
K
的 parent 是
J
,
J
的 parent 是
I
, 和
I
的 parent 是
F
.问题是
没有简单的方法可以确定提交 F
位于早先 git merge --squash
的链中的一组提交中处理。
关于git - 如何在父级 merge 后处理主题分支的 merge ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644232/
我是一名优秀的程序员,十分优秀!