当git使用一些共享历史记录重新定义两个分支时,是否有一种简单的方法可以使共同历史保持常见?

jon*_*rry 19 git git-rebase

假设我们有以下修订图:

A-X-Z--B
     \
      \-C
Run Code Online (Sandbox Code Playgroud)

在B和C之前使用A.进一步假设我从上游重新绑定A,创建一个新的提交A*,然后将B和C重新绑定到A*上.生成的修订图如下:

A*-X'-Z'-B
 \
  \-X"-Z"-C
Run Code Online (Sandbox Code Playgroud)

请注意,不再共享共享历史记录.有没有一种简单的方法可以解决这个问题,除了说,重新定义B然后明确地将C重新定位到Z'.换句话说,是否有更好的方法可以同时自动修改多个分支以保留共享历史记录?只是人为地在分割点放置一个标记,或者手动检查图形以找出修改C以保留共享历史记录的提交的sha1似乎有点尴尬,更不用说开放可能性了错误,特别是因为我必须在每次改变时都这样做,直到我检查上游分支的变化.

Ada*_*ruk 16

git rebase --committer-date-is-author-date --preserve-merges --onto A* A C
git rebase --committer-date-is-author-date --preserve-merges --onto A* A B
Run Code Online (Sandbox Code Playgroud)

这应该保持公共提交具有相同的sha1并保留任何合并.在这种情况下,不需要保留合并,但是这将成为一个不太重要的历史问题.

要对其历史记录中包含A的所有分支执行此操作,请执

git branch --contains A | xargs -n 1 git rebase --committer-date-is-author-date --preserve-merges --onto A* A 
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

更新:

这可能是更清晰的语法:

for branch in $(git branch --contains A); do git rebase --committer-date-is-author-date --preserve-merges --onto A* A $branch; done
Run Code Online (Sandbox Code Playgroud)

  • 有一天,我将不得不坐下来理解这一切.与此同时,这是一场噩梦. (2认同)