这是我遇到的常见情况,我正在寻找一个干净的解决方案。在git分支上做一些工作(我的第一个工作)推高到github开始一个新的分支(一些进一步的工作),基于…
清洁器 是在旁观者/工人的眼睛(或手?),但你可以使用 git rebase --onto 分开 承诺复制 从 把副本放在哪里 。
git rebase --onto
记住这一点 git rebase 手段: 1 我有一个线性的提交链,如图1所示,我想复制到一个新的线性提交链,如图2所示。一旦复制完成,我希望我的分支名称指向最后复制的承诺。原本的 A-B-C 连链不再有用,即使它仍然存在。
git rebase
A-B-C
[drawing 1] ...--o--*--o <-- upstream/master \ A--B--C <-- topic [drawing 2] ...--o--*--o <-- upstream/master \ A'-B'-C' <-- topic
原始提交和副本之间的区别在于原始提交基于提交 * , 哪一个 是 小费 upstream/master 之前。副本基于(新)提示 upstream/master 。词组 基于 这里有两个含义: 父母 承诺 A 提交 * 但是 父母 承诺 A' 是后来的提交,而且是 快照 承诺 A 是 * - 一些变化而一些变化 快照 承诺 A' 补充说 相同 改变了 后来 承诺。
*
upstream/master
A
A'
因为我们使用我们闪亮的新提交 A' (有不同的哈希)有利于旧的沉闷 A ,然后我们需要复制 B 至 B' ,和 C 至 C' ,一旦我们完成,我们需要我们的名字 topic 指出不要 C 但到最后一次复制的提交, C' 。
B
B'
C
C'
topic
平原老 git rebase 就是这样。我们说:
git checkout topic; git rebase upstream/master
告诉Git:
o
但是,在你的新案例中,你有:
...--o--* <-- upstream/master \ A--B--C <-- feature1 \ D--E--F--G <-- feature2
在他们的上游,他们没有带你的 A-B-C 链。相反,他们使自己与众不同 ABC 壁球提交。您从上游存储库中抓取它,因此您现在拥有:
ABC
...--o--*--ABC <-- upstream/master \ A--B--C <-- feature1 \ D--E--F--G <-- feature2
如果你只是跑 git checkout feature2; git rebase upstream/master ,你的Git将枚举提交 G-F-E-D-C-B-A-*-... ,列举 ABC-*-... ,从第一个中减去第二个,并留下复制指令 G-F-E-D-C-B-A 链。
git checkout feature2; git rebase upstream/master
G-F-E-D-C-B-A-*-...
ABC-*-...
G-F-E-D-C-B-A
发烧友指挥是:
git checkout feature2 git rebase --onto upstream/master feature1
这样做是分开的 目标 论证 - 他把Git开始抄袭的地方 限制 论点。该 目标 就是现在 upstream/master (Git文档称之为 到 参数)。该 限制 争论现在 feature1 。您可以使用提交的原始哈希ID C 如果你更喜欢。 Git只需要知道: 我在哪里开始敲除 - 这些提交枚举? (令人困惑的是,Git文档称之为 上游 参数)。
feature1
正如你所看到的,这现在敲出了 C-B-A-* 承诺而不仅仅是 * 提交,以便在复制后,您有:
C-B-A-*
D'-E'-F'-G' [in progress] / ...--o--*--ABC <-- upstream/master \ A--B--C <-- feature1 \ D--E--F--G <-- feature2
现在Git可以剥掉标签 feature2 离 G 并坚持下去 G2 代替。
feature2
G
G2
1 从技术上讲,还有更多 git rebase 特别是现在有了新奇 --rebase-merges 选项。这个 我有一个线性的提交链 还是它的 主要 但是,请使用。
--rebase-merges
作为一个很好的奖励,rebase通常可以告诉他们是否已经拿走了你的 A-B-C 链并将其复制到自己的 A'-B'-C' 链。但那只是 平时 。 Rebase可以 决不 告诉他们他们已经拿走了你的 A-B-C 并把它压成了自己的 ABC ,所以对于那种情况你会坚持下去 --onto 。
A'-B'-C'
--onto