【问题标题】:How can I keep my fork in sync without adding a separate remote?如何在不添加单独遥控器的情况下使我的 fork 保持同步?
【发布时间】:2014-01-25 21:54:58
【问题描述】:

假设在 GitHub 上有一个存储库 someone/foobar,我将它分叉到 me/foobar

我如何将新提交从父存储库直接拉到我的 fork,而不必add a separate remote 并记得定期从那里拉取 em> ?

目标是:

  • git pull 从父仓库获取
  • git push 将所有内容发送到我的 fork

【问题讨论】:

  • @Olufemi 出人意料的回答似乎符合您的要求,只是正如 ChristianGosch 在评论中指出的那样,您最终会在您的分支顶部获得“合并提交”,并且“没有可比性"不会出现。对于您想要为其创建分支供他们拉取的许多项目来说,这似乎是不可接受的。那么,如果不在个人计算机上运行神秘的 git 命令,真的没有办法在 github 中完成这个最基本的贡献者工作流吗?或者也许我应该在每次我想贡献的时候扔掉我的整个回购并重新分叉??
  • The new answer 2021 年 5 月。

标签: git github


【解决方案1】:

打开分叉的 Git 存储库 me/foobar

点击比较

您将收到通知:

没有什么可比较的。
someone:masterme:master 的所有提交都是最新的。尝试切换基数进行比较。

在本页点击切换基地

然后你可以看到在你 fork 之后对 someone/foobar 的所有提交。

点击创建拉取请求

给拉取请求一个标题和描述,然后点击创建拉取请求

在下一页,滚动到页面底部并点击合并拉取请求确认合并

您的 Git 存储库 me/foobar 将被更新。

编辑:rebase 选项显示在这里:

【讨论】:

  • 这很令人困惑,因为当您切换基础 github 时,您会进入原始 repo 的页面,因此您似乎是在上游分支打开拉取请求。但它完全有效。
  • 为了避免上面提到的混乱情况,最好点击Edit按钮并手动将base fork切换到me/foobarhead forksomeone/foobar。这样就清楚多了
  • 另一个:如果您之前没有这样做,这很好用,但之后在您的提交历史记录顶部有“合并提交”。因此“没什么可比较的”不会出现。相反,必须使用“编辑”按钮并手动交换 base 和 fork 才能工作。
  • 有没有办法摆脱那个可笑的合并提交?
  • @kumar_harsh since September 2016,现在有一个用于避免合并提交的拉取请求的“rebase and merge”选项。
【解决方案2】:
git remote set-url origin git@github.com:someone/foobar
git remote set-url origin --push git@github.com:me/foobar

但有一个警告:
如果你是唯一一个对你的分叉进行更改的人,这是完美的。
但是,如果它与其他人共享,您可能必须从您的 fork 中提取,在这种情况下,a separate remote 是唯一的解决方案。

编辑:
实际上,您可以 git pull git@github.com:me/foobar,这消除了警告。
哪个更容易记住是您的选择。

【讨论】:

  • 正确。不过,我总是建议使用单独的遥控器:git remote add upstream https://github.com/someone/foobar,然后是git fetch upstream。上游的所有远程分支都将以upstream/branch 提供。这允许根据您的工作流程重复合并或变基。
【解决方案3】:

我使用了一种相当简单的方法使用 GitHub Web UI 来做到这一点:

  1. 打开原始 Git 存储库(不是分叉的 Git 存储库 me/foobar
  2. 跳转到src文件夹,打开你要修改的文件
  3. 单击钢笔图标。它将根据主存储库的当前版本自动在您的个人 fork 中创建一个名为“patch-1”的标签:
  4. 享受吧!

【讨论】:

  • 试试这个,基本上打开了原始git repo中文件的编辑器。我没有写入原始 git repo 的权限(按设计)。对于这种方法,您似乎必须更改文件,否则无法“保存”文件。如果不保存文件,我无法让您的“patch-1”分支出现在我的分叉存储库中。我在这里错过了什么?
【解决方案4】:

"Pull" app 是一种自动设置后忘记的解决方案。它会将你的 fork 的默认分支与上游存储库同步。

访问 URL,单击绿色的“安装”按钮,然后选择要启用自动同步的存储库。

分支每小时更新一次,直接在 GitHub 上,在你的本地机器上你需要拉取 master 分支以确保你的本地副本是同步的。

也在https://stackoverflow.com/a/58965171/946850回复。

【讨论】:

    【解决方案5】:

    最近(2021 年 5 月上旬)GitHub 网站为此提供了一个一键式按钮:

    我无法抗拒点击它的诱惑。

    请参阅GitHub's official Tweet 了解此新功能。

    【讨论】:

      【解决方案6】:

      另一种选择是使用 GitHub for Mac 中的 Update from upstreamRepoName/master 按钮(我假设 GitHub for Windows)。

      【讨论】:

      • TIL:除了 Web 界面之外还有适用于 GitHub 的应用程序 :-) [遗憾的是,它们之间的体验并不统一]
      • 我在 Windows 中看不到这个
      • @Denis 这是他们的旧应用程序。我不确定他们的新应用有它。
      • 啊哈。这适用于“GitHub Desktop”(对于 Mac,不确定 Windows)。
      【解决方案7】:

      如果不添加另一个遥控器,我不知道如何做到这一点,但是我总是将我从 fork 分叉的 repo 添加为 upstream 遥控器,这样我就可以简单地做:

      git branch -a|grep remotes/upstream| while IFS="/" read p r b; do echo Syncing $r/$b to origin/$b; git push origin $r/$b:refs/heads/$b; done
      

      这将同步所有分支,包括。创建新分支(删除 refs/heads/ 以仅更新现有分支)。如果您的任何分支出现分歧,它将对该分支抛出错误。

      【讨论】:

        【解决方案8】:

        我会简单地使用:

        git pull git@github.com:someone/foobar <branch_name> && git push
        

        【讨论】:

          【解决方案9】:
          1. 访问https://github.com/me/foobar/compare/master...someone:master(当然用相应的repo和用户名替换mesomeonefoobar

          2. 如果您看到绿色文本Able to merge,请按创建拉取请求

          3. 在下一页,滚动到页面底部并点击Merge pull requestConfirm merge

          【讨论】:

            猜你喜欢
            • 2019-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-13
            • 1970-01-01
            • 1970-01-01
            • 2021-08-01
            • 1970-01-01
            相关资源
            最近更新 更多