问题描述
我的团队壁球功能将提交并重新设置主分支的基数,以保持历史记录的线性。
对于这个问题,假设我们有3个分支机构
git checkout dev
git checkout -b my-feature
// do work
git commit -m "some work"
// another commit merges/is added to dev
git pull --rebase origin dev
git push origin HEAD
最后一条命令将当前分支推送到remove分支。
现在让我们说我正在部署
git checkout prod
git status
On branch prod
Your branch is behind 'remotes/origin/prod' by 2 commits,and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit,working tree clean
git pull --rebase origin HEAD
From xxx
* branch HEAD -> FETCH_HEAD
Successfully rebased and updated refs/heads/prod.
git status
On branch prod
Your branch is ahead of 'remotes/origin/prod' by 3 commits.
(use "git push" to publish your local commits)
nothing to commit,working tree clean
当我在git pull --rebase origin HEAD
分支上时,为什么dev
从prod
分支中退出?正常吗?
如果我离开HEAD,我会得到期望的结果(产品==起源/产品)
git pull --rebase origin
我注意到当我在功能分支.git/HEAD
上拥有我期望的值...
git checkout my-feature
cat .git/HEAD
ref: refs/heads/my-feature
git checkout prod
cat .git/HEAD
ref: refs/heads/dev
问题是,HEAD
分支为何prod
与众不同?
我经常用git push -f origin HEAD
推送我的功能分支,所以我真的不想找到一天试图将其推送到我们的dev分支。
我认为这无关紧要,但是我们使用GitLab作为主机。
这个question很相似,但是所有最重要的答案都与我所遇到的情况相反
问题就这样了,为什么会这样:
git checkout prod
cat .git/HEAD
ref: refs/heads/dev
解决方法
使用对多个引用进行操作的git命令时,请参考具体的git引用。例如如果您打算对dev
做某事,请使用HEAD
而不是dev
。
当您执行HEAD
(What is HEAD in Git?),git checkout
等命令时,git将写入git rebase
文件(和引用),并且可以更改所有含义突然间gits要求。
HEAD
将在git rebase
期间更改含义,因为(在您的情况下)git将检出dev
(并在dev
文件中写入HEAD
,甚至如果您从prod
执行命令并从prod
中挑选所有提交(以及根据git rebase
https://git-scm.com/docs/git-rebase的工作情况发生的后续事件)