【问题标题】:git - A git fetch / git merge merges without conflicts, but shows almost all files are modified and need to be committedgit - git fetch / git merge 合并没有冲突,但显示几乎所有文件都已修改并需要提交
【发布时间】:2019-04-11 07:15:40
【问题描述】:

我对 git 很陌生,我每隔一段时间就会看到这个。

例如:

  1. 我在我的分支branch-A 工作了几天(分支是从开发新副本创建的)
  2. 我通过 git add . / git commit -m "blahblah" 暂存并提交我的更改
  3. 现在我想从远程获取最新更改并将其合并到我的分支中,以确保我使用最新代码
  4. 为此,我使用 git checkout develop 切换到我的本地 develop 分支,git status 显示我落后于 37 次提交

    myMBPro:MyProj$ git status
    On branch develop
    Your branch is behind 'origin/develop' by 37 commits, and can be fast-forwarded.
      (use "git pull" to update your local branch)
    
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    

    随后是已删除、未跟踪文件的列表

  5. git fetch origin,然后是git merge origin/develop 而在develop 分支上显示:

myMBPro:MyProj user$ git fetch origin myMBPro:MyProj user$ git merge origin/develop Updating 799c6d7a..510c77ab Fast-forward .../Implementations/MyRenderer.cs | 39 ++-- ... etc

  1. 我现在通常会切换到我的分支branch-A 并执行git merge develop 以将开发合并到branch-A 但我通常首先执行git status 以检查一切是否正常。所以,我留在develop 分支并做git status
  2. 问题是我看到git status 报告可能我项目中的每个文件都已更改(有些未跟踪,有些已暂存,有些已准备好提交)。

```

myMBPro:MyProj user$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

,然后是准备提交的文件列表、未暂存的文件和未跟踪的文件。

所以,我最终得到了很多我什至没有接触过、没有修改过、也没有添加过的文件,这些文件现在显示为被我以某种方式修改过。因此,我犹豫是否将它们合并到我的branch-A

知道为什么会这样吗?这是否正常(但对我来说,我没有更改的文件出现在我更改时似乎并不正常,现在我需要开始跟踪它们,暂存并提交它们。

我在 MacBookPro 上,从终端使用 git 并使用 SourceTree

【问题讨论】:

  • 是否有合并冲突?
  • 不,没有冲突,所有合并都是快进的
  • 您是否可以在您的分支上添加一些文件?我不记得git add . 的确切行为,但这可能不会添加未跟踪的文件吗?
  • 检查你的行尾设置,有可能结尾存储在带有 windows 行尾的数据库中
  • @Andy 是的,但那是在我的分支上。我将这些提交给我的分支,然后切换到开发来做我上面描述的事情。在另一个分支上添加文件并将它们提交到该分支在这种情况下应该没有效果

标签: git git-merge git-fetch


【解决方案1】:

你确定你在git checkout develop 之前做了git commit 吗?如果您的工作目录在您之前checkout developpull 之前是脏的,我知道这可能会发生的唯一方法。

当然,可能存在行尾问题,但这仍然不能真正解释问题。 git merge 的一个重要方面是它必须提交。如果没有冲突,则保证提交,并且不会提交的唯一方法是存在合并冲突(这会使您处于各种暂存和未暂存文件的状态)。如果您没有遇到合并冲突(意思是您看到 fast-forward 字样),那么似乎只有一种可能性:

假设你在分支 A 上工作。然后你提交。然后,您更改了几个文件(或者,它们被您同时运行的某些软件自动更改)。然后,当您git checkout develop 时,您最终会复制您的indexindex 是您自最近一次提交以来所做的所有更改的集合。您可以结帐另一个分支,您的索引将跟随您。据我所知,这似乎是唯一可能导致您正在经历的事情。如果合并影响索引中的文件,则合并将失败。但是,如果它是一个简单的 fast-forward 错过了您的 index,则合并可能会成功,这将导致您的 index 显示在最近提交的顶部。

对于未来,请尝试在 git fetch origin; git merge origin/develop 之前运行 git status。如果您仍然遇到问题,您可能需要复制粘贴终端中的内容,以便我们阅读。

另外,请确保在 repo 中只有源代码和构建脚本,以及 .gitignore 可能由 vim、您的 IDE、您的构建脚本、正在运行的可执行文件等创建的任何文件。这些文件可能会不断变化。

【讨论】:

  • 我绝对确定我确实提交了。此外,如果我没有在我的分支上提交我的更改,我将无法更改为开发分支。我做了 git add .,然后 git commit -m "my msg",在我的分支上,没有冲突,之后 git status 报告没有错误。我也总是在执行任何其他命令之前执行 git status ,这次我做到了,所以这不是 100% 的问题。事实上,我每次在触摸终端之前都会这样做,原因有很多:查看是否一切正常,查看我在哪个分支等。
  • 为了添加更多细节,我试图通过删除 git merge 在“开发”分支中所做的所有更改来解决我上面描述的问题。这让我可以切换回分支-A。但是当我这样做时,现在我看到很多文件在他们的名字前面都有“删除:”。同样,我没有删除它们,只是通过检查分支-A,git 自动完成并暂存它,因此它们现在显示为“要提交的更改”。事实上,我们的 .gitignore 文件几个月没有被任何人更改(我们从 gitignore.io 获得)被标记为已修改。希望这能让您对正在发生的事情有更多的了解
  • git 显示为以这种方式修改的文件几乎包括项目/存储库中的所有内容。 cs、png、axml、txt、xml、xaml、csproj、pfxappxmanifest、config、storyboard、plist、.ipa、.gitignore,可能几乎所有内容。我们没有人肯定会改变这些
  • ... 我只是尝试从 SourceTree 中取消暂存这些文件之一。它不会取消它。肯定有问题,我想知道我最后的 4 个 cmets 是否能给您更多线索或可以引导您提出一些解决方案
  • 我的帖子解释了“如果我没有在我的分支上提交我的更改,我将无法更改为开发分支”是不正确的。您可以更改分支,更改将跟随您。 git diff 显示什么?你说“变了”。这里到底发生了什么变化?
猜你喜欢
  • 1970-01-01
  • 2011-12-16
  • 2022-12-16
  • 2013-03-20
  • 2020-07-25
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多