这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
blog:ease:git:git-basic7 [13:16 - 09月10日] ease 创建 |
blog:ease:git:git-basic7 [03:42 - 09月02日] (当前版本) |
||
---|---|---|---|
行 5: | 行 5: | ||
- 鼓励频繁创建和合并,最强大的功能之一。 | - 鼓励频繁创建和合并,最强大的功能之一。 | ||
- | **分支原理:** | + | ===== 分支原理===== |
提交对象:\\ | 提交对象:\\ | ||
行 19: | 行 20: | ||
参考:https:// | 参考:https:// | ||
+ | |||
+ | |||
+ | |||
+ | ===== 创建分支 ===== | ||
+ | |||
+ | < | ||
+ | git branch bname | ||
+ | </ | ||
+ | * 分支仅仅是新建立了一个指针。指向当前分支。(这个指针是指向 提交对象的校验和 因此异常快速) | ||
+ | * HEAD指向当前分支, 可理解为是当前分支的别名。 | ||
+ | * 创建分支并不会切换分支。 | ||
+ | |||
+ | {{https:// | ||
+ | |||
+ | |||
+ | |||
+ | ===== 分支切换 ===== | ||
+ | |||
+ | < | ||
+ | git checkout test | ||
+ | </ | ||
+ | |||
+ | * HEAD 移动过去而已,仅此而已所以非常快速。 | ||
+ | * HEAD 会随着当前分支的提交而移动。 | ||
+ | * 分支切换你的工作目录会随之变化。 | ||
+ | |||
+ | {{https:// | ||
+ | ------------------ | ||
+ | {{https:// | ||
+ | |||
+ | |||
+ | |||
+ | ===== 查看项目的交叉历史 ===== | ||
+ | |||
+ | |||
+ | 使用 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:// | ||
+ | |||
+ | * 开发分支工作。发现了问题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 | ||
+ | |||
+ | {{https:// | ||
+ | {{https:// | ||
+ | |||
+ | |||
+ | |||
+ | ===== 遇到冲突的分支合并 ===== | ||
+ | |||
+ | |||
+ | 注意: 合并时 提示冲突。 此时git 对两个分支确实进行了合并,但是没有进行提交。解决冲突后,提交即可 | ||
+ | |||
+ | git status 查看处于unmerged 状态的文件。然后逐个进行 解决冲突。 | ||
+ | |||
+ | < | ||
+ | 解释冲突标识: | ||
+ | <<<<<<< | ||
+ | 当前分支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 | ||
+ | </ | ||
+ | !!注意 合并有一个方向问题。也就是父子关系,如果我们删除尚未合并的分支,因为他不是任何其他分支的父分支,因此将会找不到这个节点。 | ||
+ | (也有办法恢复。可以查查手册。) | ||
+ | |||
+ |