我有以下提交A-> B-> C-> D。如果我推动D的SHA,我知道它也需要A,B,C。
我的要求是一个bash脚本,它重新定义最后一次提交并使其成为第一个,因此它不会有任何依赖。
因此,A-> B-> C-> D应该变为D-> A-> B-> C,以便我可以在推送中使用D& SHA。
我已多次尝试过,但我无法在不破坏任何事情的情况下完成任务。
您之前是否已经完成此操作,或者您对如何在bash脚本中执行此操作有任何想法,以便轻松重复使用?
答案 0 :(得分:0)
对此没有完全通用的解决方案,因为将D
与C
进行比较将取决于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
(单数)。
如何自动化复数sheep
为sheep
但复数fox
为foxes
的动词以及动词编号(jumps
vs jump
)必须与名词匹配吗?
除此之外,一般来说,篮板只是一系列的挑选操作。要重现A
,然后B
,然后C
,然后D
序列在一些新基础上,你挑选提交A
(进行新的提交,A'
),然后挑选B
到A'
上B'
,然后挑选C
到B'
,依此类推。要更改订单,只需更改樱桃采摘操作的顺序。
每个提交都可以用分支或标记名称标记,所以如果你有这个:
... - 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
现在让我们挑选A
到C
,但添加另一个分支标签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
,看起来好像提交A
到D
已经消失了(他们不是,真的,因为git保持不变默认情况下,周围的事情为30天),一旦我们完成,我们就可以重命名tmp
和/或tmp2
。
每个樱桃挑选都需要人工干预(手动修复单数复数或其他),所以虽然你可以自动完成其中的一些,但你必须准备好做一些关于失败的事情。它也很奇怪(如评论中所述)你必须反复这样做:它表明你的工作流程中有些奇怪。