在git远程之间同步分支的过程



我正在制作一个名为buildroot的git repo的副本。我在免费的bitbucket服务器上创建了回购的副本。我正在尝试定期将我的私人回购与主线buildroot回购同步。

我使用将本地副本下载到我的电脑上

git clone https://my_user@bitbucket.org/my_user/buildroot.git

然后我添加了主线buildroot repo作为远程

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远程上的单个分支(如master)中提取更改,这些更改在git push之后显示在我的originrepo中

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

TL;DR

我必须明确地。。。推送至origin

是的,但不完全是你的想法。不过,这可能是最方便的。

Long

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

与其他Git存储库共享,但只有在"共享时间"(git fetchgit push),才会提交。这些是使用它们的原始哈希ID共享的。不过,这也是分支名称真正进入画面的地方,因为Git存储库通过分支名称(和其他引用,但我们在这里只关注分支名称)来查找提交。

请记住,分支名称在Git存储库中的作用是包含要被视为"在"该分支上的最后一次提交的哈希ID,即分支的tip-commit。当您使用git checkoutbranch,然后使用最终的git commit时,您的Git:

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

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

因此,git push的作用是:

  • 移交一些提交,理想情况下,只需扩展一些现有分支,然后
  • 请求其他Git设置分支名称,以记住这些添加的提交中最多的提交

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

如果新的提交只是扩展一些现有的分支,那么这些特定的名称更新必须是"强制的":其他Git只会对那些不是快进操作且不是强制的更新请求说不。

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

git push origin <hash>:for-review

并基于CCD_ 15进行拉取请求。从图片上看,此时我自己的存储库中的内容如下:

...--o--o   <-- origin/feature

*   <-- origin/for-review

o--o--o--o--o   <-- feature

六项承诺中有五项仍未兑现;只有一个,这里标记为*,在origin的存储库上被推送到名称for-review。然而,我可以继续在我自己的feature分支的存储库中工作,它比origin/feature提前6次提交,比origin/for-review提前5次提交。我只需要小心记住,提交*现在是共享的(这很容易:它有一个可以访问它的origin/名称)。

这就引出了您必须在自己的存储库中做什么,以便将提交从mainline的Git存储库转移到origin的存储库。首先,您必须从mainline:获得提交(及其提示名称)

git fetch mainline

现在您有了所有提交;现在您可以使用更新origin,例如:

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

它将发送origin没有但确实需要的任何提交以使其工作,然后在origin上创建名称2018.05.x,指向与您自己的mainline/2018.05.x相同的提交。

诚然,这一切都有点混乱——但关键是,您不必为提交指定分支名称,只要您有某个名称,您(和您的Git)就可以在自己的存储库中找到提交。要这些提交发送到另一个Git,您可以通过哈希ID或origin/whatever名称来git push它们,或者您可以创建一个分支名称,或者做任何您喜欢的事情,只要它标识了适当的提示提交。但是,在lhs:rhs名称对的右侧,您必须提供一个名称,origin的Git可以创建或更新该名称。

便利性

使用git push(但不是git fetch!),如果运行:

git push origin abc

这"意味着"与相同

git push origin abc:abc

因此,在许多方面,为每个分支拥有自己的本地名称无疑更方便。

最新更新