小明发现在实际项目开发过程中,总会遇到各种各样的情况,比如一个大型的项目或版本迭代可能不是一次上线,可能会分好几次上线,这时候就会涉及创建多个分支,分别开发。

项目背景

产品经理:我们本次开发三个功能,列表页功能、详情页功能、系统消息功能,分两次上线,先上列表功能,再上详情页和系统消息。

小明:好的吧。

紧接着,小明就将本次需求分为2个分支,分别为A、B。

  • A:开发列表页功能
  • B:开发详情页功能、系统消息功能

原计划:产品经理说先上列表功能,那小明就先开发A分支,列表功能很快开发完成(厉害吧)。

计划有变:风云变幻,第二天小明按照计划开发B分支,开发到一半,产品经理突然说目前的系统消息功能(位于B分支)比较紧急,需要和列表功能(位于A分支)一起上线,当时小明就懵逼了。赶紧暂停开发详情页(位于B分支,虽然已经开发了一部分),转战系统消息功能的开发。当系统消息功能开发完成之后,就需要考虑将系统消息功能(位于B分支)和列表功能(位于A分支)放在一个分支上提测(开发一部分的详情页功能暂先不需要合并)的问题,这时候分支合并就要派上用场了。

分支合并

说起分支合并,大家第一个想到的命令肯定是git merge ,因为这是分支合并的常用命令。

使用git merge 合并分支会将两个分支的所有内容进行比较合并,因此我们如果想合并两个分支中的一部分,显然直接使用这个命令是行不通的。

So what happens next ? 嘿嘿,有两种方案可供我们选择:

强制合并

从其他分支merge指定文件到当前分支,git checkout是个合适的工具。

语法如下:

git checkout source_branch <path>...

我们使用git checkout 将B分支上的系统消息功能添加到A分支上

$ git branch
* A
B $ git checkout B message.html message.css message.js other.js $ git status
# On branch A
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: message.css
# new file: message.html
# new file: message.js
# modified: other.js
#

合并完成

但是……

注意:在使用git checkout某文件到当前分支时,会将当前分支的对应文件强行覆盖

因此,合并A分支上没有存在的文件没问题,但是如果合并A分支上原先就存在的文件(比如两个分支上都对other.js进行过修改),位于分支A上的文件other.js就会被checkout(分支B)过来的other.js覆盖,导致分支A上之前开发的列表功能付之东流,这样做肯定是优雅的!

那如何避免同一个文件不强制覆盖,有没有更好的解决方案呢(调一下味口)?我们一起来看一下第二种方案。

智能合并

思路:曲线救国,我们通过git merge 强大的分支合并功能来完成此次无缝合并。

  1. 首先使用git checkout根据A分支创建一个A_temp分支(避免影响A分支)
$ git checkout -b A_temp
Switched to a new branch 'A_temp'
  1. 然后将B分支合并到A_temp分支,此时两个都经修改过的文件会跑出冲突,我们只需解决冲突即可。
$ git merge B
Updating 1f73596..04627b5
Fast-forward
message.css | 0
message.html | 0
message.js | 0
other.js | 1 +
4 files changed, 1 insertion(+)
create mode 100644 message.css
create mode 100644 message.html
create mode 100644 message.js
  1. 再次切换到A分支,并使用git checkout 将A_temp分支上的系统消息功能相关文件或文件夹覆盖到A分支,此时可以大胆的覆盖!因为我们已经在第二步处理过冲突问题。

$ git checkout A
Switched to branch 'A' $ git checkout A_temp message.html message.css message.js other.js $ git status
# On branch A
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: message.css
# new file: message.html
# new file: message.js
# modified: other.js
#
  1. 最后,有强迫症的患者可以卸磨杀驴,把刚刚根据分支A创建的A_temp删除。

    $ git branch -d A_temp

OK,到此分支合并就完结了,现在我们就可以自信地召唤产品经理(我们公司产品兼测试)测试这两个功能。

扩展

另外给大家介绍一下git merge 使用的小技巧

举例:要把master分支合并到dev分支

git checkout dev // 切换到dev分支
git merge master --no-ff // 使用--no-ff

默认使用merge命令是ff,即 fast-forward,这种方式从Git 合并历史中是无法查看到是哪几个提交对象在一起实现了一个功能。

--no-ff 标记会在分支合并的时候,创建一个新的提交对象,可以避免丢失master分支的历史信息,并且把所有的功能叠加在一起提交上去。两者的区别如下图所示,大家可以自己体验一下两者的区别。

以上就是小明工作中使用git合并总结的经验,希望能帮助到大家,仅供参考,有错误请指出,谢谢!

欢迎关注微信公众号”程序员小明”,获取更多资源。

「小技巧」使用Git从其他分支merge个别文件的更多相关文章

  1. git小技巧--如何从其他分支merge个别文件或文件夹

    在实际工作中,一个大型的项目或版本迭代可能不是一次上线,可能会分好几次上线,这时候就会涉及创建多个分支,进行分别开发. 创建分支 功能分为2个分支,分别为A.B. A上面有个列表页功能 B上面有个详情 ...

  2. Xcode使用小技巧-filter查找功能和查看最近修改的文件

    今天偶然发现了关于Xcode的一个小技巧: 1.查看最近修改的文件 2.使用filter查找制定文件 没错,就是下面这个东西,很容易忽略的一个小工具,在Xcode左下角位置. 通过这个,我们能够在整个 ...

  3. 小技巧:快速清除项目中的svn相关文件!

    习惯使用svn作为源代码管理工具,安全可靠 但是这些.svn字样的文件夹及文件也会随着源代码一同被deploy到Tomcat中,除了看着碍眼,也会占用Tomcat的性能 每次都是在项目部署目录里,搜索 ...

  4. Python+Selenium进行UI自动化测试项目中,常用的小技巧2:读取配置文件(configparser,.ini文件)

    在自动化测试项目中,可能会碰到一些经常使用的但 很少变化的配置信息,下面就来介绍使用configparser来读取配置信息config.ini 读取的信息(config.ini)如下: [config ...

  5. [小技巧]ASP.NET Core中如何预压缩静态文件

    原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...

  6. python 小技巧之获取固定下面包含的某种类型文件的个数

    遇到这样一个问题.我想要统计某个文件夹下有多少个py文件怎么办. 用python能解决吗?答案,能. 解决办法,使用glob 代码如下: import glob path_file_number=gl ...

  7. 小技巧:tar命令打包目录时,排除文件和目录的命令

    今天不巧要用上,百度. tar zcvf fd.tar.gz pardir --exclude=pardir/file1 --exclude=pardir/dir1

  8. Git 对比两分支中同一文件

    语法 git diff <分支名> <分支名> -- 文件名 git diff branch1 branch2 -- path/file.txt 案例 git diff ori ...

  9. git 把其他分支上的文件拿来覆盖本地

    1:git checkout oldversion -- 文件地址 2: 一个分支从某个角度讲也像是一次commmit,也是有向无环图的一个点

随机推荐

  1. c# http Post Get 方法

    /// <summary> /// get方式访问webapi /// </summary> /// <param name="url">< ...

  2. 【POJ - 2387】Til the Cows Come Home(最短路径 Dijkstra算法)

    Til the Cows Come Home 大奶牛很热爱加班,他和朋友在凌晨一点吃完海底捞后又一个人回公司加班,为了多加班他希望可以找最短的距离回到公司.深圳市里有N个(2 <= N < ...

  3. 洛谷 P1357 花园

    题意简述 一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 题解思路 由于\(m<=5\)所以很显然状压 但由于\(n<=10^{15}\).可以考虑用矩阵加 ...

  4. 曹工杂谈:Java 类加载还会死锁?这是什么情况?

    一.前言 今天事不是很多,正好在Java交流群里,看到一个比较有意思的问题,于是花了点时间研究了一下,这里做个简单的分享. 先贴一份测试代码,大家可以先猜测一下,执行结果会是怎样的: import j ...

  5. tensorflow学习笔记——多线程输入数据处理框架

    之前我们学习使用TensorFlow对图像数据进行预处理的方法.虽然使用这些图像数据预处理的方法可以减少无关因素对图像识别模型效果的影响,但这些复杂的预处理过程也会减慢整个训练过程.为了避免图像预处理 ...

  6. 【转】[Python小记] 通俗的理解闭包 闭包能帮我们做什么?

    https://blog.csdn.net/sc_lilei/article/details/80464645

  7. 第一个基于ArcGIS的Android应用

     使用Android Studio创建第一个工程 打开Android Studio,新建工程.在Application name处填写项目名称,company domain是公司地址,将来作为包名,点 ...

  8. MyBatis 返回 Map 字段丢失问题

    问题现象 执行存储过程返回 Map 集合数据,发现有字段丢失情况,仔细研究发现丢失的字段值都为 NULL. 解决办法1: 在查询 SQL 语句中增加 NULL 判断函数 MSSQL: isnull(字 ...

  9. Android进阶之路(2)-详解MVP

    ### MVP简介 >MVP 全称:Model-View-Presenter :MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的[地方](https://baike.baidu.co ...

  10. ROS中local costmap的原点坐标系

    local costmap是一个依赖于其他坐标系存在的坐标系统,它并不维护自己的坐标系,而是在另一个坐标系中设定坐标原点,然后记下自己的宽与高.它使用数据结构nav_msgs/OccupancyGri ...