git简单的add commit都很简单。查询历史的log status什么也没什么大影响。但是版本之间回退,分支之间的合并这些都比较复杂难懂。今天就来总结一下吧
git checkout作用于工作区。reset还原来自版本库。
reset可以1.版本之间跳来跳去跳的时候用到了HEAD,这儿的--hard 参数指三个区都回退。mixed为只版本区和staged区。soft选项只修改版本库区域。这样看大多都是用hard选项就够了。
2reset也可以让版本库(history区)还原到stage区。
checkout可以让staged区和working区相互转换,这时候要加上--
checkout也可以切换分支。branch。
master是一个指向快照的指针。HEAD可以指向master也可以指向其他的分支比如dev,feature,issue等等。都可以的。
git merge的时候呢。如果是fastforward模式,也就是只有一条线。从祖先直接移动master指针既可以了。如上图,如果merge master和hotfix那么仅仅移动一个指针就可以了。
如果合并hotfix和iss53,那么就不能fastforward了。这种需要解决冲突了。
git会用已有分支 c4 c5和共同祖先c2进行一个三方合并。这时候就是冲突解决问题了。结果产生一个c6,共同祖先,c4,c5
以上的其实不是冲突解决。这种事类似于两个分支在不同的文件上操作。如果两个分支分别在一个文件中操作了,这样就会产生冲突,这时候的冲突解决就出现了
任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。可以看到此文件包含类似下面这样的部分:
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用 git status
查阅:
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的
<<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53
这时候在仅文件里去修改去掉这些符号,那么就好了。这样就解决问题了。然后别忘了再add commit一次。
以上总结自git官网。
https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6
diff如果无参数则为 working area and staged 。一个参数是和working area比较。如果两个参数那么就是各自id比。如果加了--cached则是staged区和最新history区。