目录
目录
git分支简介
git的每次提交都会包含三部分:commit object、blob、tree.
blob:暂存操作会将每个文件计算校验和(SHA-1哈希算法),然后将当前版本的文件快照以Blob对象的形式保存到git仓库中,最后将校验和加入到暂存区。
tree:在commit 提交操作时,会先计算每个子目录的校验和,然后以tree对象保存在git中,可以在需要时重现本次提交的目录结构
commit object:提交对象,包含提交作者的姓名邮箱、提交时的信息及指向它的父对象的指针(首次提交不包含父对象指针)。
以上三部分均可以在 .git/objects文件夹下找到,
通过两条命令查看信息。
git cat-file -t/-p SHA-1
example:git cat-file -t 193569360fcd037aff2b965acbf7a4598a998c1d
注意要将19/3569360fcd037aff2b965acbf7a4598a998c1d中间的/去掉。
分支创建
git banch testing(banchname)
创建一个分支,分支名为branchname,但是并没有切换到新分支上。
HEAD指针:一个特殊指针,指向当前所在的本地分支。
Detached head:只想分支的非最新节点,当checkout之前的版本时会有提醒。
我们可以使用--decoratel来查看当前的分支情况
git log --oneline --decorate
分支切换
git checkout testing(branchname)
切换到分支branchname上。
我们可以用git log --oneline --decorate --graph --all查看分支及项目分支分叉情况。
分支新建与合并
新建分支
git checkout -b iss(branch-name)
以上命令代表着两条命令。新建分支iss,并切换到分支iss。
$ git branch iss
$ git checkout iss
合并分支
git checkout master
git merge iss(branch-name)
合并分支分两步:
先切换到目标分支(即融合到的分支),
然后使用merge命令将源分支并入目标分支。
分支合并分两种情况,一种是fast-forward,即目标分支是源分支的直接上游,目标分支分支只做简单的指针向前移动。不产生新的提交。
将hotfix合并到master后,master分支指针移动到hotfix最新节点上。如下图:
另一种是三方合并,即两个分支的末端及他们的共同祖先三者分支做一个合并,然后创建一个新的快照并生成一个新的提交指向它。它的特点在于不止并一个父对象。
合并后
合并完可以使用-d删除分支。
遇到冲突的分支合并
当合并的两个对象存在冲突,则会暂停下来,等待你去解决合并产生的冲突。
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
=====上下方分别为冲突文件中的两部分内容,可以选择均保存,或者修改为其他内容 。
在你解决了所有文件里的冲突之后,对每个文件使用 git add/git commit -a 命令来将其标记为冲突已解决,然后再提交。
分支管理
查看分支
git branch (-v)
查看已合并分支
git branch --merged
查看未合并分支
git branch --no-merged
远程分支
查看远程分支
可以通过git ls-remote (remote)查看远程分支列表。
通过git remote show (remote)查看远程仓库的详细信息。
远程跟踪分支
远程引用是对远程仓库的引用,包括分支、标签等。更常用的方法是远程跟踪分支。
远程跟踪分支以remote/branch形式命名,默认情况下为origin/master。origin为默认远程分支名,master为默认主分支名。他并不是与远程仓库实时更新的,一段时间后可能会落后于远程仓库,需要使用pull或fetch更新。
当我们从远程仓库clone后的状态如下:
而在一段时间后,如果远程仓库被别人更新后,变为
可见本地的跟踪origin/master落后于远程仓库。
fetch拉取数据
通过fetch命令拉取远程仓库数据到本地,
此时本地的远程跟踪分支更新了,但是却形成了两个分支,所以需要将两个分支合并,这样在以后push到远程仓库时才不会出现冲突。当然这里如果用pull命令代替fetch,则会自动执行fetch和merge两个命令,不过仍然需要人工解决合并冲突的问题。
推送
之前介绍的都是本地修改或者将远程仓库内容拉到本地,同样的我们可以通过push将本地仓库推送到远程仓库
git push remotename branchname
上述命令为将一个本地分支推送到远程仓库。也可以通过--all将本地所有分支推送。
git push remotename --all
删除远程分支
git push origin --delete serverfix
变基
将源分支上与目标分支不同的操作再在目标分支上重演一次。
$ git checkout experiment
$ git rebase master
如此将可以对过去的提交进行修改,但是也存在一个重大的风险,所以请记住:
不要对在你的仓库外有副本的分支执行变基。