创建分支
git branch
—— 显示所有分支,其中以 “*” 号开头的为当前活跃分支
git branch branch_name [old_branch or any_commit]
—— 创建分支(或将已删除的分支恢复到某个提交节点)
git branch -d branch_name
—— 删除分支(-D 选项为强制删除)
git checkout branch_name
—— 切换分支
—— 切换分支之前要确保已产生的更改已经提交或保存。git commit --all 可以提交所有已产生的更改,git stash 可以保存已产生的更改(之后通过 git stash pop 可以恢复已保存的更改)。
git reset --hard <某次 commit 的 hash值>
—— 将分支的指针指向特定的某次提交,该操作会覆盖当前工作区和暂存区的所有更改。
git reflog
—— 查找所有的提交节点,输出格式为 <散列值> HEAD@{n}: checkout/merge/commit: comment
gc
—— 清理提交对象
合并分支(merge)
语法
—— git merge 被合并的分支 [活动分支]
合并算法
—— git 实现了3种不同的合并算法,默认情况下采用的是递归算法。还有3路算法和 octopus 算法。
冲突
—— 两个或多个人员对同一组文件的相同部分做了不同的修改(编辑冲突),或两个或多个人员对同一组文件的不同部分做了修改而这些修改互相之间有一定的关联(内容冲突)。编辑冲突容易发现和排查,内容冲突比较隐蔽(规避方法:① 借由自动化测试构建保护机制;② 使用断言,前置与后置条件;③ 定义清晰的接口实现松耦合;④ 静态类型检查)。
冲突标志:<<<<<<<(被合并的分支对冲突部分的修改)|||||||(冲突部分的原始内容)>>>>>>>(活动分支对冲突部分的修改)【默认显示 <<<<<<< 和 >>>>>>>,可通过 git config merge.confilictstyle diff3 显示三个标志】
合并分支的过程中可能自动合并也可能因存在冲突而需要人工介入。其中自动合并的文件将默认添加到了暂存区,等待提交。需要人工介入的部分则要求排除冲突后通过 git add 手动添加到暂存区。
解决冲突:
方式① 打开冲突文件逐一调整冲突部分;
方式② git checkout --ours <文件/目录> 使用活动分支的版本;
方式③ git checkout --theirs <文件/目录> 使用被合并的分支的版本;
可以使用 git mergetool 辅助解决冲突。
取消合并
—— git reset --merge
快进合并
—— git merge --no-ff 禁用快进合并
巧用 git log
(1)第一父级提交历史
—— git log --first-parent --online R1.0..master
—— 通常指定一个分支用于集成所有的已开发、即将开发的特性,叫做结果分支,一般为 master 分支。该结果分支保存着各个特性合并提交的序列。第一父级提交就是以结果分支当前 HEAD 所在的节点为基础,合并特性分支,产生新的结果分支节点,更新 HEAD 的过程。合并过程使用的是快进合并。
(2)对比合并分支和被合并分支
—— git log MERGE_HEAD..HEAD 显示本地活动分支相对于被合并分支 HEAD 的修改
—— git log HEAD..MERGE_HEAD 显示被合并分支相对于本地活动分支 HEAD 的修改
—— git log --graph --oneline --decoreate HEAD MERGE_HEAD 图形化显示差别
—— git log --merge 只输出合并提交
—— git merge-base HEAD MERGE_HEAD 显示合并操作的基础节点(提交的 hash 值)
—— git diff --stat 合并操作的基础节点的hash值 HEAD 显示本地修改
—— git diff --stat 合并操作的基础节点的hash值 MERGE_HEAD 显示被合并节点的修改
变基(rebase)
杜绝“钻石链”,线性发展。
移植分支