git合并分支的理解和应用

Git的合并分支包括合并远程分支和合并本地分支,其实本意是一样的。只不过拉远端分支的时候多了一步git fetch,就是把所有分支的代码从云拉到本地缓存,但是不做合并。关键是合并,说到合并的时候就要说到这最纠结的两兄弟了。


git merge

git merge全称其实是git merge --ff, ff 就是fast forward。
在当前分支没有任何提交的情况下,它的指针着被合入分支的提交线一路下去可以走到被合入分支上,就像是指针快进到另一个分支上,它就像是快进一样,它不会产生任何merge commit,没办法查到合入的记录。(下右图所示)
图1

如果在上述情况下,要知道合入的细节,那就要用git merge --no-off。(如上左图所示)
它的作用就是把被合入分支的详细提交情况都显示出来,然后在最后产生一个merge的新commit。我们就可以清楚的看见这次的merge是怎么来的。

总结下,ff是head最终指向被合入分支的最后一次提交,而no-ff是指向他们的合入。这种情况下,多说一句,如果要reset,这两种方式的reset也是不同,ff方式的reset因为没有快进,所以是回到了被合入分支的commit点(并不是本分支的),而–no-ff才是真正回到了当前分支的上一个提交点。

以上这种情况有前提的,前提是当前分支无任何提交。下面这种情况是我们绝大多数的merge情况。
在这里插入图片描述
在两个分支的最近公共点都有新的提交,这样git merge会将两个分支的最后节点做合并产生新的节点,并且生成一个merge的commit记录。它是严格按时间线记录了分支的提交记录,方便查找。但是缺点是在提交线上会分叉,很乱,而且不能直观的看到你的分支和目标分支的差距。


git rebase

参考了很多的博客,rebase用变基是比较准确的。但是要遵守rebase黄金法则,no one shall rebase a shared branch.
图3

rebase是先删除当前分支的提交,然后把被合入分支的所有提交都复制到本分支上,再顺着提交线把刚才删除的本分支提交重新生成一下基于这个之上,所以称为“变基”。rebase的本意是让当前的开发分支保持在一个基准上,这样在提交线上可以看到我们和主分支的head在哪个位置,而且可以把我们领先未合入的提交显示在最上面,整个过程不会产生merge的记录,所以自然也不会按时间线显示提交记录。

另外rebase可以压缩commit请求,在提pr时候,可以git rebase head~压缩commit。


对于这两个命令我也难以清楚的分清界限,但凡是存在的肯定是合理的。我认为还是取决于项目的使用和管理,分享下我平时的使用。

  1. 从远端同步到master使用git pull --no-ff,清晰的记录每个人的提交和合入记录。
  2. 在feature分支合并是用git rebase master,让自己的提交线变得简单。但如果是共同分支开发,使用merge。
### 合并分支时处理文件夹的方法 当在 Git合并分支时,如果两个分支都修改了相同的文件夹结构,则可能会遇到冲突。解决这些冲突的过程与其他类型的文件级冲突相似。 #### 解决文件夹级别的冲突 假设 `feature` 分支 `main` 分支都有对相同路径下不同文件进行了改动的情况: - 如果只是简单地向现有目录添加新文件,在大多数情况下不会出现问题;Git 能够很好地处理这种情况。 - 当涉及到重命名、移动或删除整个子树(即多个嵌套层次下的文件集合),则可能需要手动干预来解析差异[^1]。 对于更复杂的情形,比如双方都在同一个位置创建了一个同名的新文件夹,或是其中一个分支移除了某个重要目录而另一个保留着它,那么就需要开发者仔细审查变更内容,并决定最终版本应该是什么样的。 ```bash $ git checkout main Switched to branch 'main' Your branch is up-to-date with 'origin/main'. $ git merge feature Auto-merging src/utils/ CONFLICT (rename/delete): src/utils/ deleted in HEAD and renamed in feature. Version feature of src/utils/ left in tree. Automatic merge failed; fix conflicts and then commit the result. # 查看状态以理解发生了什么 $ git status On branch main You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add <file>..." to mark resolution) both modified: src/ # 进入受影响的文件夹查看具体情况 $ cd src/utils/ ... ``` 一旦解决了所有的冲突之后,记得要测试应用程序的功能是否正常工作,确保没有因为这次合并不慎引入新的 bug 或者破坏现有的逻辑。 最后提交合并后的成果: ```bash $ git add . $ git commit -m "Merge branch 'feature' into main" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值