首页 > 解决方案 > git无法将我的本地分支与远程合并

问题描述

我克隆了我的组织的 git repo,如下所示

git 克隆 https://giturl/my_org_name/runbooks

它询问我的用户名/密码并成功克隆了它。

然后我检查了一个新的本地分支

git checkout -b patchv1

我做了几个提交。

然后我结帐到master并将我的patchv1分支与本地 master合并。

git结账大师

git 拉

git合并补丁v1

下面是我的 git 状态输出

状态

On branch master
Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

git远程显示起源

* remote origin   
Fetch URL: https://giturl/my_org_name/runbooks.git   
Push  URL: https://giturl/my_org_name/runbooks.git   
HEAD branch: master 
Remote branches:
   upgrade-schedules           tracked
   ...................           .....
   patchv2                     tracked   
Local branch configured for 'git pull':
  master merges with remote master   
Local ref configured for 'git push':
  master pushes to master (fast-forwardable)

我想将我的本地 分支推送到远程来源,但名称不同。因此,我将以下命令与 -u 一起使用,以便创建远程分支

git push -u origin master:newpatchv2

得到以下错误

remote: Permission to my_org_name/runbooks.git denied to my_username. fatal:
unable to access 'https://giturl/my_org_name/runbooks.git/': The
requested URL returned error: 403

在 webUI 中,我尝试在远程 repo 的 master 分支中编辑一个文件,但出现以下错误,

"You’re editing a file in a project you don’t have write access to. 
Submitting a change to this file will write it to a new branch in your fork **my_username/runbooks**, so you can send a pull request."

我进一步阅读并找到了以下声明

对分叉存储库所做的更改可以通过拉取请求与原始存储库合并。拉取请求会敲击存储库所有者并告诉“我已经进行了一些更改,如果您喜欢,请将这些更改合并到您的存储库中”。另一方面,在本地机器(克隆存储库)上所做的更改可以直接推送到上游存储库。为此,用户必须具有对存储库的写访问权限,否则这是不可能的。如果用户没有写权限,唯一的方法是通过分叉请求。因此,在这种情况下,克隆存储库中所做的更改首先被推送到分叉存储库,然后创建拉取请求。

所以,我去了我的组织的 github webui repo 页面(url - https://giturl/my_org_name/runbooks)并点击了 fork。它说,

"You've already forked runbooks"并向我展示了以下回购

我的用户名/运行手册

现在,根据我阅读的声明,我可以将我的更改推送到我的分叉存储库 my_username/runbooks,然后创建一个拉取请求。正确的?但是在我的组织的 github webui runbooks repo 页面中,如果我点击“ New Pull Request

在“比较更改”下,我看到如下

base: master   <---  compare: <drop_down>

当我单击 drop_down 时,我根本找不到my_username/runbooks 存储库。

两个问题:

  1. 如何将我的本地主分支推送到我的分叉仓库 - my_username/runbooks?由于无法在组织的存储库中创建新的远程分支,我是否需要以某种方式更改远程来源?

    我的分叉回购的网址如下所示

    https://giturl/my_username/runbooks?organization=my_username&organization=my_username

  2. 一旦我将本地主服务器推送到我的分叉存储库 - my_username/runbooks,如何在我的my_org_name/runbooks 存储库中创建拉取请求,因为my_username/runbooks没有在基础或“比较更改”页面的比较中列出。

抱歉,如果问题非常基本。但我很难理解这一点,并感谢任何帮助。

标签: gitmacosgithubversion-control

解决方案


专业提示:永远不要更改master回购分支上的分支,或来自上游的任何分支。您的主分支将从上游分支,您将无法将上游拉入本地分支。

在您的工作流程中,更有意义的是在进行提交之前,创建一个新的本地分支git checkout -b newpatchv2,然后提交。推newpatchv2送到你的 fork,然后在上游repo 中创建一个 PR 以请求他们拉入你的更改。他们可能不会按原样接受 PR,并且如果您的更改已经在您的master分支中,您将无法与远程 master 同步备份,通过将更改推送到本地 master(然而)在上游,可能永远不会(等待 PR 批准)。请记住,git 是一个分布式变更控制系统,其他贡献者的 PR 可能会先于您自己进入上游 master。

如果你最终分离了你的本地 master 分支,最简单的解决方法是将你的本地 master 分支到一个新的分支(比如 old-master),然后删除你的本地 master 分支并将远程 master 拉回。一旦您与 master 同步,请保持这种状态 - 分支master进行更改,然后仅在将这些更改合并上游 master 时将这些更改拉回master。

现在让我们来回答你的问题。

如何将我的本地主分支推送到我的分叉仓库 - my_username/runbooks?由于无法在组织的存储库中创建新的远程分支,我是否需要以某种方式更改远程来源?

由于git分布式版本控制系统,因此拥有多个遥控器非常好。在这种情况下,您甚至可能有 3 个遥控器 - 您的组织的遥控器、您的个人分支以及组织分支的上游遥控器。上游唯一的特殊之处origin在于,如果你克隆一个 repo,它会自动在本地 repo 中创建一个远程源,并调用它origin
您可以添加更多来源:

git remote add myfork https://github.com/.../..

然后你可以git push myfork代替git push origin. 请注意,我没有指定分支。保持简单!在您认为自己是 git 专家之前,请在提交之前进行分支,并保持远程分支与本地分支相同。

一旦我将本地主服务器推送到我的分叉存储库 - my_username/runbooks,如何在 my_org_name/runbooks 存储库中创建拉取请求,因为 my_username/runbooks 未列在基础或“比较更改”页面的比较中。

有一个“跨叉比较”按钮,应该允许您为 PR 的目的地选择不同的叉。请参阅来自 github 的此文档以获取其外观的屏幕截图:

https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork


推荐阅读