Git - 推送最后一次提交

时间:2014-11-18 21:33:16

标签: git commit rebase

我有以下提交A-> B-> C-> D。如果我推动D的SHA,我知道它也需要A,B,C。

我的要求是一个bash脚本,它重新定义最后一次提交并使其成为第一个,因此它不会有任何依赖。

因此,A-> B-> C-> D应该变为D-> A-> B-> C,以便我可以在推送中使用D& SHA。

我已多次尝试过,但我无法在不破坏任何事情的情况下完成任务。

您之前是否已经完成此操作,或者您对如何在bash脚本中执行此操作有任何想法,以便轻松重复使用?

1 个答案:

答案 0 :(得分:0)

对此没有完全通用的解决方案,因为将DC进行比较将取决于C中的内容,而后者又依赖于什么?在B,等等。作为一个愚蠢而简单的示例,假设C - vs - D包含此更改:

 The quick brown
-sheep
+foxes
 jump over the
 lazy dog.

但是,在版本A之前的版本中,它显示为:

 The quick brown
 sheep
 jumps over the
 lazy dog.

正确的调整无疑是让D使用单数,即您想要的更改现在用sheep替换fox(单数)。

如何自动化复数sheepsheep但复数foxfoxes的动词以及动词编号(jumps vs jump)必须与名词匹配吗?

除此之外,一般来说,篮板只是一系列的挑选操作。要重现A,然后B,然后C,然后D序列在一些新基础上,你挑选提交A(进行新的提交,A'),然后挑选BA'B',然后挑选CB',依此类推。要更改订单,只需更改樱桃采摘操作的顺序。

每个提交都可以用分支或标记名称标记,所以如果你有这个:

... - A - B - C - D   <-- yourbranch

我们希望这样做 - 让我们首先将...序列的结尾标记为提交o并将其称为start

$ git branch start yourbranch~4

... - o                   <-- start
        \
          A - B - C - D   <-- yourbranch

现在我们将D挑选到一个新的分支tmp上,我们从提交o开始创建它:

$ git checkout -b tmp start

... - o                   <-- start, tmp
        \
          A - B - C - D   <-- yourbranch

成功的挑选创建新提交D'

$ git cherry-pick yourbranch

         D'               <-- tmp
        /
... - o                   <-- start
        \
          A - B - C - D   <-- yourbranch

现在让我们挑选AC,但添加另一个分支标签tmp2

$ git checkout -b tmp2
$ git cherry-pick yourbranch~4..yourbranch~1   # pick A-C all at once

             A'- B'- C'   <-- tmp2
           /
         D'               <-- tmp
        /
... - o                   <-- start
        \
          A - B - C - D   <-- yourbranch

现在我们可以完全删除分支名称yourbranch,看起来好像提交AD已经消失了(他们不是,真的,因为git保持不变默认情况下,周围的事情为30天),一旦我们完成,我们就可以重命名tmp和/或tmp2

每个樱桃挑选都需要人工干预(手动修复单数复数或其他),所以虽然你可以自动完成其中的一些,但你必须准备好做一些关于失败的事情。它也很奇怪(如评论中所述)你必须反复这样做:它表明你的工作流程中有些奇怪。