使用git show-ref命令查看所包含的引用
bluceshang@bluceshang:~/gittemp$ git show-ref
38074841cf56acdfef2f638ea686f1fd49f17d51 refs/heads/branch_1.0
a974d7c2df090893f474f7784637b1f84eeeac15 refs/heads/master
a974d7c2df090893f474f7784637b1f84eeeac15 refs/remotes/origin/master
e7564d5348cd1b482fcefa01b1d0716adad29458 refs/tags/hello_1.0
f65ebb922cabc0def4b3d5c8432472f40ac3b3aa refs/tags/old_practice
注:以refs/remotes/开头的是远程版本分支在本地的映射refs/heads/开头的是分支refs/tags/形头的是里程碑.
"快进式推送",就是要推送的版本库的提交是建立在远程版本库相应檓的现有提交基础上的,即远程版本库相应分支的最新提交是本地版本库最新提交的祖先提交.
强制推送,参数-f. git push -f
git pull 命令包含了两个动作:获取远程版本库的最新提交,以及将获取到的远程版本库提交与本地提交进行合并.
非快进式推送滥用会造成项目的空难,所以要禁用非快进式推送,在receice.denyNonFastForwards设置为true.
git config receive.denyNonFastForwards true
git pull = git fetch + git merge;
合并操作:在大多数情况下,合并操作只须提供一个<commit>作为参数,合并操作将<commit>对应的目录树和当前工作分支的目录树内容进行合并,合并后的提交以当前分支的提交作为第一个父提交,以<commit>为第二个父提交.合并操作还支持将多个<commit>代表的分支和当前的分支进行合并,过程类似.
默认情况下,合并后会自动提交,如果提供--no-commit选项,合并后的结果会放入暂存区,用户可以对合并的结果进行检查,更改,然后手动提交.
git自动合并:1.修改了不同的文件中内容,2.修改了同和个文件中不同地方的内容,3.一个用户重命名了文件,而另一个用户修改了文件中内容,在三种情况git默认合并都会解决.
git合并过得是通过.git目录下
- 文件.git/MERGE_HEAD记录所合并的提交ID
- 文件.git/MERGE_MSG记录合并失败的信息
- 文件.git/MERGE_MODE标识合并状态.
bluceshang@bluceshang:~/gittemp$ git ls-files -s
100644 10236e 1 README
100644 10236e 2 README
100644 10236e 3 README
每一行分为四个字段,前2个分别是文件的属性和SHA1,第三个字段是暂存区编号,当合并冲突发生后,全用到0以上的暂存区编号.- 编号为1的暂存区用于保存冲突文件修改之前的副本,即冲突双方共同的祖先版本,可以用1<filename>访问 git show :1:README
- 编号为2的暂存区用于保存当前冲突文件在当前分支中修改的副本,可以用:2:<filename>访问 git show :2:README
- 编号为3的暂存区用于保存当前冲突文件在合并版本(分支)中修改的副本,可以用:3:<filename>访问 git show :3:README
$cat README
User1 hacked
<<<<<<< HEAD
Hello,user2.
=======
Hello,user1.
>>>>>>> a12133212332123443212343221dewsw
User2 hacked.
User2 hacked again.
冲突有2种方法解决:1.手动解决.2用图形解决git mergetool