Git 修改远程分支而不使用本地-会产生什么后果?

Git 修改远程分支而不使用本地-会产生什么后果?,git,git-branch,Git,Git Branch,无法修改远程分支的Git 远程分支是指向中分支状态的引用(指针) 您的远程存储库。他们是当地的分支机构,你不能移动; 无论您何时使用任何网络,它们都会自动为您移动 沟通 但我刚刚发现我确实可以做到这一点。 以下是实验: cd rep1 && git init echo "remote" > f1.txt git add f1.txt git commit -m "remote 1st commit" git checkout -b new // switch br

无法修改远程分支的Git

远程分支是指向中分支状态的引用(指针) 您的远程存储库。他们是当地的分支机构,你不能移动; 无论您何时使用任何网络,它们都会自动为您移动 沟通

但我刚刚发现我确实可以做到这一点。
以下是实验:

 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
$ cat .git/refs/remotes/origin/master
9ae81a259749351186f7d9f27269f1068fcafc80
现在我检查了远程分支,但头部处于分离状态。然后我更改
f1.txt
并提交更改:

echo "local change" > f1.txt && git add f1.txt
git commit -m "local commit 2"
头部现在指向我的新提交的散列
9ae81a259749351186f7d9f27269f1068fcafc80
,但是
源代码/主代码仍然指向提交
81d86e051a9c85347f3faab16e5b50d96093b75d
rep1
上生成的

现在是魔术:

git push origin HEAD:master
更新远程
rep1上的两个主分支指针:

$ git ls-remote origin
81d86e051a9c85347f3faab16e5b50d96093b75d        HEAD
9ae81a259749351186f7d9f27269f1068fcafc80        refs/heads/master
和本地
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
$ cat .git/refs/remotes/origin/master
9ae81a259749351186f7d9f27269f1068fcafc80
因此,我更新了远程分支,而没有创建本地分支。有趣的是,remote上的头没有改变,尽管我还不知道该怎么做

那为什么我要花30分钟来试验和打字呢?如果可能的话,我想知道由于这种方法可能出现的问题

免责声明,我绝对不会使用这种方法,只是好奇而已

无论何时进行任何网络通信,它们都会自动为您移动

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

 git push origin HEAD:master
指示远程repo
rep1
master
分支获取并合并当前的
rep2
提交头

git push
更新
refs/remotes
中的引用,然后在提交推送位置的存储库中更新它们,对吗


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

Git manual声明不能修改远程分支[…]。您能否编辑您的问题,为手册添加参考?在上下文中阅读这段引文会很好。值得一提的是,
git-push-origin-HEAD:master
是一个非常有效的命令,但是为什么您希望它在rep1中移动
HEAD
?运行
git checkout-b new
后,
HEAD
指向该存储库中的分支
new
;没有理由将任何东西(从rep2)推送到
origin/master
会移动rep1的
HEAD
。您可以编写
git branch-b new
。当然,您的意思是
git checkout-b new
(分支
动词没有任何
-b
标志)。添加了对手册的参考。不,我不希望git push移动头部,这只是一个观察。有趣的是,实际上可以在本地移动远程分支指针。我不确定本地是什么意思。我认为您会感到困惑,因为您的示例中的一切都是在本地发生的:rep1作为rep2的远程设备,与rep2位于同一台机器上。然而,从一个远程推送到另一个远程推送通常不是严格意义上的本地操作。在您的示例中,您在本地执行此操作只是偶然的。所谓
本地
,我指的是来自rep2的
,它将
rep1
作为远程。