Git manual states无法修改远程分支
远程分支是指向分支状态的引用(指针) 你的远程存储库。他们是你无法移动的地方分支; 无论何时进行任何网络,它们都会自动移动 通信。
但我刚刚发现我其实能做到这一点 这是实验:
cd rep1 && git init
echo "remote" > f1.txt
git add f1.txt
git commit -m "remote 1st commit"
git checkout -b new // switch branch to allow push to master from another repository
所以这个提交的哈希是81d86e051a9c85347f3faab16e5b50d96093b75d
现在我希望将分支作为远程控制在另一个名为rep2
的存储库中:
cd rep2 && git init
git remote add origin "../rep1"
git fetch origin master
git branch -a //outputs remotes/origin/master
git checkout origin/master
所以现在我已经检查了远程分支,但是HEAD处于分离状态。然后我更改f1.txt
并提交更改:
echo "local change" > f1.txt && git add f1.txt
git commit -m "local commit 2"
HEAD现在指向我的新提交的哈希9ae81a259749351186f7d9f27269f1068fcafc80
,但origin/master
仍然指向81d86e051a9c85347f3faab16e5b50d96093b75d
上的提交rep1
。
现在神奇了:
git push origin HEAD:master
哪个更新远程rep1
上的两个主分支指针:
$ git ls-remote origin
81d86e051a9c85347f3faab16e5b50d96093b75d HEAD
9ae81a259749351186f7d9f27269f1068fcafc80 refs/heads/master
本地rep2
:
$ cat .git/refs/remotes/origin/master
9ae81a259749351186f7d9f27269f1068fcafc80
因此我更新了远程分支而没有创建本地分支。这里有趣的事实是HEAD
在远程没有改变,虽然我还不知道该怎么做。
那么为什么我花了30分钟进行实验和打字呢?如果可能的话,我想知道由于这种方法可能会出现的问题。
PS。免责声明,我绝对不会使用这种方法,只是好奇心。
答案 0 :(得分:2)
每当您进行任何网络通信时,它们都会自动移动。
这正是你所做的,一个网络操作:
git push origin HEAD:master
指示远程repo rep1
master
分支获取+合并当前rep2
提交HEAD。
git push
更新refs/remotes
中的引用后,在存储库中更新引用,其中提交的位置是否正确?
是的,因此更新本地remotes/origin/master
中的远程跟踪分支rep2
以记住远程master
(在rep1
中)现在引用该新提交的事实(因为推送是在rep1
上作为快进合并完成的。)