我正在为仅具有master分支的存储库做出贡献。在本地,我在master分支上工作。当其他人的事情在那里提交时,我会在本地重新部署。但是,当我发送经过精心挑选的提交时,它们会通过一个自动系统运行,该系统不会使补丁内容保持完整,但会修改提交ID。
因此,当我从远程拉出时,我的本地提交与相同的提交(在不同的提交ID下)发生冲突。处理这种情况的最佳方法是什么?
答案 0 :(得分:1)
实际上并没有最好的方法。但是,如果复制的(樱桃挑选的)提交中的补丁提交与原始提交中的补丁匹配(对许多樱桃挑选的提交(但不是全部)都是正确的),那么git cherry
或git rev-list --cherry-mark
可以找到这些。实际上,git rebase
会自动执行此操作。
要使用git rev-list --cherry-mark
,您需要使用三点对称差符号,例如:
git rev-list --cherry-mark --left-right A...B
由于A...B
表示查找所有可以从A
到达的提交,但不能找到B
,反之亦然,因此我们在某点进行了分叉:< / p>
...--o--*--1--2--3 <-- A
\
4--5--6 <-- B
,我们可以从1-2-3
获得提交系列A
,而从3-4-5
获得B
。 (可以同时提交*
和所有更早的版本。)将git log
或git rev-list
与三点符号一起使用将选择这六个提交。将--left-right
添加到git rev-list
标记每个提交哈希来自哪个侧:如果<
,则可以从A
到达该提交;如果>
,则可以从B
到达提交:
$ git rev-list --left-right A...B
<3...
<2...
<1...
>6...
>5...
>4...
例如,(假设提交1
的哈希ID以1
开头,依此类推)。
但是现在假设提交3
是提交4
的完美选择,因此从某种意义上讲,提交三个等于提交4。然后添加{{1 }}使Git在提交--cherry-mark
和=
前面显示一个3
符号。
因为这非常有用,特别是对于4
,git rebase
实际上具有忽略这样的提交的能力。如果我们要以某种方式告诉git rev-list
:
git rev-list
中的右侧提交(>
个);和A...B
我们将在=
端获得提交列表,这些列表仍应精选到B
端。实际上,这就是A
设计的目的:
--cherry
--cherry
的同义词;对...有用 将输出限制在我们这边的提交上,并标记那些 已被--right-only --cherry-mark --no-merges
应用于分支历史的另一侧,类似于git log --cherry upstream...mybranch
。
(基准代码使用git cherry upstream mybranch
与git rev-list
一起使用,或者使用sed
来消除=
的提交,而不是使用--cherry
选项,但是到那时,这个想法应该要清楚。)
git patch-id
如果您需要比--cherry-mark --left-right
更好的东西,则可以使用git patch-id
命令自己构造它。这将读取标准输入,该标准输入可以通过运行git show
来生成,并生成一个哈希ID,该哈希ID表示与提交的父对象的精简差异。
请注意,git patch-id
甚至可以处理组合的差异,尽管复制合并通常很困难,甚至是不可能的。