问题描述
这个问题我一直没想明白,而且感觉不太好描述,所以一直没问。比如存在项目A,项目B,两者毫不相干。项目A,B都有远程仓库和本地仓库,分别用remoA,locA,remoB,locB表示。
问题:正常情况下,肯定是locA关联到remoA,locB关联到remoB,不管这种关联是通过克隆还是 git remote add (remote) (repoUrl)。现在假设本地库locA,locB都已经存在,但locB处于刚刚初始化的状态,还是一个空库,因为操作错误,执行了git remote add origin (remoAUrl)。
之后发现了这个错误,又执行了git remote add originB (remoBUrl)
那么此时remoA/master和remoB/master是否都映射到了locB/master上?如果执行git pull 会使得remoA和remoB的远程分支代码在本地的master分支上发生合并吗 ?
问题解答
回答1:因为操作错误,执行了 git remote add origin (remoAUrl)。之后发现了这个错误,又执行了git remote add originB (remoBUrl)
如果你不打算把 remoA 关联给 locB,那么到这里就还是错的。正确做法应该是 git remote rm origin 然后 git remote add origin (remoBUrl)
那么此时remoA/master和remoB/master是否都映射到了locB/master上?
当然不。首先我觉得说建立了'关联'的关系可能更恰当,类似于 git checkout -b --track xxx 这种感觉。其次,你添加了两个 remote,其中一个叫 origin,另一个叫 originB。但 git 会优先使用 origin。详见下一条
如果执行git pull 会使得remoA和remoB的远程分支代码在本地的master分支上发生合并吗
当然不。除非你先把本地更新成其中一个 branch,然后去 pull 另一个 branch。
git pull 不指定后续参数,默认就是 git pull origin。如果你在 master branch 上,默认也就是 git pull origin master。
当然,取决于你的设定,有可能会发生变化。以上提到的只是默认情况。实际情况请打开 .git/config 文件看一看。命令行里输入 cat .git/config 即可。比如这样:
[branch 'master'] remote = origin merge = refs/heads/master
这就告诉了 git 两件事儿:
如果你现在在 master branch 上,那么默认的 remote 是 origin
如果你在这个情况下执行 git pull,不带任何参数的那种,那么就相当于 git pull origin master
你可以用 git push -u newOrigin newBranch 来改,那现在 git pull 就相当于 git pull newOrigin newBranch 了。类似地,也可以 git config branch.master.remote newOrigin 然后 git config branch.master.merge refs/heads/newBranch。结果一样。