如何在rebase-fashion中删除重复的提交

时间:2018-08-14 23:18:40

标签: git

我正在为仅具有master分支的存储库做出贡献。在本地,我在master分支上工作。当其他人的事情在那里提交时,我会在本地重新部署。但是,当我发送经过精心挑选的提交时,它们会通过一个自动系统运行,该系统不会使补丁内容保持完整,但会修改提交ID。

因此,当我从远程拉出时,我的本地提交与相同的提交(在不同的提交ID下)发生冲突。处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

实际上并没有最好的方法。但是,如果复制的(樱桃挑选的)提交中的补丁提交与原始提交中的补丁匹配(对许多樱桃挑选的提交(但不是全部)都是正确的),那么git cherrygit 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 loggit 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符号。

因为这非常有用,特别是对于4git 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 mybranchgit rev-list一起使用,或者使用sed来消除=的提交,而不是使用--cherry选项,但是到那时,这个想法应该要清楚。)

平等由git patch-id

决定

如果您需要比--cherry-mark --left-right更好的东西,则可以使用git patch-id命令自己构造它。这将读取标准输入,该标准输入可以通过运行git show来生成,并生成一个哈希ID,该哈希ID表示与提交的父对象的精简差异。

请注意,git patch-id甚至可以处理组合的差异,尽管复制合并通常很困难,甚至是不可能的。