GIT & BEYOND
COMPARE 介绍
张旭 2017-6-29
Git & beyond compare
• 三路合并和Beyond Compare
two-way merge的问题
three-way merge和冲突
Beyond compare的three-way merge视图
• Git基本原理
git数据模型
fetch工作机制
rebase工作机制
merge工作机制
pull工作机制
pick工作机制
• Git操作和Beyond Compare视图
• 试题
三路合并和Beyond Compare
two-way merge的问题
Two-way merge
• 直接比较待merge的两个版本
• Two-way merge无法分辨如下情况:
• Mine和Yours是子孙关系,如Mine为4, Yours为3
• Mine和Yours是兄弟关系,如Mine为4, Your为6
Three-way merge和冲突
• 先找到两个待合并版本的最近祖
先nearest common
ancestor
对于每行,有两种情况:
• 自动合并:一个版本和NCA一样,
另一个版本不一样:取不一样的
版本
• 手工合并:两个版本都和NCA不
一样
需要到手工合并的文件,就是有冲
突
在TortoiseGit设置Beyond Compare
BC的Three-Way merge视图
(3) (1) (2)
(4)
一般的Three-way merge工具都有四个视图
• Mine(Local):合并的目标版本
• Theirs(Remote):合并的源版本
• Base:Nearest Common Ancesstor。
• Result:合并结果
只有Result被commit后,才
会变成右图的(4)
“找到Base”一般是VCS(如git)的功能
BC的Three-Way merge视图(需演示)
• Result面板:
• 白底:来自base
• 浅绿底:来自Left
• 粉红底:来自Right
• 网格分红底:冲突未解决
• 浅黄底:手工修改
• 操作
• 其他功能:
• Left面板:Left和
Base的区别
• Right面板:Right和
Base的区别
• Base面板:Left或
Right里删掉的内容
Git基本原理
Git数据模型
• Git仓库有很多Commit组成(一张有向图)
• 节点是:commit,每个commit有个md5值
• 边是:commit的parent信息
• 每个Commit保护了一组的文件集合和父子关系
• 图里的一些节点被打了“书签”称为ref
• 本地仓库和远程仓库的结构是一样的,只是内容可能不同
Git的ref
• ref分三种
• head:即本地的分支
• remote:
• 每个远程仓库一个目录
• 记录了remote仓库的所有分支
• tag:标签
• Demo(RestExpress)
在这张PPT里
把git服务器上的仓库称为远程仓库
Fetch
• 功能
更新remote ref为远程仓库里的head ref分支
并下载相关的commit数据
• TotoriseGit里一般有两种fetch操作
Sync窗口的fetch某一个分支
Fetch窗口的fetch所有分支
• Fetch某一个分支如:
git.exe fetch --progress -v "origin"
release_2017_04_26_rpg:remotes/origin/release_2017_04_26_rpg
remote ref:remotes/origin/release_2017_04_26_rpg
远程仓库:origin
head ref:release_2017_04_26_rpg
Fetch
local before fetch
remote
local after
fetch
remote/release_2017_06_13
现在指向这里
因为remote没有更新的
master不变
Rebase
local before rebase
local after rebase
• 功能
• 将包含在当前分支且不包含在
remote分支的commit保存到临
时空间
• 将当前分支reset到remote分支
• 将被保存的commit应用到当前分
支
merge
• 功能
• 将选择的分支合并的当前
分支
• 合并结果commit后,
生成的commit节点有
两个parent
pull
• fetch:将远程仓库的某个分支fetch过来
• merge:将fetch过来的分支,合并到当前分支
假设当前分支为release_2017_06_13,被pull的分支为remote/release_2017_06_13
remote
local after
pull
remote/release_2017_06_13
现在指向这里
merge结果在这里
pick
• 将某个commit放到当前分支
例如左图当前分支为master,待pick的commit是4,则pick后为右图
TortoiseGit各功能与BC的视图
功能 左边(mine) 右边(theirs)
merge 当前分支 待合并进来的分支
Pull 当前分支 待Fetch且合并进来的
分支
Rebase 当前分支 远程的
diff(选中两个版本) 下面的(跟排序有关) 上面的
diff(查看commit内容) 未更改前 更改后的
pick 当前分支 被pick的commit
参考资料
• Beyond Compare Text Merge
• 在TortoiseGit中设置Beyond Compare
• git fetch
• git merge
• git rebase
• git pull
• git internals
• git merge vs git rebase
习题
习题1
• 要求
安装beyond compare
在TortoiseGit中设置beyond compare
想办法(比如通过merge)打开Beyond Compare的Three-
Way merge视图
• 作业提交内容
Beyond Compare的Three-Way merge视图截图: exercise1.png
习题2
• 要求
• 新建一个git仓库
• 通过git操作构建和下图一样的提交记录
• 作业提交
• git仓库压缩包exercise2.git.zip
习题3
• 要求
切换目录到习题1的git 仓库根目录
切换目录到.git/refs目录
用tree /f命令列出.git/refs目录下的所有文件
用文件编辑器打开.git/refs/heads/master
• 作业提交
tree命令的结果:exercise3_tree.txt
.git/refs/heads/master的内容:exercise3_master.txt
习题4
• 问题
• 假设只有一个文件README.txt
• 1节点时,该文件只有一行,为
• init line
• 2节点时,该文件只有两行,为
• init line
• add line by feature
• 3节点时,该文件只有两行,为
• init line
• add line by master
• 假设当前分支为master
• 要求
• 当从feature merge到master时,beyond compare的Mine/Theirs/Base面
板内容分别是什么?请提交文件:exercise4_mine.txt,
exercise4_base.txt exercise4_theirs.txt
• 在右上角图的基础上,画出合并以后的图:exercise4.png
• 作业需要提交合并后的git仓库:exercise4.git.zip
习题5
• 问题:
• 在习题4的基础上,在冲突解决窗口中,如果选择Resolve
conflict using mine,那么README.txt内容将会是什么?
• 作业提交
• exercise5_mine.txt
习题6
• 要求
搜索google,回答fetch-rebase和merge各有什么优缺点
优缺点各描述最主要的一条
• 作业提交
exercise6.txt

Three way merge in Git with Beyond compare