Git的代码合入流程详解

目录
  • 总述
  • Rebase解决冲突
    • 适用情况
    • 操作方式
    • Squash解决冲突
    • 适用情况
    • 操作方式
    • Merge执行合入

总述

代码合入流程用于减轻代码合入复杂度、简化主分支历史(具有线性的历史)、保证合入代码对主分支的HEAD有效
代码合入分为两步

  • 解决冲突:将需要合入的分支变基到目标分支之上。保证合入代码对目标分支的HEAD有效。此时会解决所有代码冲突。
  • 执行合入:向目标分支提交merge请求,执行合入CI后完成合入。

其中第一步“解决冲突”的方法分为两种种情况:

  • Squash。如 feature分支 向 dev分支 合入;存在冲突的合入。此时会出现 合入过程冲突多、合入结果复杂(commit多)、合入message不清晰(未能完整描述改动内容)的问题。此时不需要保存历史commit,仅需要干净的将feature合入master。
  • Rebase。如 hotfix分支 向 dev分支 合入;feature分支 向 feature分支 合入。此时冲突少、合入结果简单、需要保存历史commit。

其中第二步“执行合入”应采用 merge no-fast-forward 的方式。确保合入信息可追溯和易回退。

Rebase解决冲突

适用情况

  • hotfix → develop
  • feature → feature
  • develop → master

其中commit数量少(1~2个),开发周期短(1day)。

操作方式

其中dev分支向master分支合入。通过执行 git log --all --graph --decorate 可看到如下图。两个分支已经分开,如果通过在master分支git merge合入且存在冲突,那么会触发三方合并在master生成merge commit污染主分支提交历史,这是我们不想看到的。

此时我们执行以下流程解决问题

git checkout dev  && git pull dev
git rebase master // 保证master与remote仓库一致
// 若发生冲突执行 git mergetool  解决冲突
git rebase --continue

此时可以看到master分支和dev分支干净得合在一起。经过单元测试并确认我们的改动没有bug后,我们可以push并开启mr。

Squash解决冲突

适用情况

  • feature → develop
  • gitlab → gerrit (此处为泊车自动同步代码中用到)

其中commit数量多(> 2个),开发周期长(> 1day),冲突量大(每个commit可能都有冲突)。

操作方式

此处仍然是将dev合入master。其中dev分支提交历史混乱(有tmp提交),commit号多且每个commit都与master有冲突。此时在master分支执行 git merge dev 会触发三方合并,且保留不必要的commit历史。不必要的提交信息如图

操作的初始状态如图

此处我们执行如下操作,在master分支解决冲突并压缩提交。随后checkout一个提交分支并开启mr。这有利于简化主分支提交。但需要小心,dev分支不能再使用,需要重新从master分支拉取新的dev。

git checkout master // 保证master与remote一致
git merge --squash dev
// 解决冲突  git mergetools  、  git commit -m <总结此次提交的所有内容>
git checkout -b <mr-branch>
git push xxxx

mater结果如图

Merge执行合入

这里强调使用merge no fast forward的目的是保留合入信息。

git checkout master
git merge --no-ff dev

以上就是Git的代码合入流程详解的详细内容,更多关于Git代码合入流程的资料请关注我们其它相关文章!

时间: 2022-11-12

nodejs制作一个文档同步工具自动同步到gitee中的实现代码

初衷 之所以要做这个工具是为了让自己可以随时用电脑时能记录日常工作或生活.一般只需要简单记录下就行了.这样我在家里的和公司里的记录都能同步看到. 这样后期整理的时候看到几个关键词就能想起来具体的事情,有的也可以为日后整理成文章做一个草稿,这样写文章才能有头有尾,否则想到什么说什么是非常不利于写出文章的. 一开始我使用手动同步的方式,但是发现很麻烦,之后就直接用了个批处理文件来一次性同步. git pull git add . git commit -m '同步' git push git sta

使用git命令上传代码

利用git将本地代码提交到远程服务器一般分为如下5个步骤: 一.查看当前文件的状态 使用git status命令可以查看有那些文件进行了修改,一般有下面几个状态: 1.Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged. 2.Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 3.deleted: 文件已删除,本地删除,服务器上还没有删除. 示例如下: 打开git bash客户端,然后输入g

VS2022&nbsp;Git提交代码的实现

目录 第一种方法 第二种方法 第三种方法 第一种方法 在fork和pull request后,克隆对方的源代码到一个新文件夹,将所有项目文件复制到用VS2022创建的新项目工程中(里面也包含了git文件夹,这个最重要),打开这个项目工程后,可在右侧看到如下图的工具栏. 这时候就可以按照需求修改代码,通过图形界面来提交,这里面的操作就可以自己摸索. 第二种方法 完全通过类似于Git Bash的linux命令操作. 第三种方法 在一个新项目中,直接创建一个Git库. 右侧也同样会出现Git工具栏.

关于IDEA中Git暂存代码的使用

目录 一 问题引入 二 解决方法 三 总结 一 问题引入 ​ 在日常工作中, 通常都按照迭代功能划分分支开发, 即一个迭代一个分支. 正常迭代开发-测试-上线没有问题. 可是突然上个分支有一个很紧急的问题bug,需要修改优化, 此时都是在新分支上开发, 随意进行分支切换, 很容易导致代码混乱,不利于代码管理, 那么有没有一个办法可以暂存当前代码状态呢? 类似小时候玩游戏, 玩到一半想存档, 玩其他的或看电视, 下次再继续玩,还是当前状态. 二 解决方法 通过IDEA来完成操作 在新分支中, 点击

使用git命令将本地代码上传到GitHub

一.创建githubrepository(仓库) 1.登录GitHub 创建GitHub仓库,首先需要登录GitHub,GitHub网址:https://github.com.如果没有GitHub账号,需要先注册GitHub账号,这里不在演示如何注册GitHub账号,直接登录GitHub. 2.创建repository(仓库) 创建repository仓库有两种方式. 2.1.使用右上角的向下倒三角进行创建,如下图所示: 2.2.使用左边的New repository按钮创建,如下图所示: 3.

解决Git Revert 再次合代码无效问题

目录 背景 Demo复现该问题 用Squash方式解决该问题 小结 背景 将开发分支dev合并进主分支main以后,如果发现bug需要回滚代码时,我们常使用git revert完成操作,但是当我们将dev上的bug修复之后想再把它合进main却会发现,dev上的功能代码合不进去了,原因是这些功能代码的commit已经在main分支上了(虽然被revert了,但仍在),所以git会拒绝合进重复的commit. 本人最近就遇到了这种问题场景,查阅网上资料推荐的做法一般是把main之前的revert再

IDEA中解决 git pull 冲突的方法

0.事先准备. 1)把远程仓库的README.md内容改写为bbb(原先为aaa). 2)本地仓库的README.md内容改写为ccc(原先也为aaa). 以此来模仿代码冲突. 1.先commit 再pull pull的时候会提示有冲突,需要你进行手动merge Accept Yours 就是直接选取本地的代码,覆盖掉远程仓库的 Accept Theirs 是直接选取远程仓库的,覆盖掉自己本地的 我们选择Merge,自己手动行进选择.修改. 这里左边部分是你本地仓库的代码,右边部分是远程仓库的代

git rebase -i合并多次提交的实现

简介 在日常开发中,代码变更比较频繁,有时候想让前几次提交的合并为一次提交,这里可以使用git rebase -i 命令来完成,当然,git rebase命令不仅仅用于合并提交,它还有许多用处,比如可以使用git rebase onto将某一段commit粘贴到另一个分支上等等,这里主要介绍合并提交. 命令介绍 rebase为变基 git rebase -i 命令可以压缩合并多次提交 格式:git rebase -i [startpoint] [endpoint] 其中-i的意思是–intera

git clone下来的代码如何放在指定路径

今天从github上clone了代码,最后出来形如: 但是话说我的东西下载到哪里去了呢????摸不着头脑,然后百度之,发现一般会放在命令行对应的路径下,也就是 win + R > cmd 查看命令行地址: 然后去此路径下寻找之,果然在这里. 那么,如何才能clone到自己指定的路径下呢?百度之得如下说法: git clone https://github.com/jquery/jquery.git e:/myJQuery/ 以上命令行的结尾,指定你想要的目录. git clone克隆或下载一个仓

解决Android popupWindow设置背景透明度无效的问题

有的时候当我们使用popwindow时将当前的activity当做View传给其他fragment使用时会导致我们设置背景变暗效果失效,导致这个原因的问题是因为我们传view后当弹出popupwindw的时候已经不再当前的activity了,所以会显示无效 因此在设置的时候我们这样处理: public void backgroundAlpha(float bgAlpha) { //MApp.getInstance().getMainActivity()就是你想要点击时要显示的主activity

彻底解决IDEA中SpringBoot热部署无效的问题(推荐)

开启SpringBoot热部署,首先得在pom.xml中引入依赖 <!--SpringBoot 热部署依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> 但

解决git 提交后中文字符会乱码的问题

最近发生那了一件怪事,当然菜鸡经常碰见怪事 本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitlab上发现.properties的所有中文字符都变成了 \xxxx 的ascii的编码. 然后我在idea的show history中查看和上一版本的差异,发现这些中文字符没问题??!! 然后就是一顿的百度,bing 最后发现设置里面 transparent native-to-ascii conversion是选中的 然后网上有人这样解释

git revert和git reset的区别详解

git revert和git reset的区别 git revert 是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留 git reset 是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区 具体一个例子,假设有三个commit, git st: commit3: add test3.c commit2: add test2.c commit1: add test1.c 当执行git revert HEAD~1时, commit2被撤销

快速解决eclipse中注释的代码依然会执行的问题

问题: eclipse中注释的代码在debug的时候居然还能执行.那一刻内心是崩溃的.. 解决方案: 项目重编译显示都正常,并没有报错,然后发现项目编译后,WEB-INF/lib/classes中的class文件并没有更新,这就好理解了,项目其实没有编译成功.然后又发现项目图标上有个感叹号.是因为在 项目右键→Properties→Libraries 中有部分jar不正确,导致项目不能编译自动生成classes. 加载一下jar项目就正常了. over.. 以上这篇快速解决eclipse中注释的

通过jstack分析解决进程死锁问题实例代码

刚才用jstack解决了一个进程死锁的问题--其实早就解决了,也知道原因,只是一直没找到死锁的位置,不太甘心而已. 流程大致如下: (0)环境要求,JDK1.6及以上 (1)先找到进程的PID,Windows下,打开进程管理器,按照名字排序,可以找到叫做javaw.exe的进程(java虚拟机进程一律叫做javaw.exe),要找出哪个是你的进程,记住当前进程列表,然后重启你的进程,PID刷新过的那个即是你的进程. (2)在CMD下运行:jstack pid,jstack会在console上打出

解决vue.js this.$router.push无效的问题

如下所示: login() { if(this.email.length > 0 && this.password.length >0) { this.$http.post('/api/login', { user: this.email, password: this.password }) .then(res => { let userPwd = res.data if(this.password == userPwd) { this.$router.push(&qu