git stash的妙用:去除git 多余的merge信息

2023-05-16

何谓多余的merge信息

所谓多余的merge信息,指的是当自己提交代码时,发现远端代码有更新,这时虽然自己的代码成功push,但会多一条merge信息,像这样:

merge branch 'feature/login' of ssh://gitlab.aaa.net/project/main-web  into feature/login

 上面为示例信息,feature/login指开发分支,ssh://gitlab.aaa.net/project/main-web指代码仓库地址。(此处为随意写的,不代表真实信息)。

多余的merge信息有什么不好

你可能会有一个疑问,这仅仅是多一条merge信息而已,代码同步的目的达到了,又何必在意 呢?

事实上,你的确可以忽略掉,但有几条理由支持你优化一下:

  • 分支会出现分叉。
  • 提交记录不再纯净,出现冗余的无用信息。
  • 你需要清楚的知道这中间git发生了什么,导致这种现象产生,又该如何避免,这可以增进你对git工作方式的认识。

所以,仍然建议去掉这种多余的merge信息。

产生的原因是什么

根本原因在于自己拉取代码时,使用了git pull

这种使用git pull的行为是有意的或者无意的,当你使用诸如vscode的git工具的菜单操作时,可能是无意的。而有意是指,你推送代码之时,发现远程有更新,需要先拉取远程代码到本地,然后才能推送,这时你先使用了git pull。

你可能感到疑惑:git pull为什么会多出这种merge信息呢?

原因在于git pull事实上相当于git fetch加上git merge操作

首先,git fetch将远端的更新获取到本地,但这也仅仅是获取,还没有合并到我们的本地的分支中。 

第二个步骤——合并是必不可少的,因为只是获取到本地,而不合并,那么远端的更新事实上并没有真正更新到我们本地分支中。我们的本地分支必须接纳了远端更新,才能推送,这个接纳也就是merge的过程。

merge branch 'feature/login' of ssh://gitlab.aaa.net/project/main-web  into feature/login

这表明,我们的本地分支,不但获取了远端更新,还将获取到的更新合并到本地分支。 

而后,我们再将代码推送到远端,自然会有额外的这一个merge信息。

git pull必然出现这种提示吗

git pull并非是必然出现这种情况,出现这种情况的条件是:

本地有领先远端的commit,同时远端也有领先本地的commit。

假设本地并没有commit,那么git pull并不会产生额外的merge信息,因为本地和远端没有分叉(可以通俗理解成分歧),无需产生额外的合并节点。

假设远端没有额外的commit,自然获取不到远端的更新,也不会产生合并的问题。

有哪些解决方案

首先,git pull --rebase是一个很好的方案,这种方案的原理是不产生额外的合并节点,而是将远端更新拉取到本地,而后将本地的提交附加到远端更新之后。

这不是本文的主题,不再赘述。

还有另外一种方式:妙用git stash,其基本步骤和原理如下:

  1.  git stash。这条命令会使本地的修改暂存,就像是本地的修改消失了一样,可以理解成将本地的修改“藏起来”。
  2. git pull 。这条命令使本地获取到远端更新,由于本地相对于远端没有新的commit,不会产生额外的merge信息。
  3. git stash pop。这条命令使本地的修改还原,可以理解成将本地藏起来的修改重新“揪出来”。
  4. git add .。这条命令表明重新将修改添加到暂存区。
  5. git commit -m [message]。重新将暂存区的修改提交到本地仓库。
  6. git push 。推送到远端。

最后总结一下,使用git stash解决多余merge信息的核心操作:

1.git stash。

2.git pull。

3.git stash pop。

剩余的几个步骤,事实上就是我们重新提交的过程。

至于git stash的更深的原理,不属于本文的探究目标,不再赘述。

全文完。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git stash的妙用:去除git 多余的merge信息 的相关文章

  • git merge 冲突的不同场景

    我试图了解 git 合并后可能发生 git 冲突的情况以及如何避免它们 我创建了一个 git 存储库并向其中添加了一个文本文件 我已将 1 添加到文本文件中并将其提交给 master 我已经从 master 创建了一个新分支 分支 2 并将
  • Phonegap使用命令行工具添加插件

    我是phonegap的新手 我按照phonegap官方网站中定义的步骤使用命令行工具创建项目 nodejs 我成功创建项目并添加平台 但是 当我尝试添加插件时出现以下错误 命令 cordova plugin add https git wi
  • Git:如何修改服务器的提交?

    我已经在 EC2 上的 git 服务器上推送了一些提交 而不是在 github 上 如何修改 git 服务器上的这些提交 操作就像 删除提交 例如变基 更改提交消息 是否可以 非常感谢 你几乎可以通过用力推动来完成所有事情 将您的本地树更改
  • 如何使用合并或替换来更新 R 中具有多列的表

    我想做一些与这个问题非常相似的事情 如何使用 merge 更新 R 中的表 https stackoverflow com questions 3190118 how to use merge to update a table in r
  • 如何诊断和修复 git fatal: 无法读取树

    我在用着git管理项目上的文件 并不断遇到这个问题 当我跑步时git status我收到消息 fatal unable to read tree e2d920161d41631066945a3cbcd1b043de919570 据我了解 我
  • Git:如何正确合并两个功能完全不同的分支?

    想象一下这样一种情况 同一个项目有两个分支 第一个分支的一部分对另一个分支进行了大幅重构 但有一段时间 您需要保持两个分支的功能 因此您需要对两个分支进行错误修复和关键功能添加 有时是以不对称的方式 在某些时候 您必须将重构的分支合并到原始
  • Gitolite git 克隆错误

    我正在尝试在我的服务器 Macos 服务器 上设置 gitolite 我按照此处找到的安装文档中的说明进行操作 http sitaramc github com gitolite doc 1 INSTALL html http sitara
  • 删除并在另一个文件夹中重新创建后保留文件的 Git 历史记录

    我有以下场景 删除了提交 1 中名为 src GetData cs 的文件 在提交 5 中创建了一个名为 src Get GetDataNew cs 的文件 在提交 7 中将 2 中的文件重命名为 src Get GetData cs 1
  • 使用 XSLT 合并 2 个具有匹配“id”属性的 XML 文件

    当存在匹配的 id 属性时 我想使用 XSLT 合并 2 个 XML 文件 myFile1 xml 这是第一个输入文件
  • 在推送后检索孤立的提交对象 --force

    Doing push force总是有点冒险 这里有一个例子 说明它如何产生一些问题 例如远程丢失修订版本 假设 有一个人Bob已更新远程master分支来自B to C 还有另外一个人Mike还没有获取此更新并且HEAD of his m
  • npm install 的问题(Angular)

    今天我尝试创建一个新项目 所以我使用这个命令 ng new NAME style less 并在我的cmder中弹出错误和警告 所以我卸载了 Roaming npm 和 npm cache 中的节点和文件 然后我安装了node并再次下载cm
  • 在 Windows 下克隆 git repo 时,出现“错误:无法创建文件 <文件>...(是目录)”

    Z gt git clone git github com kennethreitz httpbin git Cloning into httpbin remote Counting objects 1073 done remote Com
  • 在git的远程存储库上创建私有分支

    我想在我们公司的 git 上构建特定的流程 开发人员在他的本地计算机上创建一个分支并在那里提交一些文件 dev 将此分支推送到远程仓库 其他开发者无法访问该分支 经过几轮推动开发人员决定发布他的更改 将他的私人分支合并到公共分支 推动该公共
  • Gitlab 备份错误:包对象因信号 9 死亡

    我有一个存储库 有 2 个分支 大小为 3 5GB 每个分支大约 1 5GB git 本身就有 700MB 这是错误 备份失败 失败的 失败 opt gitlab embedded bin git git dir mountdata git
  • 推送更改到 Git 不起作用

    每次我想要提交命令 git push heroku master 时 系统都会要求我在 PowerShell 中输入凭据 当我输入 heroku 凭据 默认情况下连接到 git 时 我收到错误消息 但是 当我输入我的主目录中的 netrc
  • 如何从暂存区删除单个文件(撤消 git add)?

    情况 我有一个 Git 存储库 其中文件已在索引中 我对几个文件进行了更改 打开 Git 并使用 git add 将这些文件添加到我的暂存区域 问题 如何从暂存区域中删除这些文件之一 但不将其从索引中删除或撤消对文件本身的更改 如果我正确理
  • 如何存储和计算版本控制历史记录?

    考虑这个简单的 python 代码 它演示了一个非常简单的字典版本控制设计 def build current history current for action key value in history assert action in
  • 无法访问 Github 403 错误:权限被拒绝

    我是 Git Github 的新手 所以请原谅我的困惑 问题是 我刚刚对本地存储库进行了更改 并且想推送到 Github 上的原点 特别是 gh pages 之前 我一直在使用另一个 Github 帐户 因此我更改了 user name 和
  • 如何从现有存储库中的分支创建新的 GitHub 存储库?

    I have master and 新项目分支机构 现在我想创建一个全新的存储库及其基于新项目分支的主存储库 背景 我有一个存储库 其中包含三个独立的应用程序 事情并不是这样开始的 仓库中最初只有一个应用程序 然而 随着时间的推移 业务需求
  • 使用 Homebrew 安装 Git 时出现问题 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Homebrew 升级 Git 时出现问题 https stackoverflow com questions 12362021 problems upgrading git with home

随机推荐