尝试使用git fetch将我的非主分支更新到源
我已经使用概述的步骤成功地更新了fork的主分支。所以fork的master分支现在与原始源的master保持一致 我有几个不同的分支,我想做其中一个(称为new_分支),即使是原始源代码的主分支。因此,我按照以下方式修改了链接中概述的步骤尝试使用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步之后,我得到的是所
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>