【问题标题】:Cancel git merge but keep local changes取消 git merge 但保留本地更改
【发布时间】:2016-01-21 01:47:17
【问题描述】:

我启动了一个 git 合并,但做了一些我想保留的本地更改。我不再想合并,而是继续处理本地更改。我该怎么做?

【问题讨论】:

  • 您正在解决冲突,对吧?
  • 如果您处于合并冲突状态,请尝试$ git merge --abort

标签: git


【解决方案1】:

语言是出了名的模棱两可。 :-) 当您说“保留本地更改”时,您的意思可能是:

  1. 将所有当前更改保留在工作目录中,无论您是手动编辑这些文件还是将它们合并到中间;或
  2. 放弃合并带来的任何更改并保留您引入的任何更改。

这个简单的解决方案解决了第(1)点:

$ git stash save
$ git stash pop

这是显示影响的成绩单:

$ git status
On branch stuff-217/apply-new-config-details
All conflicts fixed but you are still merging.  <<<<<< notice this line!

Changes to be committed:
        modified:   package.json
        modified:   src/wallabyTest.ts
        modified:   wallaby.js

$ git stash save
Saved working directory and index state WIP on stuff-217/apply-new-config-details...

$ git status
On branch stuff-217/apply-new-config-details
nothing to commit, working tree clean

$ git stash pop
On branch stuff-217/apply-new-config-details
                                             <<<<<< no longer in the merge!
Changes not staged for commit:
        modified:   package.json
        modified:   src/wallabyTest.ts
        modified:   wallaby.js

【讨论】:

  • 解决方案#1 对我不起作用...似乎它迫使我在执行存储之前进行合并:(branch|MERGING) =&gt; git stash save src/test/java/File.java: needs merge
【解决方案2】:

根据this answer 的类似问题,从 Git 2.23(2019 年第三季度)开始,您可以使用:

git merge --quit

这将:

  • 忘记当前正在进行的合并。
  • 保持索引和工作树不变。

【讨论】:

    【解决方案3】:

    首先,复制您正在使用的文件夹,以防发生不好的事情。 Git 通常是相当防弹的,但如果你开始使用git reset --hard,就有可能发生坏事。

    然后,执行git commit --patch,只选择您想要保留的更改并保留合并所做的所有更改。一旦您提交了这些更改,请执行git reset --hard,合并应该会消失,但您的更改应该仍然存在。

    【讨论】:

    • 它不询问合并的内容。当您收到提交消息时,您只是完成了所有上演的事情。
    • @detly 即使您一开始没有暂存,然后仅使用 git commit --patchgit add --patch 暂存更改,也会发生这种情况?
    【解决方案4】:

    找到了一个经过测试的解决方案:

    1. 将所有当前更改保留在工作目录中,无论是您手动编辑这些文件还是您正在合并中将它们引入
    rm .git/MERGE*
    rm .git/ORIG_HEAD
    

    可能有点危险,因为你基本上是在直接干扰 git 的内部工作,所以可能先备份你的文件夹 :)

    【讨论】:

      【解决方案5】:

      今天发生在我身上,我需要在从开发创建的新分支中与另一个分支的某些更改进行合并...

      我尝试了 Michael Sorens 的解决方案,但它需要额外的步骤...git add . 如果您有一些冲突

      git checkout -b mynewbranchfromdevelop
      git merge AnotherBranchToMergeIntoMynewbranchfromdevelop
      

      它有冲突,我试图做一个 git stash 但出现“需要合并”消息,我要做的就是使用

      git add .
      

      将这些冲突视为已解决和暂存(但仍需要 git commit 来结束合并),然后

      git stash
      

      会将这些更改保存在存储区中,如果您使用“git status”检查,则无需提交任何内容并清理工作树

      git stash apply
      

      您将在当前分支的本地目录中进行这些更改而无需提交

      【讨论】:

        【解决方案6】:

        中止提交

        如果文本编辑器已经打开(写提交信息),关闭它 通常/成功将提交合并(如果没有未合并的路径)。 为避免这种情况,文本编辑器应退出并出现错误(如果需要,请确保 内容首先保存到备份文件)。 If using vim, that can be done with :cq(丢弃所有内容并以错误 1 ​​退出)。对于其他 文本编辑器,一种通用的方法是在任务中终止进程 经理或更直接地与:

        kill -9 EDITOR_PID
        

        背景

        运行git merge后,合并成功的hunks(即: 没有冲突)被添加到索引中。如果有冲突, 受影响的帅哥在工作树中留下了冲突标记和一个 .git/MERGE_HEAD 文件被创建以跟踪您处于 合并。

        所以目标是:

        • 退出合并状态
        • 保持工作树原样
        • 从索引中删除所有更改以匹配工作树(可选)

        首先想到的执行上述所有操作的命令是git reset

        重置

        在保持工作树完整的同时重置索引(包括 冲突标记(如果有),只需运行以下命令就足够了:

        git reset --mixed
        

        或者,或者:

        git reset
        

        这也应该删除文件.git/MERGE_HEAD,这应该会使 git 停止 认为您正在合并中。

        来自git-reset(1)

        git reset [<mode>] [<commit>]
            This form resets the current branch head to <commit> and possibly updates
            the index (resetting it to the tree of <commit>) and the working tree
            depending on <mode>. If <mode> is omitted, defaults to --mixed. The
            <mode> must be one of the following:
        
            --soft
                Does not touch the index file or the working tree at all (but resets
                the head to <commit>, just like all modes do). This leaves all your
                changed files "Changes to be committed", as git status would put it.
        
            --mixed
                Resets the index but not the working tree (i.e., the changed files
                are preserved but not marked for commit) and reports what has not
                been updated. This is the default action.
        

        如上所述,默认的git reset 行为(即:--mixed)是 重置索引中的内容(即:即将提交的内容),但确实如此 不要碰工作树。

        其他方法

        为了完整起见,请注意,如果您愿意,请不要使用 git merge --abort 保持本地更改完好无损,因为它将尝试“重建预合并 状态”。来自git-merge(1)

        第二个语法(“git merge --abort”)只能在合并完成后运行 导致了冲突。 git merge --abort 将中止合并过程并 尝试重建合并前的状态。但是,如果有未提交的 合并开始时的变化(特别是如果这些变化进一步 在合并开始后修改),git merge --abort 在某些情况下会 无法重建原始(合并前)更改。因此:

        警告:运行 git merge 并进行非平凡的未提交更改是 气馁:虽然可能,但它可能会让你处于难以支持的状态 在发生冲突的情况下退出。

        【讨论】:

          【解决方案7】:

          如果您还没有提交合并并且您有合并冲突,您可以使用:

          git merge --abort
          

          或者你可以重置到之前的提交:

          git reset --hard HEAD^
          

          另外,您可以从git reflog 命令获得帮助以查找以前的结帐。 回到之前的状态是好事。

          git reset --hard HEAD@{0}
          

          【讨论】:

            【解决方案8】:

            我想你想将一个分支合并到当前有一些冲突。如果是,请按照以下步骤操作。

            1. 在合并之前,使用git stash 保存您的本地更改。
            2. 使用git merge branch合并分支,然后使用git commit
            3. 然后,使用git stash pop 恢复您的更改。
            4. 第 3 步可能会显示一些冲突,如果有,请解决它们,然后执行git commit

            如果您只想知道如何退出合并过程,请尝试git merge --abort 终止它。希望对你有帮助~~

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-10-25
              • 1970-01-01
              • 2016-08-10
              • 2013-01-21
              • 1970-01-01
              • 2011-06-10
              • 2012-04-28
              • 1970-01-01
              相关资源
              最近更新 更多