git分支的合并

article/2025/9/28 21:59:16

原文:  

http://gitbook.liuhui998.com/3_3.html
http://gitbook.liuhui998.com/5_3.html
一、如何分支的合并
在git中,可以使用 git merge  和 git rebase 两个命令来进行分支的合并。
git merge  和 git rebase 在大体上都差不多,下文主要以git merge来例来讲解分支的合并流程。
如果你想了解分支合并的更多内容,请阅读《 git merge简介 》,《 git rebase简介(基本篇) 》和《 git rebase简介(高级篇) 》。
git merge 命令示例:
git   merge  branchname
这个命令把分支" branchname" 合并到了当前分支里面。
如有冲突(冲突--同一个文件在远程分支和本地分支里按不同的方式被修改了);那么命令的执行输出就像下面一样
git  merge  next
 100% (4/4) done
Auto-merged file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
在有问题的文件上会有冲突标记,在你手动解决完冲突后就可以把此文件添 加到索引(index)中去,用git commit命令来提交,就像平时修改了一个文件 一样。
如果你用gitk来查看commit的结果,你会看到它有两个父分支: 一个指向当前的分支,另外一个指向刚才合并进来的分支
二、解决合并中的冲突
如果执行自动合并没有成功的话,git会在索引和工作树里设置一个特殊的状态, 提示你如何解决合并中出现的冲突。
有冲突(conflicts)的文件会保存在 索引 中,除非你解决了问题了并且 更新了索引 ,否则执行 git commit都会失 败:
git  commit
file.txt: needs merge
如果执行  git status  会显示这些文件没有合并(unmerged),这些有冲突的文件里面会添加像下面的冲突标识符:
<<<<<<< HEAD:file.txt
Hello world
=======
Goodbye
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
你所需要的做是就是编辑解决冲突,(接着把冲突标识符删掉),再执行下面的命令:
$ git add file.txt
$ git commit
注意:提交注释里已经有一些关于合并的信息了,通常是用这些默认信息,但是你可以添加一些你想要的注释。
上面这些就是你要做一个简单合并所要知道的,但是git提供更多的一些信息来 帮助解决冲突。
三、撒销一个合并
如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
git   reset  --hard   HEAD
或者你已经把合并后的代码提交,但还是想把它们撒销:
git  reset   --hard   ORIG_HEAD
但是刚才这条命令在某些情况会很危险,如果你把一个已经被另一个分支合并的分支给删了,那么 以后在合并相关的分支时会出错。
关于撤销的更多内容请参考《 git reset简介
四、快速向前合并
还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。
但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前"(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。
五、在合并过程中得到解决冲突的协助
git会把所有可以自动合并的修改加入到索引中去, 所以 git diff 只会显示有冲突的部分. 它使用了一种不常见的语法:
git   diff
diff --cc file.txt
index 802992c,2b60207..0000000
--- a/file.txt
+++ b/file.txt
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD:file.txt
 +Hello world
++=======
+ Goodbye
++>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
回忆一下, 在我们解决冲突之后, 得到的提交会有两个而不是一个父提交:  一个父提交是当前分支提交前的HEAD,; 另外一个父提交是被合并分支的HEAD, 被暂时存在MERGE_HEAD .
在合并过程中, 索引中保存着每个文件的三个版本. 三个"文件暂存(file stage)"中的每一个都代表了文件的不同版本:
$ git show : 1 :file.txt   # 两个分支共同祖先中的版本.
$ git show : 2 :file.txt   # HEAD中的版本.
$ git show : 3 :file.txt   # MERGE_HEAD中的版本.
当你使用git diff去显示冲突时, 它在 工作树(work tree) 暂存2(stage 2) 暂存3(stage 3) 之间执行三路diff操作, 只显示那些两方都有的块(换句话说, 当一个块的合并结果只从暂存2中得到时, 是不会被显示出来的; 对于暂存3来说也是一样).
上面的diff结果显示了file.txt在工作树, 暂存2和暂存3中的差异.  git不在每行前面加上单个'+'或者'-', 相反地, 它使用两栏去显示差异: 第一栏用于显示第一个父提交与工作目录文件拷贝的差异, 第二栏用于显示第二个父提交与工作文件拷贝的差异.  (参见git diff-files中的"COMBINED DIFF FORMAT"取得此格式详细信息.)
在用直观的方法解决冲突之后(但是在更新索引之前), diff输出会变成下面的样子:
git diff
diff --cc file.txt
index 802992c,2b60207..0000000
--- a/file.txt
+++ b/file.txt
@@@ -1,1 -1,1 +1,1 @@@
- Hello world
-Goodbye
++Goodbye world
上面的输出显示了解决冲突后的版本删除了第一个父版本提供的"Hello world"和第二个父版本提供的"Goodbye", 然后加入了两个父版本中都没有的"Goodbye world".
一些特别diff选项允许你对比工作目录和三个暂存中任何一个的差异:
$ git diff -1 file.txt       # 与暂存1进行比较
$ git diff --base file.txt           # 与上相同
$ git diff -2 file.txt       # 与暂存2进行比较
$ git diff --ours file.txt           # 与上相同
$ git diff -3 file.txt       # 与暂存3进行比较
$ git diff --theirs file.txt     # 与上相同.
还有,git log和gitk命令也为合并操作提供了特别的协助:
git log   --merge
gitk  --merge
这会显示所有那些只在HEAD或者只在MERGE_HEAD中存在的提交, 还有那些更新(touch)了未合并文件的提交.
你也可以使用git mergetool, 它允许你使用外部工具如emacs或kdiff3去合并文件.
每次你解决冲突之后, 应该更新索引:
git add  file.txt
完成索引更新之后, git-diff(缺省地)不再显示那个文件的差异, 所以那个文件的不同暂存版本会被"折叠"起来.
六、多路合并
你可以一次合并多个头, 只需简单地把它们作为git merge的参数列出. 例如,
$ git merge scott/master rick/master tom/master
相当于:
$ git merge scott/master
$ git merge rick/master
$ git merge tom/master
七、子树
有时会出现你想在自己项目中引入其他独立开发项目的内容的情况. 在没有路径冲突的前提下, 你只需要简单地从其他项目拉取内容即可.
如果有冲突的文件, 那么就会出现问题. 可能的例子包括Makefile和其他一些标准文件名. 你可以选择合并这些冲突的文件, 但是更多的情况是你不愿意把它们合并. 一个更好解决方案是把外部项目作为一个子目录进行合并. 这种情况不被递归合并策略所支持, 所以简单的拉取是无用的.
在这种情况下, 你需要的是子树合并策略.
这下面例子中, 我们设定你有一个仓库位于/path/to/B (如果你需要的话, 也可以是一个URL). 你想要合并那个仓库的master分支到你当前仓库的dir-B子目录下.
下面就是你所需要的命令序列:
$ git remote add -f Bproject /path/to/B (1)
$ git merge -s ours --no-commit Bproject/master (2)
$ git read-tree --prefix=dir-B/ -u Bproject/master (3)
$ git commit -m "Merge B project as our subdirectory" (4)
$ git pull -s subtree Bproject master (5)
子树合并的好处就是它并没有给你仓库的用户增加太多的管理负担. 它兼容于较老(版本号小于1.5.2)的客户端, 克隆完成之后马上可以得到代码.
然而, 如果你使用子模块(submodule), 你可以选择不传输这些子模块对象. 这可能在子树合并过程中造成问题.
译者注: submodule是Git的另一种将别的仓库嵌入到本地仓库方法.
另外, 若你需要修改内嵌外部项目的内容, 使用子模块方式可以更容易地提交你的修改.

更多干货,请关注我的微信公众号:红柚甜


http://chatgpt.dhexx.cn/article/e5YbTmP5.shtml

相关文章

Git提交本地代码至分支及合并分支到总分支

Git提交本地代码至分支 前言一、查看分支二、本地新建分支三、切换到新分支四、创建并切换分支五、将新分支推送到gitlab六、删除分支七、git 提交本地代码至新分支八、将分支代码合并到总分支 前言 git版本控制工具和svn差不多&#xff0c;可选择的远程库有github、gitlab、g…

git怎么合并两个分支

git怎么合并分支代码 1.git 命令 注意: 第一步你得把当前分支合到远程分支去才能有下面的操作 另外我是将develop分支代码合并到release分支去1.推完代码到远程仓库查看本地分支(如果推错分支代码那么请将分支切到刚刚推送上去代码的分支在来进行下面的操作) git branch2.切…

【剑指offer】【java】变态跳台阶

题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 1.这里计算的是跳法数 而不是跳的次数 2.用递归解决 代码 public class Solution {public int JumpFloorII(int target) {if (target…

接了个变态需求:生成 Excel + PDF 导出,用 Java 怎么实现?

一、序言 Excel、PDF的导出、导入是我们工作中经常遇到的一个问题&#xff0c;刚好今天公司业务遇到了这个问题&#xff0c;顺便记个笔记以防下次遇到相同的问题而束手无策。 公司有这么两个需求&#xff1a; 需求一、给了一个表单&#xff0c;让把查出来的数据组装到表单中…

Java面试题目和答案

Java面向对象有哪些特征&#xff0c;如何应用 ​ 面向对象编程是利用类和对象编程的一种思想。万物可归类&#xff0c;类是对于世界事物的高度抽象 &#xff0c;不同的事物之间有不同的关系 &#xff0c;一个类自身与外界的封装关系&#xff0c;一个父类和子类的继承关系&…

浅析Java多态

Java多态 今天来谈谈Java中的多态&#xff0c;作为面向对象的一大特性&#xff0c;它的重要性不必多说&#xff0c;相比其他两特性&#xff08;继承、封装&#xff09;从字面上看就有点不易读懂&#xff0c;多种态度还是有多变态&#xff1f; 官解 官方解释&#xff1a; 多态…

java连连看小游戏

目录 运行界面图 代码如下&#xff08;示例&#xff09;&#xff1a; 2.运行演示 这是一个用java编写的小游戏&#xff0c;连连看是一种消除类益智游戏&#xff0c;核心要求是在规定的时间内&#xff0c;消除游戏界面中选中的两张相同的图案&#xff0c;直至完全消除所有图案…

南阳ACM 题目811:变态最大值 Java版

变态最大值 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;1 描述 Yougth讲课的时候考察了一下求三个数最大值这个问题&#xff0c;没想到大家掌握的这么烂&#xff0c;幸好在他的帮助下大家算是解决了这个问题&#xff0c;但是问题又来了。…

线程池的好处

线程池的好处: 一.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。&#xff08;当线程run方法使用完毕后&#xff0c;下一个线程不用再次创建&#xff0c;直接利用上一个线程&#xff09; 二.提高响应速度。当任务到达时&#xff0c;任务可以不需要等到…

详解线程池的作用及Java中如何使用线程池

服务端应用程序&#xff08;如数据库和 Web 服务器&#xff09;需要处理来自客户端的高并发、耗时较短的请求任务&#xff0c;所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作。常规的方法是针对一个新的请求创建一个新线程&#xff0c;虽然这种方法似乎易…

线程池作用及Executors方法讲解

线程池的作用: 线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况&#xff0c;可以自动或手动设置线程数量&#xff0c;达到运行的最佳效果&#xff1b;少了浪费了系统资源&#xff0c;多了造成系统拥挤效率不高。用线程池控制线程数量&#xff0c;其他线程排…

Qt工作笔记-线程池作用之一:限制系统中执行线程的数量

一、线程池的作用&#xff1a; 线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况&#xff0c;可以自动或手动设置线程数量&#xff0c;达到运行的最佳效果&#xff1b;少了浪费了系统资源&#xff0c;多了造成系统拥挤效率不高。用线程池控制线程数量&#xff0c;…

Android:Android线程和线程池的作用

文章目录 前言一、线程池概念好处线程池的创建参数含义工作机制RejectedExecutionHandler&#xff08;饱和策略&#xff09; 二、Android线程形态1.AsyncTask特点作用缺点生命周期注意事项 具体使用源码分析小结 2.HandlerThread特点作用具体使用 3.IntentService源码分析 总结…

线程池作用和参数原理

线程池的作用 减少资源的开销 减少了每次创建线程、销毁线程的开销。 提高响应速度每次请求到来时&#xff0c;由于线程的创建已经完成&#xff0c;故可以直接执行任务&#xff0c;因此提高了响应速度。提高线程的可管理性 线程是一种稀缺资源&#xff0c;若不加以限制&#x…

线程池作用、用法以及原理

线程池 作用用法建议设定大小快捷构造线程池submit与executeshutdown与shutdownNowFuture与FutureTast代码 状态底层原理继承关系主要参数工作原理饱和策略连接复用 作用 1&#xff0c;降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗 2&#xff0c;提高…

线程池-线程池的好处

1.线程池的好处。 线程使应用能够更加充分合理的协调利用cpu 、内存、网络、i/o等系统资源。 线程的创建需要开辟虚拟机栈&#xff0c;本地方法栈、程序计数器等线程私有的内存空间。 在线程的销毁时需要回收这些系统资源。频繁的创建和销毁线程会浪费大量的系统资源&#xff0…

什么是线程池,线程池的作用

线程池&#xff0c;--其实就是一个 容纳多个线程的容器 &#xff0c;其中的线程可以反复使用&#xff0c;省去了频繁创建线程对象的操作 &#xff0c;--无需反复创建线程而消耗过多资源。 创建销毁线程是一个非常消耗性能的。 我们详细的解释一下为什么要使用线程池&#xff1f…

华为防火墙实战配置教程,太全了

防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进出。防火墙是系统的第一道防线&#xff0c;其作用是防止非法用户的进入。 本期我们一起来总结下防火墙的配置&#xff0c;非常全面&#xff0c;以华为为例。 防火墙的配置…

防火墙配置(命令)

拓扑图&#xff1a; 目的&#xff1a;PC1和PC2相互ping通。 配置命令&#xff1a; FW1: //添加端口IP [SRG-GigabitEthernet0/0/0]interface GigabitEthernet0/0/1 [SRG-GigabitEthernet0/0/1]ip add 192.168.1.1 24 [SRG]inter g0/0/2 [SRG-GigabitEthernet0/0/2]ip add 10.…

防火墙基础配置(二)

拓补图&#xff1a; 方案一&#xff08;子接口的形式&#xff09; 实验目的&#xff1a;解决防火墙上的接口不足以为其他区域服务的问题&#xff0c;比方说防火墙上只有两个接口&#xff0c;但是有三个区域&#xff0c;那这个实验的目的为了解决防火墙上的接口不足以为多区域提…