git pull --rebase origin HEAD拉错分支 HEAD代表什么?

问题描述

我的团队壁球功能将提交并重新设置主分支的基数,以保持历史记录的线性。

对于这个问题,假设我们有3个分支机构

  • dev(认/主要)
  • prod(一旦我们使用此分支对提交进行了验证。在部署期间,我们将创建一个提交,因此prod将被合并到dev中)
  • 我的功能
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分支上时,为什么devprod分支中退出?正常吗?

如果我离开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很相似,但是所有最重要的答案都与我所遇到的情况相反

  • HEAD只是一个特殊的指针,指向您当前所在的本地分支。
  • 头是您当前的分支
  • HEAD始终引用当前分支上的最新提交。
  • HEAD是当前分支的“提示”。
  • HEAD是一个符号引用,指向您在提交历史记录中的任何位置。

问题就这样了,为什么会这样:

git checkout prod
cat .git/HEAD
ref: refs/heads/dev

解决方法

使用对多个引用进行操作的git命令时,请参考具体的git引用。例如如果您打算对dev做某事,请使用HEAD而不是dev

当您执行HEADWhat 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的工作情况发生的后续事件)