尝试使用git fetch将我的非主分支更新到源

尝试使用git fetch将我的非主分支更新到源,git,github,git-fork,upstream-branch,Git,Github,Git Fork,Upstream Branch,我已经使用概述的步骤成功地更新了fork的主分支。所以fork的master分支现在与原始源的master保持一致 我有几个不同的分支,我想做其中一个(称为new_分支),即使是原始源代码的主分支。因此,我按照以下方式修改了链接中概述的步骤 git-fetch-upstream(链接处的步骤4) git签出新分支机构(步骤5) git合并上游/新分支机构(步骤6) 第6步产生合并:上游/新分支-我们无法在终端中合并 我仍然继续进行下一步 git推送原点新分支(步骤7) 在第7步之后,我得到的是所

我已经使用概述的步骤成功地更新了fork的主分支。所以fork的master分支现在与原始源的master保持一致

我有几个不同的分支,我想做其中一个(称为new_分支),即使是原始源代码的主分支。因此,我按照以下方式修改了链接中概述的步骤

git-fetch-upstream
(链接处的步骤4)

git签出新分支机构
(步骤5)

git合并上游/新分支机构
(步骤6)

第6步产生
合并:上游/新分支-我们无法在终端中合并

我仍然继续进行下一步

git推送原点新分支
(步骤7)

在第7步之后,我得到的是所有最新的
。
然而,github branch“new_branch”仍然表示,它在fork的源代码后面有41个提交

是否不可能使您的非主分支更新fork的来源

*我运行了
git-fetch
git-branch-r
来查看我有什么。(不过之前我确实运行了
git fetch

TL;博士 您需要重新确定提交的基础,通常使用
上游/master
。然后,您可能需要使用
git push--force with lease
或类似工具来更新您的
origin
新分支
,即您的
origin/new\u分支
。有关详细信息,请参阅详细答案

长的 这一切都相当复杂,下面是一个总结:

  • 这里涉及三个Git存储库。我们可以称它们为Repo-A、Repo-B和Repo-C。不过,在github.com上有两个URL。为了确保引用三个存储库中的每一个的合理性,让我们使用从您的计算机上的存储库中看到的它们的名称:
    • (没有名字):本地存储库,当我们需要一个名字时,我们就叫它
      laptop
    • origin
      :可以直接写入的GitHub存储库;及
    • 上游
      :一个无法写入的GitHub存储库,但可以使用GitHub的能力生成“拉请求”
  • 每个存储库都有自己的分支,但所有存储库至少共享提交,这些提交是他们从其他Git存储库看到的
  • 我们通过散列ID找到提交。从某种意义上说,散列ID(或Git术语中的对象ID)就是提交。但这些东西对用户并不友好
  • 因此,我们(人类)使用名称查找哈希ID。但是名称不会在存储库之间共享。最多只能复制。共享(如果有的话)是更新某个名称的结果。因此,从一个重要的意义上说,它们不是共享的
  • 要在
    笔记本电脑
    源站
    之间传输提交,我们可以使用
    git-fetch
    git-push
  • 要在
    笔记本电脑
    上游
    之间传输提交,我们只允许使用
    git fetch
现在,请记住,我们通过某种名称找到提交,让我们注意有很多种名称。在您自己的笔记本电脑上的存储库中,您可以完全控制所有这些名称,因此您可以做任何您想做的事情。为了你自己的理智,你需要遵循某些模式

在名为
origin
的存储库中,您对名称的控制较少,但我们将了解如何使用
git push
影响其分支名称。在名为
上游
的存储库中,您基本上无法控制名称

注意,我完全忽略了这里的标记。它们使画面变得复杂了一点,这已经相当长了

获取、推送和远程跟踪名称 现在让我们讨论一下
git fetch
git push
。我将假设您知道提交是如何工作的,Git是如何找到提交的,从分支中的最后一次提交开始向后工作的,并且当我们
Git签出
某个分支的名称时(或者使用
Git开关
执行相同的操作),然后进行新的提交,Git更新分支名称以保存新提交的哈希ID。新提交指向分支中最后一个提交,因此该分支已通过此操作自动扩展。这一切都使用了branch这个词,在使用Git时,这个词相当含糊不清,它以一种相当随意和假定的方式使用,假设读者能够找出branch的任何不同的、甚至是相互矛盾的定义中的哪一个可能适用

我不会假设你知道远程追踪的名字,因为你最初的很多问题都取决于这些。让我们来谈谈这些。我们还要定义remote,因为它涉及到

remote只是另一个Git存储库的简称。我们已经看到,
膝上型电脑中有两个遥控器:
origin
这个名称指的是您在GitHub上的fork,而
上游
这个名称指的是您在GitHub上创建fork的另一个存储库。远程服务器总是存储URL,但它也充当这些远程跟踪名称的前缀

Git称之为远程跟踪分支名称的远程跟踪名称,但看看分支这个词已经被滥用得多么严重;让我们把这个可怜的词放在这里,这里是(
笔记本电脑
)Git根据其他Git存储库中看到的某个分支名称创建和更新的名称

请再次记住,在任何Git存储库中看到的分支名称,无论是
膝上型电脑
源站
,还是
上游
,都包含tip提交的哈希ID。因此,无论我们查看三个存储库中的哪一个,我们都有一些以最新的

... <-F <-G <-H   <--branch
您可以做一些工作并运行
git commit
...--F--G--H   <-- new_branch (HEAD)
...--F--G--H--I   <-- new_branch (HEAD)
git clone <github url for the repository you call origin>
...--F--G--H   <-- master (HEAD), origin/master
...--F--G--H   <-- master (HEAD), new_branch, origin/master
...--F--G--H   <-- master, new_branch (HEAD), origin/master
...--F--G--H   <-- master, origin/master
            \
             I   <-- new_branch (HEAD)
git fetch upstream
             J--K--...--T   <-- upstream/master
            /
...--F--G--H   <-- master, origin/master
            \
             I   <-- new_feature (HEAD)
             J--K--...--T   <-- master (HEAD), upstream/master
            /
...--F--G--H   <-- origin/master
            \
             I   <-- new_feature
             J--K--...--T   <-- master (HEAD), origin/master, upstream/master
            /
...--F--G--H
            \
             I   <-- new_feature
...--F--G--H   <-- origin/master
            \
             I   <-- new_branch (HEAD)
             J--K--...--T   <-- upstream/master
            /
...--F--G--H   <-- origin/master
            \
             I   <-- new_feature (HEAD)
git push origin upstream/master:master
             J--K--...--T   <-- origin/master, upstream/master
            /
...--F--G--H
            \
             I   <-- new_feature (HEAD)
                          I'  <-- ???
                         /
             J--K--...--T   <-- origin/master, upstream/master
            /
...--F--G--H
            \
             I   <-- new_feature (HEAD)
                          I'  <-- new_feature (HEAD)
                         /
             J--K--...--T   <-- origin/master, upstream/master
            /
...--F--G--H
            \
             I   [abandoned]
git rebase <target>