Git 修改远程分支而不使用本地-会产生什么后果?
无法修改远程分支的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
以下是实验:
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
指示远程reporep1
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
作为远程。