从不同的存储库拉取请求

问题描述 投票:0回答:4

我不知道分叉和克隆是如何工作的。因此,为了复制别人的存储库并对其进行处理,我下载了存储库的文件(不使用源代码控制),创建了我自己的新存储库,然后将这些文件提交给它。

我想将我的存储库的主控请求拉到原始存储库,但我不能,因为它不是分叉。此外 - git 甚至不知道它们来自同一源,因此如果我签出原始存储库,打开一个新的分支,将所有文件从我的私人存储库复制粘贴到新的分支,然后将其请求拉回来中,它将显示为一个巨大的提交,并且我将丢失旧存储库上的所有提交和评论历史记录,这将是可怕的。

有没有办法让我将我的更改拉回原始存储库而不丢失我复制的存储库的所有历史记录?

git repository fork pull-request pull
4个回答
8
投票
  1. 确保您的本地计算机上有一份更改的副本(我将其称为“复制的存储库”),并删除 GitHub 上的项目(如果您创建了该项目)。
  2. 在上游项目的 GitHub 页面上单击“Fork”。
  3. 分叉过程完成后,将该存储库克隆到本地计算机(我将其称为“分叉存储库”)。
  4. 将所有更改的文件从复制的存储库复制到分叉的存储库中。
  5. 验证它是否按您的预期工作,然后使用
    git status
    git diff
    查看更改并提交它们。
  6. 将这些更改推送回 GitHub。
  7. 稍后,克隆存储库的 GitHub 页面上应该会出现一个横幅,其中提供了一个按钮来打开返回上游存储库的拉取请求。 单击该按钮并打开拉动。

5
投票

不幸的是,没有办法合并两个没有共同祖先提交的分支。即使文件相同。

一个非常的黑客解决方法如下:

  1. 分叉并克隆原始存储库
  2. 在该存储库中,签出您最初下载的提交。
  3. 在您的非分叉下载存储库中,签出下载后所做的第一次提交。
  4. 将这些文件复制到分叉存储库中
  5. 在分叉的存储库中重新创建提交
  6. 重复步骤 3-5,但每次连续提交。
  7. 完成后,您可以使用新创建的 git 历史记录打开拉取请求

这是一个费力的过程,您可能可以创建一个工具来完成它,但如果它不是很多提交,或者您不介意将一些提交合并为一个。 (为此,在步骤 3 中,只需跳过几次提交,之前提交的代码仍然存在)


0
投票

您需要首先通过以下方式将旧存储库 OLD(包含正确的 git 历史记录)连接到新存储库(已断开连接,但包含修改):

  1. 从新,恢复到第一次提交
    git checkout $(git rev-list --max-parents=0 HEAD | tail -n 1)
  2. 将 OLD 与此状态同步:
    rsync -avrI . /path/to/NEW
  3. 创建一个补丁,其中包含从新的最新提交到第二次提交的提交:
    git checkout main && git format-patch -1 $(git rev-list --max-parents=0 HEAD | sed 'x;$!d')
  4. 从 OLD 开始,应用创建补丁:git am < ../path/to/patch.

0
投票

如果 PR 是一次或几次提交,则更简单的方法是从 Github 下载补丁文件:

  • 转到 PR 的
    commits
    选项卡
  • 单击您想要的提交
  • 地址栏中的 URL 应类似于
    github.com/<org>/<repo>/pull/0000/commits/<sha>
  • 编辑该地址以在末尾添加
    .patch
  • 保存页面(ctrl+Scmd+S
  • 使用
    git am < ~/Downloads/<patch>
  • 将补丁应用到本地副本
© www.soinside.com 2019 - 2024. All rights reserved.