【问题标题】:How do I resolve git saying "Commit your changes or stash them before you can merge"?如何解决 git 说“在合并之前提交更改或存储它们”?
【发布时间】:2021-02-25 05:24:29
【问题描述】:

我在本地机器上做了一些更新,将它们推送到远程存储库,现在我正在尝试将更改拉取到服务器并收到消息;

error: Your local changes to the following files would be overwritten by merge:
wp-content/w3tc-config/master.php
Please, commit your changes or stash them before you can merge.

所以我跑了,

git checkout -- wp-content/w3tc-config/master.php

然后再试一次,我得到了同样的信息。我假设w3tc 更改了服务器上配置文件中的某些内容。我不在乎是本地副本还是远程副本在服务器上(我想远程副本最好),我只想能够合并我的其余更改(插件更新)。

有什么想法吗?

【问题讨论】:

标签: git git-commit


【解决方案1】:

使用:

git reset --hard

然后:

git pull origin master

【讨论】:

    【解决方案2】:

    % 混帐状态 HEAD 在 5c 时分离 未为提交暂存的更改: (使用“git add ...”更新将要提交的内容) (使用“git restore ...”丢弃工作目录中的更改)

    【讨论】:

      【解决方案3】:

      这解决了我的错误:

      我在分支:“A”

      git stash
      

      移动到主分支:

      git checkout master 
      git pull*
      

      回到我的分支:“A”

      git checkout A 
      git stash pop*
      

      【讨论】:

        【解决方案4】:

        在使用 reset 之前,请考虑使用 revert,这样您就可以随时返回。

        https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert

        根据要求

        来源:https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert

        git reset vs git revert sonic0002       2019-02-02 08:26:39

        在使用 git 等版本控制系统维护代码时,我们不可避免地需要回滚一些由于错误或临时代码还原而导致的错误提交。在这种情况下,新手开发人员会非常紧张,因为他们可能会迷失在不影响其他人的情况下应该如何回滚更改,但对于资深开发人员来说,这是他们的日常工作,他们可以向您展示不同的方式。 在这篇文章中,我们将介绍开发者经常使用的两个主要的。

        • git 重置
        • git 还原

        它们有什么区别和对应的用例?我们将在下面详细讨论它们。 git 重置 假设我们有以下几个提交。

        提交 A 和 B 是工作提交,但提交 C 和 D 是错误提交。现在我们要回滚到提交 B 并删除提交 C 和 D。目前 HEAD 指向提交 D 5lk4er,我们只需将 HEAD 指向提交 B a0fvf8 即可实现我们想要的。 使用 git reset 命令很简单。

        git reset --hard a0fvf8
        

        执行上述命令后,HEAD 将指向提交 B。

        但是现在remote origin还是有HEAD point to commit D,如果我们直接用git push推送修改,不会更新remote repo,需要加一个 -f 强制推送更改的选项。

        git push -f
        

        这种方法的缺点是一旦重置完成,HEAD 之后的所有提交都将消失。万一有一天我们发现一些提交吃掉了好的提交并想要保留它们,那就太晚了。因此,许多公司禁止使用这种方法来回滚更改。

        git 还原 git revert 的用途是创建一个新的提交来恢复之前的提交。 HEAD 将指向新的还原提交。 对于上面的 git reset 示例,我们需要做的只是恢复提交 D,然后恢复提交 C。

        git revert 5lk4er
        git revert 76sdeb
        

        现在它创建了两个新的提交 D' 和 C',

        在上面的例子中,我们只有两个提交要恢复,所以我们可以一个一个地恢复。但是如果有很多提交要恢复怎么办?我们确实可以还原一个范围。

        git revert OLDER_COMMIT^..NEWER_COMMIT
        

        这种方法没有git reset的缺点,它会将HEAD指向新创建的reverting commit,并且可以直接将更改推送到远程而不使用-f 选项。 现在让我们看一个更难的例子。假设我们有三个提交,但错误的提交是第二个提交。

        使用 git reset 回滚提交 B 不是一个好主意,因为我们需要保留提交 C,因为它是一个好的提交。现在我们可以恢复提交 C 和 B,然后使用 cherry-pick 再次提交 C。

        通过上面的解释,我们可以发现 git reset 和 git revert 最大的区别在于 git reset 会将分支的状态重置为之前的状态通过删除所需提交后的所有更改,而 git revert 将通过创建新的恢复提交并保留原始提交来重置为以前的状态。建议在企业环境中使用 git revert 而不是 git reset 。 参考:https://kknews.cc/news/4najez2.html

        【讨论】:

        • 感谢您的回答。它添加了新信息,但是,如果将来链接断开,在答案中更详细地解释它可能会更有帮助。您也可以使用引号来引用网站的摘录。
        【解决方案5】:

        放弃本地更改 使用git reset --hard

        【讨论】:

        • 如果我还需要推送本地更改怎么办?
        【解决方案6】:

        在解决此问题时记录您新创建的文件:

        如果您有新创建的文件,您可以创建一个本地更改补丁,拉入远程合并并在远程合并完成后应用您的本地补丁,如下所述: p>

        1. 暂存本地更改。 (不承诺)。需要暂存来创建新创建文件的补丁(因为它们仍未被跟踪)

        git add .

        1. 创建补丁以保持记录

        git diff --cached > mypatch.patch

        1. 放弃本地更改并删除新的本地文件

        git reset --hard

        1. 拉取更改

        git pull

        1. 应用您的补丁

        git apply mypatch.patch

        Git 将合并更改并为未合并的更改创建 .rej 文件。

        按照 Anu 的建议,如果您在应用补丁时遇到问题,请尝试:

        git apply --reject --whitespace=fix mypatch.patch 这个回答git: patch does not apply详细讲了这个问题

        享受您在功能上的持续工作,并在完成后提交您的本地更改。

        【讨论】:

        • 我想推送一部分代码进行新的更改,所以我这样做了:1. 从我的本地 dev 分支创建了一个补丁 2. 进行了硬重置 3. 将新的更改从 master 拉到 dev (为了避免任何合并冲突) 4. 对我的本地开发者做了一个小改动 5. 推送到远程开发者 6. 应用补丁回来--> 出现错误:error: patch failed: yourfile.py:33 error: yourfile.py: patch does not apply,我仍然有 mypatch.patch,但不要知道为什么它没有被应用而且我丢失了我的更改!
        • 我明白了,正确的命令是git apply --reject --whitespace=fix mypatch.patch,我得到了我的更改唷!!! [感谢](stackoverflow.com/a/15375869/6484358)
        • 阿努,命令 git apply mypatch.patch 是正确的应用补丁,这是我一直使用的,创建的补丁本身可能存在一些问题,如果你永远不会丢失你的更改你有你的补丁,它包含所有合并的变化。
        • "git apply --reject --whitespace=fix" mypatch.patch 此命令将应用补丁而不解决它,将坏文件保留为 *.rej:patch -p1
        【解决方案7】:

        大概

        git --rebase --autostash
        

        会有所帮助

        【讨论】:

          【解决方案8】:

          对我来说这很有效:

          git reset --hard

          然后

          git pull origin <*current branch>

          之后

          git checkout <*branch>

          【讨论】:

            【解决方案9】:

            如果您使用的是 Git Extensions,您应该能够在 Working directory 中找到您的本地更改,如下所示:

            如果您没有看到任何更改,可能是因为您使用了错误的子模块。所以检查所有带有潜艇图标的项目,如下所示:

            当您发现一些未提交的更改时:

            选择带有Working directory 的行,导航到Diff 选项卡,用铅笔(或+-)图标右键单击行,选择重置为第一次提交或提交或存储或任何您想用它做的事情。

            【讨论】:

              【解决方案10】:

              对我来说,只有git reset --hard 有效。

              提交不是一种选择,因为没有什么可提交的。

              存储不是一种选择,因为没有什么可存储的。

              看起来它可能来自.git/info/exclude 中的已排除文件,并且有git update-index --assume-unchanged <file>'ed 一些文件。

              【讨论】:

              • 这会撤消您之前的@​​987654324@ 请求吗?
              • git reset --hard 将删除尚未提交的现有更改
              【解决方案11】:

              我尝试了第一个答案:得分最高的git stash但仍然弹出错误消息,然后我发现这篇文章提交更改而不是stash 'Reluctant Commit'

              错误信息终于消失了:

              1:git add .

              2:git commit -m "this is an additional commit"

              3:git checkout the-other-file-name

              然后它起作用了。希望这个答案有帮助。:)

              【讨论】:

                【解决方案12】:

                这可能是由 CRLF 问题引起的。

                见:Why should I use core.autocrlf=true in Git?

                使用它来拉取和强制更新:

                git pull origin master
                git checkout origin/master -f
                

                【讨论】:

                  【解决方案13】:

                  警告:这将删除未跟踪的文件,因此这不是这个问题的好答案。

                  就我而言,我不想保留文件,所以这对我有用:

                  Git 2.11 及更新版本:

                  git clean  -d  -fx .
                  

                  旧版 Git:

                  git clean  -d  -fx ""
                  

                  参考:http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

                  • -x 表示忽略的文件以及 git 未知的文件也会被删除。

                  • -d 表示除了未跟踪的文件之外,还删除未跟踪的目录。

                  • 需要 -f 来强制它运行。

                  【讨论】:

                    【解决方案14】:

                    在拉取之前请求提交

                    • git 存储
                    • git pull origin >

                    如果需要:

                    • git stash 应用

                    【讨论】:

                    • 当您想记录工作目录和索引的当前状态,但又想回到干净的工作目录时,请使用 git stash。该命令保存您的本地修改并恢复工作目录以匹配 HEAD 提交。
                    【解决方案15】:

                    您不能与本地修改合并。 Git 保护您不会丢失潜在的重要更改。

                    你有三个选择:

                    • 使用提交更改

                      git commit -m "My message"
                      
                    • 把它藏起来。

                      Stashing 充当堆栈,您可以在其中推送更改,并以相反的顺序弹出它们。

                      要存储,请键入

                      git stash
                      

                      进行合并,然后拉出 stash:

                      git stash pop
                      
                    • 放弃本地更改

                      使用git reset --hard
                      git checkout -t -f remote/branch

                      或者:放弃特定文件的本地更改

                      使用git checkout filename

                    【讨论】:

                    • 默认情况下git stash 不会存储没有历史记录的文件。因此,如果您有尚未添​​加但将被合并覆盖或“创建”的文件,则合并仍将阻塞。在这种情况下,您也可以使用git stash -u 来存储未提交的文件。或者你可以删除它们!
                    • 运行git clean -dfx 是一个糟糕的主意。删除了一些我真正需要的 .gitignored 文件。
                    • 我遇到了一个用户,在git reset --hard之后,还有未合并的变化!
                    • 只是一个注释。我遇到了 .gitignore 与原点不同步的问题。我一直在使用git update-index --assume-unchanged C:\...\.gitignore,我不得不更改它以再次跟踪更改,这样我就可以使用git stash,如:git update-index --no-assume-unchanged C:\...\.gitignore 然后上面的效果很好!
                    • 使用git checkout filenameawesome point 放弃对特定文件的本地更改
                    【解决方案16】:
                    git stash
                    git pull <remote name> <remote branch name> (or) switch branch
                    git stash apply --index
                    

                    第一个命令将您的更改临时存储在the stash 中,并将它们从工作目录中删除。

                    第二个命令切换分支。

                    第三个命令恢复存储在存储中的更改(--index 选项可用于确保暂存文件仍处于暂存状态)。

                    【讨论】:

                    • 解释@vikramvi的观点:我们也可以用git stash pop代替git stash apply。前者将其从存储中删除,而后者仍将其保留在那里
                    【解决方案17】:

                    就我而言,我备份并删除了 Git 抱怨、提交的文件,然后我终于能够签出另一个分支。

                    然后我替换了文件,将内容复制回并继续,就像什么都没发生一样。

                    【讨论】:

                      【解决方案18】:

                      试试这个

                      git stash save ""
                      

                      然后再次尝试拉动

                      【讨论】:

                      【解决方案19】:

                      您可以尝试以下方法之一:

                      变基

                      对于简单的更改,请尝试在拉取更改时在其之上重新设置基础,例如

                      git pull origin master -r
                      

                      所以它会在获取后将您当前的分支应用到上游分支之上。

                      这相当于:checkout masterfetchrebase origin/master git 命令。

                      这是一种潜在的危险操作模式。它改写了历史,当您已经发布了该历史时,这并不是一个好兆头。除非您仔细阅读git-rebase(1),否则不要使用此选项。


                      结帐

                      如果您不关心本地更改,您可以临时(强制)切换到其他分支,然后将其切换回来,例如

                      git checkout origin/master -f
                      git checkout master -f
                      

                      重置

                      如果您不关心本地更改,请尝试将其重置为 HEAD(原始状态),例如

                      git reset HEAD --hard
                      

                      如果上面没有帮助,它可能是你的 git 规范化文件 (.gitattributes) 中的规则,所以最好提交它所说的内容。或者你的文件系统不支持权限,所以你必须在你的 git 配置中禁用 filemode

                      相关:How do I force "git pull" to overwrite local files?

                      【讨论】:

                      • 不起作用:我仍然收到相同的消息,例如“先存储您的更改”。当我输入“git stash”然后输入“git pull”->“错误:你有未保存的更改..先做一个 stash”。在摧毁我的电脑之前不久
                      • @trinity420 可能是您的文件权限,检查git status 存储后您有什么变化。如果没有答案有帮助,请考虑添加一个新问题。
                      • 谢谢你,但我的问题解决了,在这里尝试了一切,没有任何效果,然后在 PHPStorm 中单击“提交更改”“合并”,然后我取消隐藏更改并且它有效..
                      【解决方案20】:

                      所以我遇到的情况如下:

                      错误:您对以下文件的本地更改将被合并覆盖: wp-content/w3tc-config/master.php 请在合并之前提交您的更改或存储它们。

                      除了,在那之前,是远程的: 所以实际上是这样的:

                      remote: 错误:您对以下文件的本地更改将被合并覆盖: 一些/file.ext 请在合并之前提交您的更改或存储它们。

                      发生的事情是(我认为,不是 100% 肯定的)git post receive 钩子开始运行并且由于远程服务器存储库中的移动变化而搞砸了,理论上不应该被触及。

                      所以我最终通过跟踪 post-receive 钩子并找到了这一点,不得不去服务器上的远程存储库,并且发生了变化(这不在我的本地存储库中,事实上,说它匹配,没有更改,没有提交,最新等)所以在本地时,没有更改,在服务器上,然后我做了一个git checkout -- some/file.ext 然后本地和远程存储库实际上匹配,我可以继续工作和部署。不完全确定这种情况是如何发生的,尽管几十名开发人员加上 IT 变更可能与此有关。

                      【讨论】:

                      • 是问题还是答案?
                      • @stdcall - 两者兼而有之。当我遇到问题中描述的这种情况时,这就是我必须采取的措施来解决它。这绝对不是一个正常的 git 解析,从问题来看,似乎它可能是相同的异常情况(即服务器上的配置更改,但本地没有更改)。如果有人对为什么(或如何)发生这种情况有更多的想法,我会欢迎任何见解。
                      猜你喜欢
                      • 2019-07-11
                      • 1970-01-01
                      • 2018-04-24
                      • 1970-01-01
                      • 2020-12-09
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多