git使用-去除merge branch ’master‘提交

2023-10-31

git去除merge branch ’master‘提交


问题现象

在项目开发中,经常会有这样的情况发生,
更新上游项目代码时操作:

[Tom@localhost dev-gw-ac]$ git remote add upstream http://Tom@200.200.202.150/dev-gw-ac/dev-gw-ac.git
[Tom@localhost dev-gw-ac]$ git fetch upstream
[Tom@localhost dev-gw-ac]$ git merge upstream/master
[Tom@localhost dev-gw-ac]$ git push origin master

以上操作中,fetch+merge可以用pull来代替:

[Tom@localhost dev-gw-ac]$ git pull upstream master

有时候你会发现,在git merge时产生了一个新的提交 Merge remote-tracking branch ‘dev-gw-ac/master’:

commit a4e26816423de3513b40107f37a049bdf145aee0
Merge: f8da63e 05315ab
Author: Tom <Tom@utt.com.cn>
Date:   Tue Dec 11 12:15:48 2018 +0800

    Merge remote-tracking branch 'upstream/master'

commit f8da63e9e9f33ff0a99460b3ae051db3cb0ef73d
Author: Tom <Tom@utt.com.cn>
Date:   Tue Dec 11 11:24:10 2018 +0800

    优化nandflash读写

这个提交是一个冗余的提交,在我们向上游项目提交合并请求时,他会保存在提交历史里面,并且对代码审查造成一些干扰。


问题原因

那么,为什么会出现这种现象呢?其实是与 Git 的工作原理有关,对 Git 比较了解的人应该会知道,无论是 pull、push 亦或是 merge 操作,其实背后都是有很多的不同的模式的。

在进行 pull 操作的同时,其实就是 fetch+merge 的一个过程。我们从 remote 分支中拉取新的更新,然后再合并到本地分支中去。

如果 remote 分支超前于本地分支,并且本地分支没有任何 commit 的,直接从 remote 进行 pull 操作,默认会采用 fast-forward 模式,这种模式下,并不会产生合并节点,也就是说不会产生多余的那条 log 信息

如果本地先 commit 后再去 pull,那么此时,remote 分支和本地会分支会出现分叉,这个时候使用 pull 操作拉取更新时,就会进行分支合并,产生合并节点和 log 信息。这两种状态分别如下图所示:

fast-forword

A-B-D(origin/master)
     \
      C'(master) 

merge

A-B-C-E(master)
   \ /
    D(origin/master)

网搜资料:https://www.cnblogs.com/Sinte-Beuve/p/9195018.html


解决方法

怎样取消掉恼人的Merge branch提交,使提交历史变为简单的?

第一种方法:

在我们准备对本地做任何修改之前,我们先更新上游项目代码,这时merge合并时默认会采用 fast-forward 模式,由于本地没有变化,不会产生新的Merge remote-tracking branch提交。

第二种方法:

如果你已经对本地做出修改,并提交(未提交时更新会报错)到本地,更新时不要执行merge命令,使用rebase命令即可,如下:

[Tom@localhost dev-gw-ac]$ git fetch upstream
Password for 'http://Tom@200.200.202.150': 
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 31 (delta 16), reused 0 (delta 0)
Unpacking objects: 100% (31/31), done.
From http://200.200.202.150/dev-gw-ac/dev-gw-ac
 + 5562878...3abc369 master     -> upstream/master  (forced update)

[Tom@localhost dev-gw-ac]$ git  rebase upstream/master
First, rewinding head to replay your work on top of it...
Applying: nand 读函数有偏移量时,读取page大小,没有与page对齐

这里,rebase命令没有直接显示哪些文件做了修改,通过log命令可以看到更新后没有产生新的冗余提交。

不使用fetch+merge的话,也可以直接使用

git pull --rebase upstream master

如果拉取不产生冲突,会直接 rebase,不会产生分支合并操作,如果有冲突则需要手动 fix 后,自行合并。


rebase 注意事项

另外,请注意:如果需要使用rebase命令,请大家在阅读过此命令的注意事项后再使用,否则错误使用会给团队造成很大困扰。

关于什么时候使用 rebase,什么时候使用 merge,开发者总结了几条规则:

  1. 从 remote 分支拉取更新到本地时,使用 rebase。
  2. 当完成 bug 修复或新功能时,本地使用 merge 将子分支合并到主分支。
  3. 没有人应该 rebase 一根共享的分支,千万不要通过rebase来修改已经合并到上游项目的提交记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git使用-去除merge branch ’master‘提交 的相关文章

  • Git:由于看似随机的合并,更改不断丢失

    我有一种感觉 这将是一个显而易见的答案 但我似乎无法解决 似乎发生的情况是 我向服务器提交 推送了一些更改 并且我的副本上的一切都显示正常 然后 另一位开发人员从同一分支的服务器中拉取 据我所知 据称看到了我的更改 进行一些修改 将它们提交
  • Visual Studio 2013删除已删除的git分支

    我遇到这个问题 在 VS2013 中 当我从源创建一个新分支时 源分支的下拉列表列出了曾经创建的所有分支 这包括长期从本地存储库和远程 源存储库中删除的分支 如何删除已删除的分支 Visual Studio 将它们保存在本地缓存中 您可以从
  • 子 git 存储库作为主存储库的子集

    我正在寻找一种方法来设置 git 存储库 其中包括来自较大存储库的文件子集 并从该主存储库继承历史记录 我的主要动机是能够通过 GitHub 共享代码子集 我目前通过单个 git 存储库管理我的研究相关 主要是 Matlab 代码 代码本身
  • 忽略提交之间 git-diff 的*所有*空白更改

    我正在检查代码库并修复空白奇怪之处并通常纠正缩进等事情 并且我想确保我没有无意中进行任何其他更改 所以我正在做git diff w显示所有已更改文件中的差异 同时忽略空白差异 问题是这实际上并没有忽略all空白差异 至少是什么I认为仅仅是空
  • Git - 包含来自其他存储库的文件

    对于 Git 我想包含一些常见的 JS CSS 库和 或实用方法 即来自另一个存储库的特定文件 在我的项目中 我希望它们始终是最新的 我真的不想要整个远程存储库 如果我可以处理远程文件的 本地副本 并将更改推送回来 那就太好了 一个有点类似
  • 如何在 git 中删除 subversion 远程?

    我有一个最初使用 git svn 创建的 git 存储库 现在我有一个推送到的 git 服务器 但 svn 存储库已丢失 我可以删除 svn 远程吗 如何 您可以编辑 git config文件并删除与要删除的遥控器关联的部分 您要删除的行可
  • 如何为新的 eclipse (neon) java 项目初始化 git

    我安装了 eclipse Neon 的新副本 并在一个新的闪亮工作区中创建了一个新的 gradle java 项目 将 git 添加到聚会中的最佳实践是什么 我读到在项目目录中初始化 git 是真是个坏主意 https stackoverf
  • Git 子模块在 Windows 上更新缓慢

    Git 子模块在 Windows 上似乎非常慢 为了测试性能 我创建了 3 个裸存储库并向它们提交了 3 条独立消息 未存储文件 然后 我将每个裸存储库作为子模块添加到新的 git 存储库中 并执行子模块更新 花费了 5 秒多的时间 当使用
  • Sourcetree 2.1.2.5 - 显示“未提交的更改”,但没有任何待处理的内容

    我有一个以前没有遇到过的问题 即使我没有什么可提交的 并尝试将我的分支重置为 Sourcetree 显示的最新提交Uncommitted changes 根据 Atlassian 论坛的说法 通常有两个原因 您的工作目录中有很多很多未暂存的
  • Git ref master 现在为空,如何恢复?

    我不完全确定发生了什么 但由于某种原因 我的 git 存储库的主引用文件现在是空的 我们在 Dropbox 上托管存储库 所以也许与此有关 但现在我无法从中提取 它是这么说的 Your configuration specifies to
  • 从 git 中删除历史记录 - git 命令失败

    我正在尝试从 Git 历史记录中清除项目 bin 目录 我已经将 bin 添加到 gitignore 并运行 git rm cached r bin成功地 现在我尝试使用 GitHub 帮助页面中推荐的命令来清除历史记录 git filte
  • 在两个单独的分支或存储库中管理项目后端和前端?

    我启动了一个移动应用程序项目 该项目将具有服务器端和应用程序本身 所以 在master分支我创建了2个项目myapp server and myapp然后我创建了另外 2 个分支backend and frontend我只想将与它们相对应的
  • 如何重命名 GitHub 网站上的目录/文件夹?

    我在 GitHub 网站上找到了一种方法rename https github com blog 1436 moving and renaming files on github一个文件并成功完成 我也找到了一种方法rename https
  • Git - 推送到远程存储库中的远程跟踪分支

    当简单地做git push到远程存储库 其master分支得到更新 对于非裸存储库来说 这是不希望出现的情况 最近的 Git 版本显示的警告消息清楚地表明了这一点 我希望能够推送到远程存储库 并拥有其之一远程追踪分支进行更新 稍后 当我登录
  • Git 命令显示我对给定远程的权限

    同事可以从远程存储库获取数据 但不能推送到远程存储库 我怀疑他对遥控器只有读权限而没有写权限 我可以通过多种方法来检查这一点 但我想不出他可以在 git 中使用的方法 是否有 git 命令可以显示给定远程存储库的权限 No Git 本身不处
  • 具有单独 work_tree 的 Git 子模块

    我按照本页上的教程使通过 Git 部署我的网站变得简单 http toroid org ams git website howto http toroid org ams git website howto 到目前为止一切都很好 但是我最近
  • 交互式变基后,本地 Git 分支已偏离原始分支

    我有一个本地分行 CRM ayrshireminis 其中有一些我已推送到原点的提交 origin CRM ayrshireminis 这个分支是从创建的develop大约一周前的一个分支 其他合作者已经在该分支上完成了一周的工作 我想做的
  • git subtree pull -P 不管 总是合并冲突

    问题 即使我没有进行任何更改 每次尝试拉入子树时 我都会遇到合并冲突 我在做什么 In 子树仓库 Make some changes git commit am Changes made git push origin master In
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有

随机推荐