我正在自己制作一个名为buildroot的git仓库副本。我在免费的Bitbucket服务器上创建了一个仓库的副本。我试图定期从主线buildroot存储库中同步我的私人存储库。
我使用
将本地副本拉到PCgit 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
答案 0 :(得分:1)
我是否必须明确...推送到
origin
是的,但并不完全是您的思维方式。不过,这可能是最方便的。
每个Git存储库都是一个独立的实体。远程(如在您自己的存储库中)或fork链接(如在GitHub或Bitbucket叉中)记录另一个Git存储库的身份,但两个存储库仍是单独的实体。这样,每个人都有自己的 分支,不与任何其他Git存储库共享。
与其他Git存储库共享,但仅在“共享时间”(git fetch
和git push
)共享。使用它们的原始哈希ID共享它们。不过,这也是分支名称真正进入图片的地方,因为Git存储库通过其分支名称(和其他引用,但这里仅关注分支名称)来查找。 >
请记住,分支名称在Git存储库中的作用是包含要被认为在该分支“上”的 last 提交的哈希ID,即 tip提交。当您使用git checkout branch
后再加上最终的git commit
时,您的Git:
,以便分支名称再次指向最新的(提示)提交。该提示提交指向前一个提示,该提示指向另一个先前的提交,依此类推。
因此,git push
的作用是:
(扩展这样的分支是快进操作。)
如果新提交不只是扩展了一些现有分支,则必须“强制”那些特定的名称更新:另一个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 push
或origin/whatever
名称lhs:rhs
,也可以创建分支名称,或做任何您想做的事,只要它能确定适当的提示提交即可。但是,在origin
名称对的右侧,您必须提供一个名称,以便git push
上的Git可以创建或更新。
如果运行,请使用git fetch
(但不能使用git push origin abc
!)
git push origin abc:abc
“与”意思相同:
{{1}}
因此在许多方面,每个分支都有自己的本地名称肯定更加方便。