如何使用 git 合并来自不同存储库的拉取请求(或提交)?

How to merge a pull request (or commit) from a different repository, using git?

我已经将 GitHub 存储库 Ashallow 克隆(fork)到我自己的存储库中 B。因此,B 没有提交历史记录。但是,我想在回购 A 中添加一个未合并(打开)的 pull request X到 B,并且仍然让它显示为正确的合并拉取请求,但没有添加额外的分支和添加的提交历史记录。 (X 基于特定的 commit YbranchC C Z.)

如何使用 CLI 中的 git 执行此操作?


考虑到合并 pull-request(来自 A)和选择 commit(来自 C)看似等价,我想应该有几种不同的方法来完成同样的事情。

我看过很多类似的问题,但它们并没有完全解决问题,因为它们通常涉及首先以各种方式获取所有提交,或者不完整。我看过:

我就是这样做的。

  1. 从本地的 repo 中提取所有需要的更改:
    git pull.

  2. 更改来源 URL:
    git remote set-url origin https://url.com.

  3. 切换你要推送代码的分支:
    git checkout BRANCHgit checkout -b BRANCH
    (我总是对此感到困惑)。

  4. (可选)设置上游:
    git branch --set-upstream-to=origin/BRANCH

  5. 隐藏:
    git stash

  6. 提交更改:
    git commit -m "feat: moving branch"

  7. 终于全力以赴:
    git push

希望这对您有所帮助。如果您发现任何问题,请告诉我。

樱桃挑选提交

事实上,我要求的是所谓的 cherry picking 提交。 但是,由于我自己的 shallow repo BC 中的原始提交 Y 的不同提交历史,这可能是不可能的( ?) 让它 看起来 "proper merged pull request",至少在 GitHubs Network 图表的意义上不是这样。
(如果有人对此有其他解决方案,请发表评论。)

该过程已被详细记录,在这种情况下,最简单的解决方案是:

git fetch git@github.com:<USERNAME>/<REPO-C> <BRANCH-Z> --no-tags
git cherry-pick <commit-Y>
git push origin master

这是迄今为止最简单的方法,因为它不需要 add/change 获取来源。

使用 <id>

拉取特定 PR

您也可以使用 PR 的 id:

直接拉取 PR
git pull https://github.com/{upstream/project} refs/pull/{id}/head

有关其他选项,请参阅:

  • How to apply unmerged upstream pull requests from other forks into my fork?