3

如果您只想拉取一些提交而不是全部,会发生什么?

假设你有一个回购,Foo,并将该回购分叉为 Bar。然后你向 Bar 提交 1 和 2。我只想将提交 2 拉回 Foo,我该怎么做?

我使用 bitbucket 作为 git 主机,所以我很确定我需要在命令行上执行此操作。谢谢。

4

2 回答 2

5

我认为git cherry-pick这里可能更好,但我喜欢使用git rebase -i,部分原因是它用途广泛,您可以重用知识。

(1) 首先,创建一个新分支(将被 Pull Requested):

git checkout -b commit2_PR

(2)然后,交互式变基(-i用于交互式):

git rebase -i commit2_PR^^ commit2_PR

注意:第一个参数需要是最后一个(最旧的)感兴趣的提交的父级。

(3) 你的编辑器会被最后的 2 次提交激发 - 并且底部的说明非常有用。现在删除 Pull Request 中不需要的提交的行(在这种情况下,删除提交 1,只留下提交 2)。现在,保存并退出,然后git rebase就可以了。

(3.1) 如果存在合并冲突,它将停止,您必须按照它提供的说明以通常的方式修复它。这种情况出人意料地经常发生,在干预历史时。

(4) 最后,这个新的分支commit2_PR——你拉取请求那个分支。完毕。


我强烈建议阅读 rebase(和/或谷歌搜索)的手册页,并尝试几次。您可以对git rebase参数进行简化,但我将把它留给您阅读联机帮助页,而不是在这里复杂化......不要害怕!请注意,因为您已经创建了一个新分支,所以无论您是否把它弄糟或有多糟糕 - 只需删除该分支并重新开始。原来的分支还在,没有改变。

您可以做一些很棒的事情来使您的 Pull Request 更易于阅读 - 将提交合并(组合)、重新排序提交、单独提交(git add -p在其间添加和创建新提交)、编辑提交消息、更改提交内容,就像您正在提交它们一样第一次等

以这种方式重写历史是完全可以的,只要你还没有推送并且它仍然是私有的。这就像在出版之前编辑一部小说,所以它更有意义,更容易阅读并且错误更少。(例如,您需要更正一个错误,但读者不需要知道您何时更正它,如果它尚未发布。)

于 2013-08-06T00:58:59.313 回答
0

提交 2 是在提交 1 之上进行的。这意味着它可能具有依赖关系。git cherry-pick <commit2>如果 Bar 贡献者将在 Foo 合并库之上重新设置 commit2 然后将其作为独立的拉取请求重新提交,您可以使用或更好。

于 2013-08-05T23:13:57.883 回答