[Git] 在合并分支遇到文件冲突时,--ours(--theirs) 的具体指向是什么?

在使用 mergerebase 对不同分支进行整合时,如果对同一个文件的同一个部分进行了不同的修改,就会遇到文件冲突。

git checkout 命令可以使用 --ours--theirs 选项,这是一种无需合并的快速方式,可以选择留下一边的修改而丢弃掉另一边修改。

这里主要说明在使用 git checkout --ours 或者 git checkout --theirs 时,--ours(--theirs) 的具体指向是什么。


预先假设 git 仓库有分支 dev,在快照 C1 处新建分支 fix
分支 fix 相继提交了 C2、C3 快照;
分支 dev 提交了 C4 快照。

 c2---C3 (fix)
 /
C0---C1---C4 (dev)

1. 使用 merge 遇到冲突

切换到 dev 分支。

使用 git merge 命令将分支 fix 合并到分支 dev,两条分支都对文件 file1 的同一个部分做了不同的修改;此时,会出现合并冲突。

假设我们需要保留 dev 分支上对 file1 的变更,放弃 fix 分支的变更,可以使用:

git checkout --ours

--ours,此时表示的是 dev 分支的变更。


假设我们需要保留 fix 分支上对 file1 的变更,放弃 dev 分支的变更,可以使用:

git checkout --theirs

--theirs,此时表示的是 fix 分支的变更。

2. 使用 rebase 遇到冲突

同样的前提,使用 rebase 对分支进行处理,将 dev 分支作为目标基底分支,将分支 fix 合并到分支 dev

假设我们需要保留 dev 分支上对 file1 的变更,放弃 fix 分支的变更,可以使用:

git checkout --theirs

--theirs,此时表示的是 dev 分支的变更。


假设我们需要保留 fix 分支上对 file1 的变更,放弃 dev 分支的变更,可以使用:

git checkout --ours

--ours,此时表示的是 fix 分支的变更。


3. 使用 rebase 时反直觉的指向

这可能和 rebase 的实现有关。

使用 rebase,将 fix 分支合并到 dev 分支:

git checkout fix
git rebase dev

分支 fix 是当前分支,dev 是变基操作的目标基底分支。

执行时,会先找到这两个分支(fixdev )的最近共同祖先 C1,然后对比当前分支 fix 相对该祖先的历次提交(C2、C3 快照),提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C4,最后将之前另存为临时文件的修改依次应用为 C2'、C3'。

如果文件 file1 出现合并冲突,--ours 指的是当前分支 fix 的修改;--theirs 指的是目标基底 dev 的修改。

作者:未央原文地址:https://segmentfault.com/a/1190000043799693

%s 个评论

要回复文章请先登录注册