Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git fork-重新设置多个分支的基础-保留共享提交_Git_Github_Rebase - Fatal编程技术网

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
    ,以确定哪些位是不同的,但我敢打赌,您使用的时间戳(相同)