是什么导致了冲突,我如何才能识别共享历史?
没有共享的历史(或者更确切地说,还不够)。没有什么可承认的,这就是为什么会有冲突。
关键是--squash
国旗:
$ git checkout B
$ git merge [release-commit-ID] --squash
第一步将您附加HEAD
到分支名称B
,检查名称B
标识的任何提交:
...--*--C--D--E <-- B (HEAD)
\
F--G--H <-- somebranch
这里名称B
标识了提交E
(这些字母中的每一个都代表真正的哈希 ID)。提交*
(我会命名为B
,但您为您的分支使用了该名称)是两个开发流分歧的点,这意味着当我们向后工作时(如 Git 所做的那样),这是它们汇合的点。你现在运行git merge --squash <hash>
where <hash>
identify commit F
, or G
, or H
,所以 Git 比较 commit*
的内容和 commit 的内容E
来找出你改变了什么:
git diff --find-renames <hash-of-*> <hash-of-E> # what we changed
并重复,说,G
:
git diff --find-renames <hash-of-*> <hash-of-G> # what they changed
Git 现在将这两组更改组合在一起,将组合的更改应用于 commit*
的内容,并进行新的提交。
如果您不使用,Git 会使用两个父--squash
项记录新提交:
...--*--C--D--E--I <-- B (HEAD)
\ /
F-------G--H <-- somebranch
现在这两行之间最近的共同起点是 commit G
。但如果你确实使用了 ,Git 只记录一个父--squash
级的新提交:
...--*--C--D--E--I <-- B (HEAD)
\
F--G--H <-- somebranch
现在共同的起点不变。所有的工作G
都在 commit 中I
,但是 commitI
不记得 为什么工作在那里。来自 commit的未来必须git merge
从 commitH
重新开始*
。
Git 不会阻止你在 branch 上进行开发somebranch
,但一般来说,在 a 之后git merge --squash
,你应该认为你合并的分支是“死的”并且完全停止使用它。一旦我们与我们合并G
,git merge --squash
我们应该完全停止使用F
和G
。这意味着我们也必须H
完全停止使用。如果H
有用,我们应该将它复制到一个新的、不同的提交中:
$ git checkout -b newbranch B
给我们:
...--*--C--D--E--I <-- B, newbranch (HEAD)
\ /
F-------G--H <-- somebranch
其次是:
$ git cherry-pick somebranch # or <hash of H>
复制H
到一个非常相似但不相同的提交H'
:
H' <-- newbranch (HEAD)
/
...--*--C--D--E--I <-- B
\ /
F-------G--H <-- somebranch
我们现在可以丢弃somebranch
:
$ git branch -D somebranch
如果我们愿意,可以重命名newbranch
为。somebranch
git rebase --onto
(请注意,我们可以使用, with一步完成复制名称移动的事情git checkout somebranch; git rebase --onto B <hash of G>
。但是,无论您如何操作,请注意git cherry-pick
不能复制合并提交,以及任何使用我们想要杀死的提交的人off-here the F-G-H
chain-必须执行这种杀死-复制-保存-保存的事情。所以在使用之前--squash
,请确保您了解所有含义。)