【发布时间】:2013-08-06 19:28:17
【问题描述】:
如果您只想拉取一些提交而不是全部提交,会发生什么?
假设你有一个存储库 Foo,并将该存储库分叉为 Bar。然后你向 Bar 提交 1 和 2。我只想将提交 2 拉回 Foo,我该怎么做?
我使用 bitbucket 作为 git 主机,所以我很确定我需要在命令行上执行此操作。谢谢。
【问题讨论】:
标签: git command-line bitbucket
如果您只想拉取一些提交而不是全部提交,会发生什么?
假设你有一个存储库 Foo,并将该存储库分叉为 Bar。然后你向 Bar 提交 1 和 2。我只想将提交 2 拉回 Foo,我该怎么做?
我使用 bitbucket 作为 git 主机,所以我很确定我需要在命令行上执行此操作。谢谢。
【问题讨论】:
标签: git command-line bitbucket
我认为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 并在其间创建新提交)、编辑提交消息、更改提交内容好像你是第一次提交它们等等。
用这种方式重写历史是完全可以的,只要你还没有推送并且它仍然是私有的。这就像在出版之前编辑一部小说,所以它更有意义,更容易阅读并且错误更少。 (例如,您需要更正错误,但读者不需要知道何时您更正了它,如果它尚未发布。)
【讨论】:
提交 2 是在提交 1 之上进行的。这意味着它可能具有依赖关系。你可以使用git cherry-pick <commit2> 或更好,如果 Bar 贡献者将在 Foo 合并库之上重新提交 commit2,然后将其作为独立的拉取请求重新提交。
【讨论】: