git-merge学习笔记

git-merge简介

git-merge命令是用于从指定的commit(s)合并到当前分支的操作。

注:这里的指定commit(s)是指从这些历史commit节点开始,一直到当前分开的时候。

git-merge命令有以下两种用途:

  1. 用于git-pull中,来整合另一代码仓库中的变化(即:git pull = git fetch + git merge)
  2. 用于从一个分支到另一个分支的合并

假设下面的历史节点存在,并且当前所在的分支为“master”:
before merge

那么git merge topic命令将会把在master分支上二者共同的节点(E节点)之后分离的节点(即topic分支的A B C节点)重现在master分支上,直到topic分支当前的commit节点(C节点),并位于master分支的顶部。并且沿着master分支和topic分支创建一个记录合并结果的新节点,该节点带有用户描述合并变化的信息。

即下图中的H节点,C节点和G节点都是H节点的父节点。

after merge

常见用法

一、开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支

git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master

二、当master代码改动了,需要更新开发分支(dev)上的代码

git checkout master 
git pull 
git checkout dev
git merge master 
git push -u origin dev

处理冲突

如何判定冲突

git merge的冲突判定机制如下:
先寻找两个commit的公共祖先,比较同一个文件分别在ours和theirs下对于公共祖先的差异,然后合并这两组差异。
如果双方同时修改了一处地方且修改内容不同,就判定为合并冲突,依次输出双方修改的内容。

Git Merge 的过程及冲突处理演示

master分支上有一个1.txt文件,进行修改后提交

$ cat 1.txt
1
11
12

$ echo 13 >> 1.txt

$ git commit -a -m "modified 3.txt,add 13 in the end"
[master 4850577] modified 3.txt,add 13 in the end
 1 file changed, 1 insertion(+)

test1分支是基于未修改的1.txt创建的,切换到test1分支上,修改1.txt并提交

$ git checkout test1

$ cat 1.txt
1
11
12

$ echo 133 >> 1.txt

$ git commit -a -m "add 133 in the end"
[test1 2856268] add 133 in the end
 1 file changed, 1 insertion(+)

可见,两次对1.txt的修改是不同的。在test1上的merge过程如下:

$ git merge master
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.

$ git status
On branch test1
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   1.txt

no changes added to commit (use "git add" and/or "git commit -a")

$ cat 1.txt
1
11
12
<<<<<<< HEAD
133
=======
13
>>>>>>> master

如上所示,系统提示了1.txt的冲突。

开始修改。

vi 1.txt #删除冲突字符及修正冲突文本

$ cat 1.txt
1
11
12
133
13

git commit -a -m “modified 1.txt,add 133 & 13 in the end”

冲突解决结束。push即可。

个人体会

git merge是按照修改顺序来合并的,而不是内容覆盖

比如,mynotes分支是基于master分支checkout的。
修改前,test20200711_2.txt内容为:
update repo from Github.

  1. 切换到mynotes分支,修改test20200711_2.txt内容为:
    update repo from Gitee.

    git commit后, git merge master, 并不会将master的老内容覆盖到mynotes上。
    merge master
    此时,mynotes上test20200711_2.txt内容为:
    update repo from Gitee.

  2. 切换到master分支, git merge mynotes会将mynotes修改的内容合并到master上。
    merge mynotes
    此时,master上test20200711_2.txt内容为:
    update repo from Gitee.

参考资料

  1. git-merge完全解析
    https://www.jianshu.com/p/58a166f24c81
  2. git merge最简洁用法
    https://blog.youkuaiyun.com/zl1zl2zl3/article/details/94019526
  3. git merge是怎样判定冲突的?
    https://segmentfault.com/a/1190000003966242#articleHeader2
  4. Git Merge 的过程及冲突处理演示
    https://www.cnblogs.com/wangbaobao/p/7603257.html
<think>好的,用户想学习Git分支管理的相关知识,包括教程和最佳实践。首先,我需要整理Git分支管理的基础概念,然后根据提供的引用内容,总结常见的分支策略和最佳实践。用户可能对不同的分支模型(如Git Flow、GitHub Flow等)感兴趣,需要逐一解释它们的特点和适用场景。同时,结合引用中的信息,比如引用1提到的五种分支策略,引用3和4中的具体操作步骤,以及引用5的最佳实践,我需要将这些内容结构化,以清晰易懂的方式呈现。还要注意用户可能的需求,比如如何选择合适的分支策略,常用命令有哪些,以及如何解决实际开发中的问题(如修复bug时的分支管理)。最后,生成相关问题帮助用户进一步学习,确保回答覆盖了用户可能关心的各个方面。</think>### Git分支管理学习教程与最佳实践 #### 一、Git分支基础概念 1. **分支的本质** Git分支本质是一个指向提交对象的**可变指针**,与SVN等工具不同,Git的分支创建和切换成本极低[^4]。 2. **默认分支** `master`(或`main`)分支是默认创建的主分支,但无特殊性质,与其他分支完全平等[^2]。 #### 二、常见分支管理策略 1. **Git Flow** - 特点:严格定义开发、发布、热修复流程 - 分支结构: ``` master(生产环境) ├── develop(集成分支) │ ├── feature/*(功能开发分支) │ └── release/*(预发布分支) └── hotfix/*(紧急修复分支) ``` - 适用:需要长期维护的复杂项目[^1] 2. **GitHub Flow** - 特点:简化流程,强调持续部署 - 规则: - 所有开发基于`master`分支 - 通过Pull Request进行代码审查 - 合并后立即部署 - 适用:SaaS类快速迭代项目[^1] 3. **Trunk-Based Development** - 特点:所有开发者直接向`master`提交代码 - 关键实践: - 短生命周期分支(1-2天) - 特性开关控制功能发布 - 适用:高成熟度团队与CI/CD深度集成项目 #### 三、最佳实践指南 1. **分支命名规范** - 功能分支:`feature/login-page` - 修复分支:`hotfix/payment-bug` - 发布分支:`release/v2.1.0` 2. **工作区管理技巧** ```bash # 临时保存未完成的工作(引用3示例) git stash git checkout master git checkout -b hotfix/xxx # 修复完成后恢复工作区 git stash pop ``` 3. **二进制文件处理** - 使用`git diff --numstat`检测二进制文件变更[^5] 4. **第三方库管理** - 建议通过子模块(submodule)或包管理器独立管理[^5] #### 四、常用命令速查 | 操作场景 | 命令示例 | |-------------------------|-----------------------------------| | 创建分支 | `git branch feature/new-api` | | 切换分支 | `git checkout develop` | | 合并分支(无冲突) | `git merge feature/login` | | 删除已合并分支 | `git branch -d feature/old` | | 查看分支图 | `git log --graph --oneline --all`| #### 五、策略选择建议 1. **初创团队** → GitHub Flow 2. **传统软件** → Git Flow 3. **微服务架构** → Trunk-Based Development 4. **紧急修复** → 单独创建`hotfix`分支[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值