你能“变基”从远端分支提交?

问题描述 投票:0回答:1

我已经分叉的存储库,要保持并更改了很长一段时间。这些变化将不会被合并回原来的回购协议(OR)。但是,我想从或任何新的变化来拉。当添加这些提交到我的仓库,我不想多合并提交;如果有冲突,我知道他们是不可避免的。但大多数提交的应该是干净的合并。

有没有一种方法,以“重订”从OR这些提交?

我认为git cherry-pick一种方法可以做到这一点,但或将有,我不想摘樱桃每一次向它提出的许多变化。

我想过退房OR /主,重订在我的Dev分支的顶部,然后FF把它合并到我的Dev分支。

git checkout -b ORmaster OR/master
git rebase -i dev
git checkout dev
git merge --ff-only ORmaster

但是,这意味着我想从OR /主合并每一次,我要检查出一个新的分支,然后重复此。

是否有这样做的更简单的方法?

PS:我也不能确定如何字标题。如果有人能字更好,请让我知道。

编辑:我已经添加了什么,我想,我希望发生的事情。

A--B--C                   <-- OR/master, origin/master, master

我想补充一些变化添加到我的分支

A--B--C                   <-- OR/master
       \
        D--E--F           <-- master

他人修改,以OR /主。

A--B--C--G                <-- OR/master
       \
        D--E--F           <-- master

我想这些变化,所以我想将它们应用到矿山

A--B--C--G                <-- OR/master
       \
        D--E--F--G'       <-- master

我不想再拍变化,有人提出更改或

A--B--C--G--I             <-- OR/master
       \
        D--E--F--G'-H     <-- master

我想套用或更改我的分支。

A--B--C--G--I             <-- OR/master
       \
        D--E--F--G'-H--I' <-- master

据我了解,这将防止任何合并提交,同时保持我的回购跟上时代的。

git version-control
1个回答
5
投票

我根据所编辑的问题,修订此。这当然可以做到这一点,你可以更容易一点做樱桃采摘自动,但你会打偶尔的绊脚石,其中合并会更好。

首先,让我们来看看如何自动樱桃采摘过程。在假设OR库永远只增加了提交,如在图中更新的问题,我们需要的是某种形式的标记,让我们知道哪些承诺是最后一个,我们的樱桃采摘较早。

此标记可以采取任何形式,并有一个内置的一个可能发球,特别是引用日志为OR/master本身。但是,为了说明如果不出意外,并在引用日志到期或其他任何可能引起的存在更多的灵活性问题,我们可以使用一个明确的分支或标记名称。一个分支的名字是最合适的,因为我们将在所有Git分支预期名字移动通常的方式将其移动。

让我们举例来说,此阶段:

A--B--C--G                <-- OR/master
       \
        D--E--F--G'       <-- master

(后一个樱桃挑选)。要记住,我们在G明确不放过,我们应该建立一个分支名指向G

A--B--C--G                <-- marker, OR/master
       \
        D--E--F--G'       <-- master

当我们进入下一个时间有一些更新,不要紧,我们有多少提交加入到我们自己的'主,因为我们将有:

           I              <-- OR/master
          /
A--B--C--G                <-- marker
       \
        ...

在提交复制,因此只是marker..OR/master,我们可以运行:

git checkout master                 # if needed
git cherry-pick marker..OR/master   # copy the new commits

当这个成功了,快进我们markerOR/master我们喜欢的任何方式,包括相当聪明的(如果有点吓人):

git push . OR/master:marker

(这将拒绝做任何事情,除非更新marker是快进操作)。

But this can go wrong

因为当它出现问题的说明,考虑是否OR/master获得了一系列的提交,其中包括合并的会发生什么:

       ...--L
             \
           I--M--N        <-- OR/master
          /
A--B--C--G                <-- marker
       \
        ...

现在提交,marker..OR/master的范围,包括提交M和第二父母L和任何去L这不是从G到达之前。我们应该副本提交?我们可以从字面上摘樱桃M,只要我们有-m说法,这真的会永远做单独-m 1 - 这可能是你的情况下工作。但它是一个问题,你应该知道它(要知道,你打算做些什么什么)。如果你使用git merge,正如我在下面原来的建议,这不是一个问题:一切只是工作的方式应该自动。

(原始答案是分界线下方。)


所有git rebase确实是拷贝犯(仿佛git cherry-pick - 有时字面上git cherry-pick),然后将一个分支的名字。

你总是可以复制任何承诺,你有,那么是的,你可以重订,你从其他一些Git仓库获得的提交。这不会帮助你与你的实际目标,虽然。你应该做使用git merge是。

看看这样说:你的叉子只是一个克隆,和您的前叉的克隆是你的副本的副本。除了有一个始终保持上线的地方藏匿自己的clone(刀叉),你基本上只克隆原来的克隆。因此,我们可以标记的东西,在你的本地库是这样的:

...--F--G--H   <-- OR/master, origin/master, master

其中每个大写字母代表一个唯一的提交散列ID。 (我们会照顾26条用完了,所以你可以看到为什么Git的实际哈希ID是如此之大又丑,他们必须是唯一的永恒,跨越每一个承诺大家能做出这些仓库,过去或将来)。

现在,在某些时候,你做出自己的承诺(S)和推他们origin(你自己的叉),所以你现在有:

...--F--G--H   <-- OR/master
            \
             I--J   <-- master, origin/master

origin/master总是会以符合您自己mastergit push origin master后,所以我们甚至不需要在这里管它。

同时,虽然,谁拥有,收纳库的人让自己的提交,使git fetch OR后,你有这样的:

...--F--G--H--K--L   <-- OR/master
            \
             I--J   <-- master

您可以复制其提交KLK'L',让您有:

...--F--G--H--K--L   <-- OR/master
            \
             I--J   <-- master
                 \
                  K'-L'  <-- dev

然后你就可以让你有快进你的master

...--F--G--H--K--L   <-- OR/master
            \
             I--J--K'-L'  <-- dev, master

最终,他们会让更多的提交:

...--F--G--H--K--L--N--O   <-- OR/master
            \
             I--J--K'-L'  <-- dev, master

(我已经跳过M保留它),也许你也一样:

...--F--G--H--K--L--N--O   <-- OR/master
            \
             I--J--K'-L'  <-- dev
                       \
                        P--Q   <-- master

但如果你现在git checkout devgit rebase OR/master,这只是要复制您IJI'J'和复制你的K'这是他们K的副本到一个新的K"等:

                         I'-J'-K"-L"  <-- dev
                        /
...--F--G--H--K--L--N--O   <-- OR/master
            \
             I--J--K'-L'
                       \
                        P--Q   <-- master

这真的是没有得到你的任何地方。

如果合并,但是,你得到这样的:

...--F--G--H--K--L   <-- OR/master
            \     \
             I--J--M   <-- master

现在,他们使自己的提交和你做你的:

...--F--G--H--K--L----N---O   <-- OR/master
            \     \
             I--J--M--P--Q   <-- master

再次,你只是git merge OR/master纳入其工作纳入你的工作:

...--F--G--H--K--L----N---O   <-- OR/master
            \     \        \
             I--J--M--P--Q--R   <-- master

当你这样做合并,你必须解决任何合并冲突一次。如果衍合,你将不得不再次重新解决过去所有的合并冲突。 (使用git rerere可以与帮助,但如何有帮助的,这是一个限制)的原因,你只需要一次解决这些问题有两方面:

  • 你让一个新的承诺,因此,只有一个地方发生冲突的地方。
  • 您所做的合并提交M,后来R之后,接下来的合并与普通的合并基础,这是L开始,然后O:你只需要看看事情自上次提交共享他们所做的。

这是合并提交本身建立更新的共享提交的合并基础。如果没有合并提交,你没有得到更新的合并基础。合并的提交是好的;拥抱他们。 :-)

© www.soinside.com 2019 - 2024. All rights reserved.