有识

个人网 | 追寻一切真知灼见

用户工具

站点工具


侧边栏

博主公告

想读书,想旅游,想运动,但是没有时间?其实我们不是没有时间,只是没有真正把想做的事情,放在重要的位置上,或者干脆没时间搞清楚到底那件事情对你来说更重要。^_^ 欢迎大家收看《程序员带你学打羽毛球》 和博主一起加入运动的行列。 ease 11:53 - 08月02日




最新博文》更多博文

分类索引

博主简介
吕某某 Leo
河北人,网名:ease
资深IT菜鸟,创业者
兴趣爱好:
人工智能,运动,读书,coding
人生格言:
命由己造 相由心生 有容乃大 无欲则刚 》博主管理》关于博主


blog:ease:git:git-basic7

分支(重点)

  1. 超级轻量:必杀技。svn 是整个文件夹的一个拷贝。
  2. 鼓励频繁创建和合并,最强大的功能之一。

分支原理

提交对象:

  • 提交信息:作者等信息
  • 父提交对象的指针:构成了提交历史树。
  • 树对象指针:指向具体的文件块。

树对象:对文件 blob 对象的索引。
blob 对象:就是保存的具体文件信息。

参考:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B

创建分支

git branch bname
  • 分支仅仅是新建立了一个指针。指向当前分支。(这个指针是指向 提交对象的校验和 因此异常快速)
  • HEAD指向当前分支, 可理解为是当前分支的别名。
  • 创建分支并不会切换分支。

分支切换

git checkout test
  • HEAD 移动过去而已,仅此而已所以非常快速。
  • HEAD 会随着当前分支的提交而移动。
  • 分支切换你的工作目录会随之变化。


查看项目的交叉历史

使用 gitg git gui(图形化工具比较直观)

也可以用命令:

git log --oneline --decorate --graph --all

定义别名:

git config --global alias.tree 'log --oneline --decorate --graph'

git tree 等同于命令: git log –oneline –decorate –graph
git tree –all

分支场景

https://git-scm.com/book/zh/v2/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

  • 开发分支工作。发现了问题1需要解决。
  • 切换到 问题1分支继续工作。
  • 突然产生线上紧急问题2需要解决。。
  • 这时非常简单,保存当前问题1进度(提交,amend提交,或者stashing)
  • 然后切换回 主分支建立问题2分支解决问题即可。解决好了,如果是bug 同样合并到其他分支。

分支合并

git merge 把某个分支 合并到当前分支。

(fast-forward)快进 合并
如果master分支的所有节点,都在test 分支中。则这个合并就是一个快进合并。

no-ff 非快进合并
如果两个分支都有自己的节点,则只能非快进合并。 也可以添加参数 –no-ff 进行强制非快进提交。

master分支 解决了问题2,test分支 解决了问题1
把test 合并到 master 注意非 –no-ff 合并,因为各自都有新的提交。因此需要进行c2 c4 c5 三方合并,并产生 c6

遇到冲突的分支合并

注意: 合并时 提示冲突。 此时git 对两个分支确实进行了合并,但是没有进行提交。解决冲突后,提交即可

git status 查看处于unmerged 状态的文件。然后逐个进行 解决冲突。

解释冲突标识:
<<<<<<< HEAD:index.html
当前分支index.html 的代码
=======
iss53 分支 index.html 代码
>>>>>>> iss53:index.html

解决冲突就是保留其中一部分即可。 冲突解决后 用 git add 文件名暂存,即表示这个文件已经解决了冲突。但是注意,即便你没有做任何修改,一样可以 git add. 前段时间 马蜂窝旅游网火了,就是因为上线了带有冲突标志的代码。 当所有冲突都解决后。可以 git commit 提交则表示合并提交完毕。 提交节点,显示两个父分支信息。(这个提交是一个合并提交。)

分支管理

git branch 显示分支列表

*ease
master

带有星号的是当前检出的分支,也就是HEAD 所指向的分支

git branch -v 显示每个分支最后一次提交的信息。
git branch --merged  已经合并到当前分支的 其他分支显示出来。
  iss53
* master  

代表 iss53 已经合并到了 master 因此可以考虑删除掉 iss53 分支。因此不会丢失任何信息。
git branch --no-merged  显示尚未合并到当前分支的其他分支。

!!注意 合并有一个方向问题。也就是父子关系,如果我们删除尚未合并的分支,因为他不是任何其他分支的父分支,因此将会找不到这个节点。 (也有办法恢复。可以查查手册。)

blog/ease/git/git-basic7.txt · 最后更改: 03:42 - 09月02日 (外部编辑)