在实际的开发过程中,git冲突想必是很常见的事情,一些代码冲突可以通过进入文本编辑器,逐个手动解决冲突。但是对于rebase或者merge产生的冲突,涉及到很多文件,而且这类冲突一般是一道只保留一方的选择题。所以逐个手动解决这类冲突不太现实。

于是这今天这两位助手: --ours --theirs 。这两个命令适用于 both added both deleted both modified 等类型的冲突,通过这两个助手完整保留某一方的修改,而不用进入到文本编辑器逐行解决冲突。

在介绍两类助手之前,我们先回顾一下 git rebase git merge 两类合并方式。

git merge 和 git rebase

假设在master主分支的基础上,有两个分支 branch_a branch_b ,并在各自的分支上有一些提交,当前指向的分支为 branch_a ,如图所示。

执行 merge 命令 git merge branch_b 之后,分支的状态如下图所示。 在这里插入图片描述

执行 rebase 命令 git rebase branch_b 之后,分支的状态如下。

git merge 会抽取两个分支上新增的提交,并将其合并在一起,产生一个新的提交D,生成的D节点有两个父节点。其中在合并的过程中可能会发生冲突。

git rebase 会以 branch_a 为参照,提取 branch_b 分支上的提交,将这些修改作用在 branch_a 分支上,最终结果不会产生新的提交节点。其中在将提取的修改作用在 branch_a 的过程中可能会发生冲突。

以我个人的经验,在开发过程中很少应用 git merge 合并代码,更常用的是 git rebase 。此外在开发过程中,经常使用 git rebase 命令获取master主分支的最新提交代码,在完成个人的开发任务之后,也需要rebase master分支上的代码才能申请 Pull Request,自动合并。

使用ours与theirs解决冲突

在上述两种合并中,都可能会产生冲突,需要通过手动解决。如果想要保留两个分支中的某一个可以使用 git chekout --ours <fileName> 或者 git checkout --theirs <fileName> ,这里需要注意的是,一定要知道哪个分支对应 ours theirs

直接说结论,对于 merge rebase 来说,这两个选项对应的分支正好是相反的。以上述示例项目为例。在使用 merge 时, ours 指的是当前分支,即 branch_a theirs 指的是要被合并的分支,即 branch_b 。而在 rebase 的过程中, theirs 指的是当前分支,即 branch_a ours 指向修改参考分支,即 branch_b

这么容易混淆的概念记不住? 没关系,我个人还有另一个比较直观的办法,就是直接查看冲突文件中的冲突标记。在进入冲突状态后,git会将冲突的代码用 <<<<<<< ======= >>>>>>> 标识出来,方便我们手动解决。在冲突标记中, ======= 之前表示的是 ours 分支,之后表示 theirs 分支,只需要查看某一处冲突代码即可判断出要保留的分支。

<ours contents>

=======

<theirs contents>

冲突解决步骤

git rebase 合并命令为例说明解决冲突的步骤。

$ git checkout --ours <fileName>
$ git add <fileName>   //标记该冲突已解决
$ git rebase --continue 
$ git status //查看当前冲突状态
  1. 使用oerstheirs选择要保留一方的提交
  2. 标记冲突已解决
  3. 使用--continue继续执行rebase
  4. 查看冲突状态

在解决冲突过程中,如果遇到某个提交记录不需要应用,可以用下面命令忽略:

git rebase --skip

使用--abort命令可以取消本次rebase

git rebase --abort
                    在实际的开发过程中,git冲突想必是很常见的事情,一些代码冲突可以通过进入文本编辑器,逐个手动解决冲突。但是对于rebase或者merge产生的冲突,涉及到很多文件,而且这类冲突一般是一道只保留一方的选择题。所以逐个手动解决这类冲突不太现实。于是这今天这两位助手:--ours和--theirs。这两个命令适用于both added、both deleted、both modified等类型的冲突...
				
git-resolve-conflict <strategy> <filename> 使用给定的策略(-我们,-他们的,-联盟)仅解决一个文件中的合并冲突 git resolve-conflict --ours package.json git resolve-conflict --theirs package.json git resolve-conflict --union package.json git resolve-ours package.json git resolve-theirs package.json git resolve-union package.json 你为什么需要它 为了能够解决某些明确定义的合并冲突类型,而无需打开mergetool。 这在自动合并脚本(例如,Jenkins作业)中,或者在有大量定义明确的合并要解决时,特别有用。 将复制到您
git checkout --theirs conflicted_file.txt # 保留远端的 git checkout --ours conflicted_file.txt # 保留本地的 然后执行add和comm...
git-wip-timemachine git-wip-timemachine 是 Peter Stiernström 对的修改版本,它允许您从 Emacs 浏览文件的版本。 git-wip-timemachine在。 要开始使用它,请按照下列步骤操作: 如果您还没有,请设置 : 将git-wip包克隆到您的$HOME目录: $ git clone https://github.com/itsjeyd/git-wip 如果您决定克隆到不同的目录并且该目录不是您在 Emacs 中的exec-path一部分,您需要将以下代码添加到您的 init 文件中(以确保 Emacs 可以找到git-wip脚本) : (add-to-list 'exec-path "/path/to/git-wip") 将以下代码添加到您的 init 文件中: 在很多时候,我们在merge或者cherry-pick的时候,发生了冲突;然而对于某个冲突文件,我们需要全盘接收本地的代码或者全盘接收合并分支的代码;这个时候,如果我们在冲突文件一个个解决冲突的话,无疑是最笨的方法;如果不解决冲突的话,又不能对该冲突文件进行任何其他的操作,例如checkout或者stash;此时,–ours和–theirs就充分体现其价值呢。 保留本地代码 git checkout --ours fileName 保留合并分支代码 git checkout
usage: git checkout [<options>] <branch> or: git checkout [<options>] [<branch>] -- <file>... -q, --quiet suppress progress reporting
Git历史记录编辑器 Git历史记录编辑器是由Github Pages托管的易于使用的在线工具,旨在帮助您编辑过去的提交。 只需输入即可使用 :high_voltage: 批量编辑模式 常规编辑模式 编辑作者姓名/电子邮件 编辑提交时间/日期 编辑提交消息 这个怎么运作 编辑您的git历史记录需要3个主要步骤: 步骤1:汇入 为了导入有关任何项目中过去提交的信息,Git History Editor询问您git log的结果。 由于此日志是由程序读取的,因此可以使用git log的--pretty=format选项对其进行格式化,然后将其编码为base64以避免出现回车或空格问题。 npm install -g git-split-diffs git config --global core.pager git-split-diffs --color | less -RFX npm install git-split-diffs git config core.pager npx git-split-diffs --color | less -RFX 手动使用 git diff | git-split-diffs --color | less 默认情况下,将行换行以适合屏幕。 如果您希望截断它们,请更新wrap-lines设置: git con
使用单个命令更改多个 git 提交的日期。 对于自制软件用户,您需要运行brew tap PotatoLabs/homebrew-git-redate然后brew install git-redate 。 如果你不使用自制软件,你可以克隆这个 repo 并将git-redate文件移动到 $PATH 中的任何文件夹中。 之后重新启动您的终端,您就可以开始了! 对于${INSTALLATION_PATH}\mingw64\libexec\git-core用户,您可以将文件粘贴到${INSTALLATION_PATH}\mingw64\libexec\git-core 。 假设您使用默认设置,安装路径将为C:\Program Files\Git 。 只需运行: git redate --commits [[number of commits to v
<h3>回答1:</h3><br/>当使用 git cherry-pick 时,如果遇到冲突,你可以通过以下步骤解决冲突: 1. 使用 `git status` 检查冲突的文件。 2. 打开冲突的文件并手动解决冲突。 3. 使用 `git add` 标记解决冲突的文件。 4. 使用 `git cherry-pick --continue` 继续执行 cherry-pick。 如果无法解决冲突,可以使用 `git cherry-pick --abort` 放弃 cherry-pick。 <h3>回答2:</h3><br/>git cherry-pick是Git版本控制系统中的一项功能,可以将其他分支中的单个提交记录(或一系列提交记录)应用到当前分支中。但是,当从其他分支合并提交记录时,可能会遇到冲突的情况,需要解决冲突。下面我将详细介绍git cherry-pick解决冲突的方法。 1. 拉取其他分支 使用git cherry-pick命令,需要先拉取需要的其他分支的最新代码,命令为: git pull <other-branch> 其中,other-branch为需要拉取代码的分支名称。 2. cherry-pick合并特定提交记录 使用以下命令可以将other-branch分支上某个指定的提交记录(commit)应用到当前分支上: git cherry-pick <SHA> 其中,SHA为这个提交记录的标识符。 3. 解决冲突 如果git cherry-pick合并其他分支的提交记录时发生冲突,需要手动解决冲突使用以下命令可以查看冲突的文件: git status 使用以下命令可以手动解决冲突git mergetool 此命令会启动默认的合并工具。 4. 完成合并 解决冲突后,使用以下命令进行提交: git commit -m "Merge <SHA> from <other-branch>" 其中,<SHA>为其他分支提交记录的标识符,<other-branch>为其他分支的名称。 以上就是使用git cherry-pick解决冲突的方法。总体来说,这种方法比较简单,但需要仔细处理每一个冲突,以确保代码的合并是正确的,并且不会导致其他问题。因此,我们建议在使用git cherry-pick命令时,最好查看相关的文档和指南,以确保正确使用。 <h3>回答3:</h3><br/>git cherry-pick是Git中一个常用的命令,它可以拣选某个分支的一个或多个提交,并应用到当前分支中。在使用git cherry-pick时,有时可能会遇到冲突的情况,这时就需要解决冲突。 当git cherry-pick出现冲突时,可以使用下列步骤解决: 1.查看出现冲突的文件 使用命令git status可以查看文件的状态,其中冲突的文件会被标记为“both modified”。 2.编辑冲突文件 冲突文件在编辑时会出现两个分支的内容以及冲突标识,需要手动编辑文件并解决冲突。可以根据需要保留某个分支的内容,或者将两个分支的内容合并。编辑完成后,需要将文件保存并关闭。 3.提交修改 完成编辑后,可以使用git add命令将修改添加到暂存区,然后使用git commit命令提交修改并添加提交信息。 4.继续拣选提交 如果要继续拣选提交,可以使用git cherry-pick --continue命令,Git会自动跳过已经应用过的提交,继续拣选接下来的提交。 5.取消拣选 如果在执行git cherry-pick操作时发现错误,可以使用git cherry-pick --abort命令取消拣选,并回到操作前的状态。 总之,当git cherry-pick出现冲突的问题时,需要手动解决冲突,并按照以上步骤进行操作。这也是Git作为分布式版本控制系统的优势所在,使得团队开发更加协同,并且能够更好地管理代码的版本和历史。
书忆江南: 补充:如果吃不准用--ours还是--theirs,例如是both add冲突,且冲突的文件只需要其中一方的,可以丢掉另一方的同名文件改动,那么可以用如下命令只保留其中一方(如master分支)的同名文件: [code=plain] git checkout master -- pom.xml [/code] 参考的链接为:https://stackoverflow.com/questions/9823692/resolving-a-both-added-merge-conflict-in-git/9824403#9824403