在git遥控器之间同步分支的过程

时间:2018-07-03 20:12:43

标签: git bitbucket git-pull git-remote

我正在自己制作一个名为buildroot的git仓库副本。我在免费的Bitbucket服务器上创建了一个仓库的副本。我试图定期从主线buildroot存储库中同步我的私人存储库。

我使用

将本地副本拉到PC
git clone https://my_user@bitbucket.org/my_user/buildroot.git

然后我将主线buildroot存储库添加为远程

git remote add mainline https://git.buildroot.net/buildroot

git remote -v现在看起来像这样

mainline    https://git.buildroot.net/buildroot (fetch)
mainline    https://git.buildroot.net/buildroot (push)
origin      https://my_user@bitbucket.org/my_user/buildroot.git (fetch)
origin      https://my_user@bitbucket.org/my_user/buildroot.git (push)

我可以将更改从mainline上的单个分支(例如主节点)中提取,并且这些更改会在origin后显示在我的git push回购中

get pull mainline master
git push

但是,新分支从未出现在我的origin存储库中。我是否必须从mainline显式地检出每一个,然后推送到origin还是有更好的方法呢?

如下所示,我的私人仓库缺少分支2018.02.x和2018.05.x

git branch -a

* master
remotes/mainline/2017.02.x
remotes/mainline/2017.05.x
remotes/mainline/2017.08.x
remotes/mainline/2017.11.x
remotes/mainline/2018.02.x
remotes/mainline/2018.05.x
remotes/mainline/master
remotes/mainline/next
remotes/origin/2017.02.x
remotes/origin/2017.05.x
remotes/origin/2017.08.x

1 个答案:

答案 0 :(得分:1)

TL; DR

  

我是否必须明确...推送到origin

是的,但并不完全是您的思维方式。不过,这可能是最方便的。

每个Git存储库都是一个独立的实体。远程(如在您自己的存储库中)或fork链接(如在GitHub或Bitbucket叉中)记录另一个Git存储库的身份,但两个存储库仍是单独的实体。这样,每个人都有自己的 分支,不与任何其他Git存储库共享。

与其他Git存储库共享,但仅在“共享时间”(git fetchgit push)共享。使用它们的原始哈希ID共享它们。不过,这也是分支名称真正进入图片的地方,因为Git存储库通过其分支名称(和其他引用,但这里仅关注分支名称)来查找。 >

请记住,分支名称在Git存储库中的作用是包含要被认为在该分支“上”的 last 提交的哈希ID,即 tip提交。当您使用git checkout branch后再加上最终的git commit时,您的Git:

  • 构建新的提交
  • 同时将新提交的 parent 哈希ID设置为当前提交的哈希ID
  • 然后将 new 提交的哈希ID写入当前的名称

,以便分支名称再次指向最新的(提示)提交。该提示提交指向前一个提示,该提示指向另一个先前的提交,依此类推。

因此,git push的作用是:

  • 交出一些提交,理想情况下,只需扩展一些现有分支即可,然后
  • 要求其他Git设置分支名称以记住这些添加的提交中最尖端的提交。

(扩展这样的分支是快进操作。)

如果新提交只是扩展了一些现有分支,则必须“强制”那些特定的名称更新:另一个Git只会拒绝那些不是快速操作也不是强制的更新请求。

但是,不要求这些分支名称值更改与您自己的存储库中的任何实际分支名称相对应。例如,考虑一下(至少对我来说)我正在使用某些功能并且编写了六次或更多次提交的常见情况。从这些中,我确定一个绝对是肯定的好主意,因此我运行git rebase -i feature并将其放在前面。然后我可以运行:

git push origin <hash>:for-review

,然后根据for-review发出拉取请求。从图片上看,目前我在自己的存储库中的内容如下:

...--o--o   <-- origin/feature
         \
          *   <-- origin/for-review
           \
            o--o--o--o--o   <-- feature

六次提交中的五次仍未执行;在存储库*上,只有一个在此处标记为for-review的名称被推入名称origin。但是,我可以继续在自己的feature分支上的自己的存储库中工作,这是origin/feature之前的六个提交,而origin/for-review之前的五个提交。我只需要注意要记住,提交*已被共享(这很容易:它有一个origin/名称可以访问)。

这将我们带到您自己的存储库中,您需要执行的操作才能将提交从mainline的Git存储库转移到origin的存储库。首先,您必须从mainline获取提交(及其指向的名称):

git fetch mainline

现在您拥有所有的 commits ;现在您可以使用以下方式更新origin

git push origin mainline/2018.05.x:2018.05.x

它将发送origin没有但确实需要进行的所有提交以完成这项工作,然后在2018.05.x上创建名称origin,指向与您自己的mainline/2018.05.x

这确实有点杂乱无章,但要点是,只要您有 some ,就不必为提交使用分支名称您(和您的Git)可以在自己的存储库中找到提交的名称。要发送这些 另一个Git,您可以通过哈希ID git pushorigin/whatever名称lhs:rhs,也可以创建分支名称,或做任何您想做的事,只要它能确定适当的提示提交即可。但是,在origin名称对的右侧,您必须提供一个名称,以便git push上的Git可以创建或更新。

方便

如果运行,请使用git fetch(但不能使用git push origin abc !)

git push origin abc:abc

“与”意思相同:

{{1}}

因此在许多方面,每个分支都有自己的本地名称肯定更加方便。