前言

git rerere 功能是一个隐藏的功能。 正如它的名字 “reuse recorded resolution” 所指,它允许你让 Git 记住解决一个块冲突的方法,这样在下一次看到相同冲突时,Git 可以为你自动地解决它

(呜呼呼~ 最近真的有点忙,差点我都忘了写博客了!赶紧补上一篇)

相信大家也在平常工作中会用到 git,我也在不断持续学习 git,毕竟说实话 git 可能是 21 世纪里最流行的开源分布式版本控制系统了。

然后我在学习 git 的过程中,发现了一个隐蔽很深但相当实用的 git 工具命令 —— git rerere。以下我将带大家用从 0 到 1 建立仓库并演示一遍 git rerere 的使用流程。

准备工作

初始化一个示例仓库

$ mkdir git-rerere-example
$ cd git-rerere-example/
$ git init
复制代码

进行一个初始化提交

$ echo 'v1.0' > README.md
$ git add .
$ git commit -m "version 1.0"
复制代码

用 git status 查看当前工作树状态

$ git statusOn branch master
nothing to commit, working tree clean
复制代码

ok,当前我们在 master 分支,我们来创建一个特性分支 feat 用来开发某个功能

$ git checkout -b featSwitched to a new branch 'feat'
复制代码

很好此时我们有两个分支了。准备工作完成!

$ git branch* featmaster
复制代码

等等!我们还没开启 git rerere 功能,这个很简单!我选择全局配置 git config。当然也可以只是配置当前仓库,把 --global 标识符给去掉即可。

$ git config --global rerere.enabled true
复制代码

查看是否配置成功,可以看到 rerere.enabled=true,于是准备工作 done!

$ git config --global --listuser.email=USERNAME@gmail.com
user.name=USERNAME
core.editor=vim
rerere.enabled=true
复制代码

演示冲突

假设团队成员 Tom 在 feat 分支上做了一些激动人心的功能,并且发了个特性版本!并且将 README.md 的版本内容声明改成了 v1.1,如下:

$ echo 'feat: blah' > feat-blah.txt
$ echo 'v1.1' > README.md
复制代码

于是成员 Tom 淡定的在 feat 分支上提交了一个 commit

$ git add .
$ git commit -m "version v1.1"[feat b1c500b] version v1.12 files changed, 2 insertions(+), 1 deletion(-)create mode 100644 feat-blah.txt
复制代码

查看当前提交情况,可知我们目前 HEAD 指针在 feat 分支,commit 领先于 master

$ git log --graph --oneline* b1c500b (HEAD -> feat) version v1.1
* 03bf028 (master) version 1.0
复制代码

让我们切换到 master 分支,同时假设我们身份是另一个团队成员 Jerry。

$ git checkout masterSwitched to branch 'master'
复制代码

成员 Jerry 默默地在 master 分支上工作,同时发了一个大版本 v2.0,如下:

$ echo 'enjoy weekend!' > daily.txt
$ echo 'v2.0' > README.md
$ git add .
$ git commit -m "version 2.0"[master 4ab5514] version 2.02 files changed, 2 insertions(+), 1 deletion(-)create mode 100644 daily.txt
复制代码

再查看当前提交情况!

$ git log --graph --oneline* 4ab5514 (HEAD -> master) version 2.0
* 03bf028 version 1.0
复制代码

过了一段时间,成员 Jerry 觉得可以合并成员 Tom 的特性分支 feat 了~ 于是如下:

$ git merge featAuto-merging README.md
CONFLICT (content): Merge conflict in README.md
Recorded preimage for 'README.md'
Automatic merge failed; fix conflicts and then commit the result.
复制代码

看看冲突内容

$ cat README.md<<<<<<< HEAD
v2.0
=======
v1.1
>>>>>>> feat
复制代码

但是留意以上 Recorded preimage for 'README.md' 这句提示,git 正在记录你解决冲突的操作!

成员 Jerry 保留自己的改动(因为 master 版本大于 feat 版本),解决了冲突!

$ git checkout --ours README.md
$ cat README.mdv2.0
复制代码

于是提交一个新的 commit!

$ git add .
$ git commit -m "merge feat"Recorded resolution for 'README.md'.
[master f1ed9a5] merge feat
复制代码

此时发现 git 提示和以往不一样了,多了一句 Recorded resolution for 'README.md'.

使用 git rerere 自动解决冲突

在此之前,查看当前提交情况!可见成功合并了 feat,并且 HEAD 指针在 f1ed9a5

$ git log --graph --oneline*   f1ed9a5 (HEAD -> master) merge feat
|\
| * b1c500b (feat) version v1.1
* | 4ab5514 version 2.0
|/
* 03bf028 version 1.0
复制代码

既然 git 已经记录我们解决冲突的操作,此时让我们重置到 4ab5514(合并 feat 分支之前),也就是上一个提交,可用 HEAD^ 表示

$ git reset --hard HEAD^HEAD is now at 4ab5514 version 2.0
复制代码

很好,让我们再尝试一下合并 feat 分支!

$ git merge featAuto-merging README.md
CONFLICT (content): Merge conflict in README.md
Resolved 'README.md' using previous resolution.
Automatic merge failed; fix conflicts and then commit the result.
复制代码

此时 git 提示我们 Resolved 'README.md' using previous resolution. 告诉我们自动用我们之前的冲突解决策略解决了 README.md 的冲突

亲眼见证一下!果然成功了,而且在它里面没有合并冲突标记

$ cat README.mdv2.0
复制代码

当然如果改变想法了,不想用之前的合并冲突策略,也可以

$ git checkout --conflict=merge README.md
$ cat README.md<<<<<<< ours
v2.0
=======
v1.1
>>>>>>> theirs
复制代码

这时候就可以重新解决了!

然后你想了想,又想用回之前的合并冲突策略,这时候就直接可以用 git rerere 命令来指示 git 操作

$ git rerereResolved 'README.md' using previous resolution.
复制代码

变基

反而言之,我们变基特性分支 feat,一样可以!

$ git checkout feat
$ git rebase master...
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Resolved 'README.md' using previous resolution.
...
复制代码

同样 git 提示了我们 Resolved 'README.md' using previous resolution. 一样复用了之前的合并冲突策略

$ cat README.mdv2.0
复制代码

然后我们确认无误,如下操作进行提交

$ git add .
$ git rebase --continueApplying: version v1.1
复制代码

此时我们查看 commit 提交情况,变基成功!

$ git log --graph --oneline* 2e34640 (HEAD -> feat) version v1.1
* 4ab5514 (master) version 2.0
* 03bf028 version 1.0
复制代码

至此演示已经基本结束了,同学们 get 到了么?

应用场景

因为 git rerere 会记住解决一个块冲突的方法,因此至少有以下应用场景:

  1. 需要进行多次的重新合并的时候(比如合并 feat 分支,提交测试发现失败,然后重置回去重新合并)
  2. 某个特性分支与主开发分支一直保持最新,解决相同的块冲突!
  3. 经常使用变基(如以上 feat 分支变基)

总而言之,git rerere 是个相当不错的工具,使用得当的情况下,对工作效率的提升很有帮助~

小结

建议同学们可以根据以上流程在命令行中体验一次,然后也可以在工作中使用,说不定会有意外之喜~ 同时也建议大家可以参考官方文档 Git 工具 - Rerere 学习。

最后,这篇文章对大家如有助益,不胜荣幸~

转载于:https://juejin.im/post/5d4fdb4d51882506c4646c0a

从0到1演示用 Git Rerere 自动解决冲突相关推荐

  1. zbb20190109 git命令行解决冲突文件步骤

    git命令行解决冲突文件步骤 方法一(推荐使用): git pull 出现冲突后丢弃本地冲突文件修改,采用远程文件覆盖本地文件 git checkout  [文件路径] 例:git checkout  ...

  2. git 主干修改合并到分支_idea+git合并分支解决冲突及详解步骤

    Git分支详解参考: 分支管理组成 1.1.master主干 在版本管理中,代码库应该仅有一个主干.此主干是和当前生产保持一致的,是可用的.稳定的可直接发布的版本,不能再主干上进行任何开发操作.git ...

  3. idea+git合并分支解决冲突及详解

    1.什么是冲突 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致.读起来有点绕,结合下面的案例理解. 从上面对冲突的定义来看,冲突时发生在同一个文件上的. 2.生产上冲突的场景 常见冲突的 ...

  4. idea+git合并分支解决冲突及详解步骤

    Git分支详解参考: https://blog.csdn.net/su1573/article/details/91988523 1. 切换分支 1)在idea页面右下角点击分支名 2)在git 分支 ...

  5. sts配置maven及Git使用(解决冲突)

    主要讲解四点: 1.物流项目整体分析(背景.业务场景.开发环境.技术) (了解) 2.STS(Spring Tool Suite).java开发工具.maven集成配置.Hbuilder页面开发 (掌 ...

  6. git合并分支时如何解决冲突

    在项目开发过程,我们合并分支时经常会碰到冲突的问题,下面通过一个简单的例子演示下冲突是如何产生的以及如何去解决冲突. 1.冲突的产生 1.1.主干分支代码 在主干分支有两个文件 main.cpp #i ...

  7. git解决冲突 merge 不提示_Merge,Rebase,Cherry-Pick 了解一下

    代码合并在日常开发中是较为常见的场景,采用合适的合并方式,可以起到事半功倍的效果.对应在 Git 中合并的方式主要有三个,Merge,Rebase,Cherry-Pick. 开始部分会首先介绍一下这三 ...

  8. git冲突解决,使用git命令解决冲突【通用版】

    文章目录 一.准备 1-1.dev分支里面的README 1-2.master分支里面的README 1-3.说明 二.冲突 2-1.合并结果 2-2.解决冲突一(有master分支操作权限) 2-2 ...

  9. git 如何显示冲突文件夹_git命令行解决冲突文件步骤

    亲测有用,解决git冲突的好办法 方法一(推荐使用): git pull 出现冲突后丢弃本地冲突文件修改,采用远程文件覆盖本地文件 git checkout  [文件路径] 例:git checkou ...

最新文章

  1. Trends Genet | 王关红和Jackson Champer综述共生菌和基因驱动技术防控蚊媒疾病
  2. c语言是结构化 模块化,c语言是完全模块化和结构化的语言,怎么理解,什么是模块化和结构化...
  3. Docker ASP.NET Core (5):Docker Compose
  4. Linux:批量清空当前目录下的日志文件
  5. IT人经常围观精品站点推荐
  6. 李开复唱衰互联网手机:大部分公司会失败
  7. c#象棋程序_C ++程序确定象棋方块的颜色
  8. php软件开发--laravel框架
  9. Java 1.1.3 修改字符串、不可变字符串
  10. Python输入,输出,Python导入
  11. WPF使用中知识点总结一
  12. 如何清除百度云管家计算机图标,怎么样删除我的电脑里的百度云管家图标
  13. 日本人布置工作至少说5遍
  14. Syntax error, annotations are only available if source level is 1.5 or greater
  15. DDD案例(2):从领域分析到代码实现
  16. 渡课学习第17天:JavaScript一脸懵逼
  17. 删掉wps后台烂进程
  18. 大神尝试扒迅雷的代码,竟然被扒了个精光!
  19. [摘记]数值方法02——内插法和外推法
  20. 翻转课堂在语文教学中的案例

热门文章

  1. 【转载】变量的存储类别
  2. 4 angular 重构 项目_vuejs angularjs 框架的一些比较(vue项目重构四)
  3. 刚安装的python如何使用-Anaconda介绍、安装及使用教程
  4. 如何自学python数据分析-如何轻松学习Python数据分析?
  5. python3.7.2下载-Python编程神器 v3.7.2 最新免费版
  6. python学费多少-2020年10月徐州学python要多少学费
  7. python读取excel-蜗牛笔记-文章-Python读取Excel文件
  8. python开发是做什么的-python开发工程师是做什么的
  9. 学python需要什么文化基础-中国大学MOOC的APP2020Python编程基础答案
  10. python编程在哪里写-Python自带的IDE在哪里