Git fork-重新设置多个分支的基础-保留共享提交
我克隆了一个公共存储库。在我的本地存储库中,我有这样一个分支结构,其中字母表示提交:Git fork-重新设置多个分支的基础-保留共享提交,git,github,rebase,Git,Github,Rebase,我克隆了一个公共存储库。在我的本地存储库中,我有这样一个分支结构,其中字母表示提交: [public tag: v1] - A - B - C [myBranch1] \ \- D [myBranch2] 公共回购已经移动并发布了一个新标签“v2”。我想将我的分支重新设置到新版本上,因此我做到了: git rebase --onto v2 v1 myBranch1 git rebase --onto
[public tag: v1] - A - B - C [myBranch1]
\
\- D [myBranch2]
公共回购已经移动并发布了一个新标签“v2”。我想将我的分支重新设置到新版本上,因此我做到了:
git rebase --onto v2 v1 myBranch1
git rebase --onto v2 v1 myBranch2
这似乎是可行的,只是它创建了具有相同内容但散列码不同的提交A和B的不同副本:
[public tag: v2] - A' - B' - C' [myBranch1]
\
\A''- B''- D' [myBranch2]
我意识到我可以做一些更复杂的事情,比如:
git rebase --onto v2 v1 myBranch1
git rebase --onto myBranch1 B myBranch2
这应该会给我想要的结果,但是会更加复杂,特别是当我创建更多的分支时。当我搜索提交哈希代码时,它更容易出错,并且必须跟踪每个分支与另一个分支的分歧
1) 有没有更好的方法来实现这一结果?我想您可以建议其他工作流,但我非常确定这是我希望维护的分支/提交结构
2) 为什么“”和“”的哈希代码不同?它们不是将相同的差异/作者/时间戳应用于相同的基线/内容的产物吗?我知道这两个操作是作为两个独立的操作生成的,但我希望这些操作是确定性的,因此“冲突”(正确)。1)您可以使用合并基自动查找B
:
git merge-base myBranch1 myBranch2
我会给你B
2) Rebase并不是真正移动原始提交,而是复制它们,或者实际重放每个提交所造成的差异。重定基础的提交将始终具有新的哈希值
提交中的哈希不仅是版本控制的整个文件树的所有内容的校验和,也是父提交的哈希的校验和。因此,即使您复制相同的文件树(不太可能),您仍然会得到一个新的哈希,因为您有不同的父级。1)您可以使用合并基自动查找B
:
git merge-base myBranch1 myBranch2
我会给你B
2) Rebase并不是真正移动原始提交,而是复制它们,或者实际重放每个提交所造成的差异。重定基础的提交将始终具有新的哈希值
提交中的哈希不仅是版本控制的整个文件树的所有内容的校验和,也是父提交的哈希的校验和。因此,即使您复制相同的文件树(不太可能),您仍然会得到一个新的哈希值,因为您有不同的父级。[Klas Mellbourn抢先一步,我的答案只是在这一点上扩展了他的答案。]
值得一提的是,我看到了一些尝试“集体或集体重设基础”的方法,它们允许这种事情。它们都需要某种方法来选择首先要重设基础的分支,然后在现在重设基础的分支上重设其他“依赖”分支的基础
因此,答案如下:
没有,只是你可以自动完成。自动化程度如何完全是另一个问题。:-)我看过的剧本并没有他们应该的那么聪明。(自动化系统应覆盖所有分支,为每个分支计算适当的合并基数,并执行一组最小的重基/樱桃拾取操作,记录足够的“启动状态”。)要允许您在命中需要手动解析的点时执行--中止
或--继续
。这也需要延迟各个分支标签的移动。)
A'
与A'
具有不同的提交时间戳(如果它具有完全相同的提交元数据和相同的树,那么它实际上将成为相同的实际新提交)。因为,一旦A'
不同,其他一切都会不同
[Klas Mellbourn抢先一步,我的回答只是在这一点上扩大了他的范围。]
值得一提的是,我看到了一些尝试“集体或集体重设基础”的方法,它们允许这种事情。它们都需要某种方法来选择首先要重设基础的分支,然后在现在重设基础的分支上重设其他“依赖”分支的基础
因此,答案如下:
没有,只是你可以自动完成。自动化程度如何完全是另一个问题。:-)我看过的剧本并没有他们应该的那么聪明。(自动化系统应覆盖所有分支,为每个分支计算适当的合并基数,并执行一组最小的重基/樱桃拾取操作,记录足够的“启动状态”。)要允许您在命中需要手动解析的点时执行--中止
或--继续
。这也需要延迟各个分支标签的移动。)
A'
与A'
具有不同的提交时间戳(如果它具有完全相同的提交元数据和相同的树,那么它实际上将成为相同的实际新提交)。因为,一旦A'
不同,其他一切都会不同
因此,提交中列出的时间戳(对于“”和A都是相同的)与此无关?或者它也可能是相关的,但显然它还考虑了计算提交散列时的系统时间+1我必须在两个不同的提交上分别检查git cat file-p
,以确定哪些位是不同的,但我敢打赌,您看到的(相同)时间戳是“作者”时间戳,而不是(不同的)“提交者”时间戳。您是正确的。提交者的时间戳不同,因此散列也不同。输入的Thx:)那么提交中列出的时间戳(对于“”和A都是相同的)与此无关吗?或者它也可能是相关的,但显然它还考虑了计算提交散列时的系统时间+1我必须在两个不同的提交中的每一个上检查git cat file-p
,以确定哪些位是不同的,但我敢打赌,您使用的时间戳(相同)