我正在从其他人的存储库中提取更改(出于宣泄的原因,我们将其称为“gitnoob”),其中的内容混合在一起。显然,他们一开始都是在主分支工作,然后才了解分支。它看起来有点像这样:
d - f <--- stuff
/ /
A - b - 1 - c - 2 - E <--- dev
这些数字是应该在另一个分支中的提交,如果我将它们 merge 到我自己的 dev
分支中,可能会破坏事情。 (稍后我会将它们从 upstream/dev
中提取 - upstream
是我们的共享父存储库 - 一旦它们 merge 到那里。)小写字母是提交应该是 stuff
的一部分,大写的是合法 merge 到 dev
中的提交。
理想情况下,我想在我这边清理这个问题——在本地拥有这样的东西:
b - c - d - f <--- stuff
/ /
A --------- E <--- dev
现在,stuff
无论如何都会发生所有与 stuff
相关的更改,因为 gitnoob/stuff
也将包含所有差异在 upstream/dev
和 gitnoob/dev
之间(合法的 dev
已经在我的 dev
中) > 分支)。问题是,这意味着 stuff
也会有提交 1
和 2
,这很可能会破坏事情。
我需要能够从gitnoob/stuff
中提取更改,而无需大量麻烦(并且,如果可能的话,无需将1和2放回那里,直到它们出现在上游),并让他们从我这里获取更改,而不会恢复或删除任何内容。
我该怎么做?或者我只是在 stuff
中使用 1 和 2?
最佳答案
所以基本上,您需要一个可以恢复 1
和 2
的 stuff
的私有(private)版本,但是您自己的 stuff 的公共(public)版本
仍然包含它供 gitnoob 从中提取。没有无缝的方法可以做到这一点,但实现它的一种方法是引入几个新分支:
...d-f <---stuff-upstream
\
g <---reverted-stuff
\
h <---my-stuff
您要做的就是创建一个恢复 1
和 2
的 reverted-stuff
分支。当您想要进行与 gitnoob 共享的更改时,您可以从 reverted-stuff
分支到 my-stuff
。在 my-stuff
上正常更改并提交。您也应该能够将您的 dev
merge 到 my-stuff
中。
当您准备好共享更改时,使用 git rebase --onto stuff-upstream reverted- 将
。这将删除 my-stuff
rebase 回 stuff-upstream
填充我的东西g
中的恢复,并使其看起来像 my-stuff
是直接从 stuff-upstream
分支的,允许 gitnoob 毫无恐惧地 pull .
当您从 gitnoob pull 时, pull 入 stuff-upstream
,然后将其 merge 到 reverted-stuff
。该 merge 将自动重新应用 g
,即您恢复 1
和 2
的位置。然后,您可以从 reverted-stuff
分支出一个新的 my-stuff
。
话虽这么说,如果 1
和 2
真的像你所说的那样有问题,那么你也可以通过将其从他的分支中取出来帮 gitnoob 一个忙。如果情况没那么糟糕,真的没有理由经历这一切。
关于git - 我如何在本地创建 "clean up"分支,而不破坏其他人的一切?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12096848/