HEAD detached at
理解为分支是通过一个head的指针来指向的
git checkout 实际上是修改HEAD文件的内容,让其指向不同的branch。
HEAD文件指向的branch就是当前branch.
通过git branch命令看到的结果和HEAD文件内容一致。
[plain] view plain copy
$ git branch -v
* master 1aea8d9 [ahead 1] add test file x
2.最简单用法
git checkout最简单的用法,显示工作区,暂存区和HEAD的差异:
[plain] view plain copy
$ git checkout
M x
Your branch is ahead of ‘origin/master’ by 1 commit.
意思是我本地仓库比远程仓库领先一个提交操作。git checkout HEAD 功能相同。
如果用-a 参数,可以看到很多branch,包括远程的branch,比如:
[plain] view plain copy
git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/issue_193
remotes/origin/issue_210
remotes/origin/master
3.detached HEAD
如果让HEAD文件指向一个commit id,那就变成了detached HEAD。git checkout 可以达到这个效果,用下面的命令:
[plain] view plain copy
git checkout 1aea8d9^
laea8d9是最近的一次commit id,^指的是之前一次,因此上面的操作结果是让HEAD文件包含了倒数第二次提交的id.
下面演示如何进入datached HEAD状态,并恢复回来。
git branch -v
master 89f8dae [ahead 2] update x
git checkout 89f8dae^
checking out '89f8dae^'.
现在恢复回来
git checkout master
Previous HEAD position was 1aea8d9... add test file x
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
我并不清楚detached HEAD有何实际用处,反正就是一个让HEAD随便指向某个commit id,而不在乎是哪个branch的功能。
总结一下:
1. git status
查看自己是不是在head状态下
2. git branch -v
查看到底有几个分支,确认自己在哪个状态太
3. git checkout master
在主分支情况下进行提交,然后也可以继续进行切换到你想要进入的子分支,git checkout 自分支名 然后再进行提交。
保留新的数据的提交
再走一下模拟的流程
git branch -v
获取分支版本号
git checkout 3a801ee
进入对应的分支
git status
查看确认一下HEAD是在3a801ee
然后就是正常的编辑开发流程了
1.首先打开文件
2.对文件进行编辑保存
3.add
4.commit
5.push到对应的分支仓库newTestBranch
6.Everything up-to-date提示数据已经更新
然后我们发现newTestBranch数据仓库中没有更新的数据,尼玛,傻眼了吧。。。。
重磅好消息,下面就是这种同时保留之前数据合并的方法哦
- git branch -v 查看后没有你需要的分支(newTestBranch)有的话可以省略2
git fetch origin newTestBranch:newTestBranch(newTestBranch 前面的分支为远程分支名,后面是本地分支名)
然后git branch -v 查看分支
确认能自己新建的newDevelop分支的存在git reflog show HEAD@{now} -10
这个命令会把HEAD指针所有的动作显示出来。从中可以清楚的看到,在指针中提交对应的commit id
找到需要恢复的commit ,记下前面的commit idgit branch temp efa64f5
新建一个名字叫temp的分支,用这个分支代替之前的临时分支并且拥有想要恢复的commit,现在切换到temp下会发现一切都回来了
但是还是不能推送啊。原因是temp是我们本地的分支,远程库中并没有这个分支。git checkout develop
切换到从远程库拉取到的develop分支git merge temp
将temp分支合并到develop分支上,有冲突就解决冲突。git push origin develop
OK,推送到远程库。