在没有本地的情况下修改远程分支 - 后果是什么?

时间:2015-02-04 14:40:00

标签: git git-branch

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。免责声明,我绝对不会使用这种方法,只是好奇心。

1 个答案:

答案 0 :(得分:2)

  

每当您进行任何网络通信时,它们都会自动移动。

这正是你所做的,一个网络操作:

 git push origin HEAD:master

指示远程repo rep1 master分支获取+合并当前rep2提交HEAD。

  

git push更新refs/remotes中的引用后,在存储库中更新引用,其中提交的位置是否正确?

是的,因此更新本地remotes/origin/master中的远程跟踪分支rep2以记住远程master(在rep1中)现在引用该新提交的事实(因为推送是在rep1上作为快进合并完成的。)