在没有本地的情况下修改远程分支 - 后果是什么?
modifying remote branch without local - what are the consequences?
Git manual states 不能修改远程分支
Remote branches are references (pointers) to the state of branches in
your remote repositories. They’re local branches that you can’t move;
they’re moved automatically for you whenever you do any network
communication.
但我刚刚发现我真的可以做到。
这是实验:
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
仍然指向 rep1
上的提交 81d86e051a9c85347f3faab16e5b50d96093b75d
。
现在是魔法:
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。免责声明,我绝对不会使用这种方法,这只是好奇。
they’re moved automatically for you whenever you do any network communication.
这正是你所做的,网络操作:
git push origin HEAD:master
指示远程仓库 rep1
master
分支获取并合并当前 rep2
提交 HEAD。
git push
updates references in refs/remotes
after updating them on the repository where commits where pushed, correct?
是的,本地 rep2
中的远程跟踪分支 remotes/origin/master
因此已更新以记住远程 master
(在 rep1
中)现在引用新的事实提交(因为推送是在 rep1
上作为快进合并完成的)。
Git manual states 不能修改远程分支
Remote branches are references (pointers) to the state of branches in your remote repositories. They’re local branches that you can’t move; they’re moved automatically for you whenever you do any network communication.
但我刚刚发现我真的可以做到。
这是实验:
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
仍然指向 rep1
上的提交 81d86e051a9c85347f3faab16e5b50d96093b75d
。
现在是魔法:
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。免责声明,我绝对不会使用这种方法,这只是好奇。
they’re moved automatically for you whenever you do any network communication.
这正是你所做的,网络操作:
git push origin HEAD:master
指示远程仓库 rep1
master
分支获取并合并当前 rep2
提交 HEAD。
git push
updates references inrefs/remotes
after updating them on the repository where commits where pushed, correct?
是的,本地 rep2
中的远程跟踪分支 remotes/origin/master
因此已更新以记住远程 master
(在 rep1
中)现在引用新的事实提交(因为推送是在 rep1
上作为快进合并完成的)。