我想创建一个存储库[B],它在一个名为x_master的分支中跟踪远程存储库的主[A].它自己的主人也应该是初始创建时的克隆,其他人[Devs]可以克隆并推送更改.
偶尔,由于A中有变化,我需要能够将它们拉下来并将它们合并到B的x_master中(如果我理解这一点,那么它应该是快进的,因为它们将是x_master分支上的唯一变化. B),然后能够将这些变化合并到B的主人身上,从而在他们拉动时克隆B的主人.
我在概念上想要的是:
master x_master
[A] <---------> [B] <-------> [Dev2]
^-------> [Dev1]
master
Run Code Online (Sandbox Code Playgroud)
最终我需要在完成所有开发时将B的主控器中的更改推送到A的主控器,但是A中的更改将需要合并到B中
我已经尝试了各种克隆 - 镜像,分支 - 轨道,并且似乎没有得到正确推送和拉动的A和B的变化.
我确信它有一个快捷方式,但我倾向于使用基本命令.在任何情况下,设置存储库B
:
$ cd repo_B
$ git init --bare
$ git remote add upstream URL_FOR_REPO_A
$ git fetch upstream +master:refs/heads/x_master
$ git branch master x_master
Run Code Online (Sandbox Code Playgroud)
修改上游存储库时,需要在裸存储库1中提取这些更改:
$ git fetch upstream +master:refs/heads/x_master
Run Code Online (Sandbox Code Playgroud)
这将覆盖2中任何可能的更改x_master
,因此您最好单独留下该分支.:)
您将希望将上游更改合并x_master
到master
/如果A更改时.不幸的是,在这个阶段可能存在冲突,因此必须使用我们裸存储库的克隆来完成.简单地克隆在B库(本地或远程位置),并合并x_master
到master
,解决冲突,并推回.
最后的任务是将开发推进master
到存储库A.这可以通过两种方式完成.第一种方法是直接将B的主服务器推送到存储库A.这可以通过运行:
$ git push upstream
Run Code Online (Sandbox Code Playgroud)
上储存库B.一种替代方法是从一种更可控的合并master
到x_master
使用第三存储库:
$ git clone URL_FOR_REPO_A
$ cd repoDir
$ git remote add dev URL_FOR_REPO_B
$ git fetch dev
$ git branch --track master_b dev/master
$ git merge master_b
$ <resolve conflicts, if any>
$ git push origin master
Run Code Online (Sandbox Code Playgroud)
为完成,您可以将远程配置为仅默认获取该分支:
$ git configure branch.upstream.fetch +master:refs/heads/x_master
Run Code Online (Sandbox Code Playgroud)
而且--add
,您甚至可以添加更多分支来获取:
$ git configure --add branch.upstream.fetch +branch_1_0:refs/heads/x_branch_1_0
Run Code Online (Sandbox Code Playgroud)
现在,fetch将在没有refspecs的情况下正常工作:
$ git fetch upstream
Run Code Online (Sandbox Code Playgroud)
为了防止推送到master
的repo_B
,你可以使用服务器端的吊钩状pre-receive
或update
.