Git pull 创建了不需要的合并提交

2024-04-21

当我将工作提交给分支时A并推送到 repo,git 抱怨我需要更新我的项目。我通过更新了我的项目git pull并完成了自动合并。现在合并后有两次提交:一次提交是我的更改,另一次提交来自合并后的自动合并git pull.

我注意到合并提交已经包含了已反映在存储库中的所有更改,那么当所有更改都已反映时,为什么 git 专门为该合并创建另一个提交呢?有没有办法在推送之前删除该合并提交?它使事情变得不必要的复杂化。该合并提交本质上是无用的。


合并会将您的本地更改与从服务器获取的更改合并在一起。如果您没有本地更改,或者没有从服务器获取新更改,则不会创建合并提交。这可能是也可能不是您想要反映更改集成的方式 - 您可以通过配置或命令行选项设置其他选项 - 但它确实必须以某种方式发生。

特别是,我的意思是 - 您指出存储库中的所有更改都已在没有合并提交的情况下得到考虑。但是必须有从远程获取的提交,这些提交尚未在本地存储库中 - 否则将不会有合并提交。如果您绘制合并提交的历史记录,您应该看到类似的内容

             R -- S
            /      \
x -- x -- O -- A -- M

where A是你的本地提交,O是您之前从远程获取的提交,并且R and S是当您拉取时从远程获取的提交(也基于O)。你可以看到什么M正在通过(a)检查R and S,或(b)diffing M反对A.

(一种可能令人困惑的特殊情况,net服务器更改的结果可能是“无更改”。例如,也许有人犯了R但后来又恢复了R并承诺作为S。由此产生的合并不会产生任何效果,但 git 仍然必须这样做以确保分支仅在每次推送时向前移动。)

无论如何,这是默认行为,因为它将远程更改合并到本地分支的最简单、最安全的方法。但这不是唯一的方法。你可以要求 gitrebase将您的本地分支改为远程分支。然后你会得到

x -- x -- O -- R -- S -- A'

对于简单的工作流程,这是合理的,并且它往往符合变基的最大规则——(大致)它避免重写已经共享的提交。

但它确实有成本和风险。来自文档https://git-scm.com/docs/git-config https://git-scm.com/docs/git-config under pull.rebase:

注意:这是一个可能存在危险的操作;除非您了解其含义,否则请勿使用它(有关详细信息,请参阅 git-rebase [1])。

您的提交被替换为A',尚未通过任何单元测试。仅此一点还不算太糟糕 - 在“合并”的情况下,M也还没有通过任何测试。但如果你有更复杂的当地历史,那么可能many提交将被重写。因此,您最终可能会得到许多未经测试的提交,并且推送未经测试的提交可能会让以后的生活变得更加困难(例如,如果您想使用bisect找到引入错误的提交)。

此外,可能需要进一步配置来确定应如何处理本地历史记录中的合并提交。

尽管如此,对于某些工作流程(例如,如果您经常拉取并期望不会有大量或复杂的本地历史记录),收益可能会超过成本;在这种情况下你可以

git pull --rebase

或者将其设置为默认值

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

Git pull 创建了不需要的合并提交 的相关文章

  • Git 子模块:[电子邮件受保护]:权限被拒绝(公钥)。致命:无法从远程存储库读取

    我有一个问题git submodule update init remote 我收到错误 权限被拒绝和克隆失败 但我将 SSH 密钥添加到了我的 github 存储库中 我可以拉 推 git 克隆 我拥有所有需要的访问权限 我使用操作系统
  • Git - 推送到远程存储库中的远程跟踪分支

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

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 为什么cherry-pick总是会导致合并冲突?

    我正在从发布分支中挑选特定的提交到我的本地工作副本中 每次我从发布分支中挑选一个提交时 我都会遇到必须解决的合并冲突 即使更改看起来微不足道 例如 const char kApplicationVersion Develop const c
  • 如何在 Windows 上向 git 存储库添加符号链接?

    我使用 GitHub 的电子环境编译 OS X 的二进制文件 并希望将输出添加到 git 存储库 我试过 git add error readlink sulu app Contents Frameworks Electron Framew
  • vscode通过SSH连接gitlab的问题

    我在尝试通过 SSH 连接到 GitLab 远程存储库时遇到问题 这里是迄今为止完成的步骤 成功生成 SSH 密钥 管理人员将密钥添加到存储库中 因此当我访问 GitLab 网站时 我可以提交和发布分支 我无法从 VSCODE 发布分支并收
  • Git 无效的修订范围 Symfony2 Composer 外部包

    RuntimeException Failed to execute git log 18efcf67d236d5bbf46ac67820250dffd0474b6e 94e2146f525fa1367e15646fa273e5b34f92
  • DVCS命令的统一

    当处理多个 开源 项目时 多个版本控制系统开始出现问题 虽然它们共享共同的操作 但我经常在输入时犯错误hg add反而git add 我记得前段时间看到过一个项目 通过提供基本命令以统一的方式访问不同的源代码控制软件提交 ci add等在外
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • git pull,忽略深度,如何不拉取整个历史记录?

    我们有一个巨大的多 GB git 存储库 主要是二进制对象 克隆需要几天时间 实际的主分支 没有历史记录 只有大约 20MB 所以我想 深度为 1 的 git 克隆就是解决办法 然而 现在我需要将某人的更新拉到主服务器 我们没有分支 当我拉
  • 有谁知道类似于 SVN Time-Lapse View 的 Git 工具 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 SVN Time Lapse View 是一个跨平台查看器 可以下载文件的所有修订版本 并允许您通过拖
  • 自动将所有 GitHub 存储库镜像到 gitlab

    对于 GitLab 必须手动为每个存储库设置拉 推镜像 我想知道那里有any way可以自动将所有 Github 存储库同步到 GitLab 这样 当您在 GitHub 中创建新的存储库时 GitLab 中的存储库将自动创建 并充当拉取镜像
  • 如何合并两个连续的 git 存储库

    我有一个相当独特的情况 我有一个名为 Project1 的存储库 我在其中工作了一些时间 几个月 一年后 我创建了存储库 Project1 Again 从 Project1 停止的地方开始 现在 我希望修订历史记录是连续的 因此我希望它们合
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • 无法从 Sourcetree 拉取 Git 远程存储库

    我生成了 ssh 密钥并配置了我的 git 和 SourceTree 我可以 git pull 并从 Git bash 执行其他操作 注意 我在 bashrc 中添加了以下内容以使其正常工作 eval ssh agent ssh add 然
  • 使用终端时 Git 推送在总计后卡住了?

    我尝试将一些文件推送到Github 总大小只有22 2M 我不知道为什么它在总行之后卡住了 我读过推送到 Github 时 Git 推送挂起 https stackoverflow com questions 16906161 git pu
  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可
  • Git 提交失败:“请使用 -m 或 -F 选项提供消息。”

    当我键入 git commit 命令来提交文件时 我收到以下错误消息 Microsoft Visual Studio 微软 找不到命令 错误 核心编辑器 Microsoft Visual Studio 存在问题 请使用 m 或 F 选项提供

随机推荐