我已经分叉的存储库,要保持并更改了很长一段时间。这些变化将不会被合并回原来的回购协议(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
据我了解,这将防止任何合并提交,同时保持我的回购跟上时代的。
我根据所编辑的问题,修订此。这当然可以做到这一点,你可以更容易一点做樱桃采摘自动,但你会打偶尔的绊脚石,其中合并会更好。
首先,让我们来看看如何自动樱桃采摘过程。在假设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
当这个成功了,快进我们marker
到OR/master
我们喜欢的任何方式,包括相当聪明的(如果有点吓人):
git push . OR/master:marker
(这将拒绝做任何事情,除非更新marker
是快进操作)。
因为当它出现问题的说明,考虑是否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
总是会以符合您自己master
你git push origin master
后,所以我们甚至不需要在这里管它。
同时,虽然,谁拥有,收纳库的人让自己的提交,使git fetch OR
后,你有这样的:
...--F--G--H--K--L <-- OR/master
\
I--J <-- master
您可以复制其提交K
和L
您K'
和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 dev
和git rebase OR/master
,这只是要复制您I
和J
到I'
和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
:你只需要看看事情自上次提交共享他们所做的。这是合并提交本身建立更新的共享提交的合并基础。如果没有合并提交,你没有得到更新的合并基础。合并的提交是好的;拥抱他们。 :-)