问题背景
最近用git的时候遇到了一个问题,场景是这样的。
我有一个分支main,其中有两个commit A和B,A是最新commit,B是历史commit。我先切到B看了看之前的代码,然后切到A,并进行了一些代码修改,执行了commit和push。上述过程命令如下:
git checkout <hash-value-of-commitB>
git checkout <hash-value-of-commitA>
# 经过代码修改后
git commit -m "add some code"
git push origin main
当我在push的时候,发生了报错HEAD detached from <hash-value-of-commitA>
。
什么是HEAD detached?
参考链接:Git detached head: What is it & How to fix it?
简单来说,就是现在所在的commit不处于任何分支。比如下图:
除了第一个commit和最后一个commit之外,其他的commit都不处于任何分支。
但是我checkout的commit明明是最新的commit,不是在main分支上吗?为什么还是会报错呢?这里给出chatgpt的回答:
就是说,切到任何一个commit,都会处于detatched HEAD状态。要想回到最新的分支上,得checkout到分支名,而不是commit哈希值。
解决方案
- 如果想保留这些改动,在历史commitB上再新建一个分支即可
- 如果不保留,直接切到之前的分支。注意是切到分支,不是切到commit,这两者是不一样的
另外,对于第二种方案,已有的在commitB上的改动会被直接丢弃。