转载自:http://www.cnblogs.com/iwangzc/p/4073117.html
先说 HEAD
HEAD 是一个头指针,通常情况下指向不同的分支,每个分支对应一个 commit(准确的说,每个分支对应多个 commit,但是只有一个顶层的 commit,而 commit 之间是简单的线性关系。)
git checkout 其实是修改 HEAD 文件的内容,让它指向不同的分支。
下面是一个一般的情况:
HEAD (refers to branch 'master')
|
v
a---b---c branch 'master' (refers to commit 'c')
既然 checkout 是修改 HEAD,所以可以出现下面的情况:
HEAD (refers to commit 'b')
|
v
a---b---c branch 'master' (refers to commit 'c')
HEAD 指向 b,用 git branch 看看有几个分支:
×HEAD detached from b
master
发现有两个分支,可是我们没有创建除了 master 以外的任何分支啊 ~
可以把 HEAD detached from b 理解为一个临时的分支,并且这时候 HEAD 指针是游离普通分支之外的。
在这个临时分支上可以进行 git 的一切操作:add commit 等等,像这样:
HEAD (refers to commit 'f')
|
v
e---f
/
a---b---c branch 'master' (refers to commit 'c')
假如远程库中有一个 master 分支,一个用来开发的 develop 分支,这时候如果我们要向远程库推送,会发现无法推送。
因为 HEAD 不知道要把内容推送到哪个远程分支上去。
那么问题来了,怎么把修改的内容提交到远程库呢?
由于本地没有 develop 分支,所以需要先这样:
git fetch origin develop:develop
在本地创建一个 develop 分支,并且把它和远程 develop 关联起来。现在再看看本地有哪些分支:
git branch
×develop
master
刚才的 HEAD detached from b 分支消失了! 在这个分支下修改的内容也不见了!
没关系,进行下一步。
git reflog show HEAD@{now} -10
这个命令会把 HEAD 指针所有的动作显示出来。从中可以清楚的看到,在指针中提交对应的 commit id
找到需要恢复的 commit ,记下前面的 commit id
git branch temp efa64f5
新建一个名字叫 temp 的分支,用这个分支代替之前的临时分支并且拥有想要恢复的 commit,现在切换到 temp 下会发现一切都回来了
但是还是不能推送啊。原因是 temp 是我们本地的分支,远程库中并没有这个分支。
git checkout develop
切换到从远程库拉取到的 develop 分支
git merge temp
将 temp 分支合并到 develop 分支上,有冲突就解决冲突。
最后:
git push origin develop
OK,推送到远程库。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于