【发布时间】:2016-01-21 01:47:17
【问题描述】:
我启动了一个 git 合并,但做了一些我想保留的本地更改。我不再想合并,而是继续处理本地更改。我该怎么做?
【问题讨论】:
-
您正在解决冲突,对吧?
-
如果您处于合并冲突状态,请尝试
$ git merge --abort。
标签: git
我启动了一个 git 合并,但做了一些我想保留的本地更改。我不再想合并,而是继续处理本地更改。我该怎么做?
【问题讨论】:
$ git merge --abort。
标签: git
语言是出了名的模棱两可。 :-) 当您说“保留本地更改”时,您的意思可能是:
这个简单的解决方案解决了第(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
【讨论】:
(branch|MERGING) => git stash save src/test/java/File.java: needs merge
【讨论】:
首先,复制您正在使用的文件夹,以防发生不好的事情。 Git 通常是相当防弹的,但如果你开始使用git reset --hard,就有可能发生坏事。
然后,执行git commit --patch,只选择您想要保留的更改并保留合并所做的所有更改。一旦您提交了这些更改,请执行git reset --hard,合并应该会消失,但您的更改应该仍然存在。
【讨论】:
git commit --patch 或 git add --patch 暂存更改,也会发生这种情况?
找到了一个经过测试的解决方案:
rm .git/MERGE*
rm .git/ORIG_HEAD
可能有点危险,因为你基本上是在直接干扰 git 的内部工作,所以可能先备份你的文件夹 :)
【讨论】:
今天发生在我身上,我需要在从开发创建的新分支中与另一个分支的某些更改进行合并...
我尝试了 Michael Sorens 的解决方案,但它需要额外的步骤...git add . 如果您有一些冲突
git checkout -b mynewbranchfromdevelop
git merge AnotherBranchToMergeIntoMynewbranchfromdevelop
它有冲突,我试图做一个 git stash 但出现“需要合并”消息,我要做的就是使用
git add .
将这些冲突视为已解决和暂存(但仍需要 git commit 来结束合并),然后
git stash
会将这些更改保存在存储区中,如果您使用“git status”检查,则无需提交任何内容并清理工作树
git stash apply
您将在当前分支的本地目录中进行这些更改而无需提交
【讨论】:
如果文本编辑器已经打开(写提交信息),关闭它
通常/成功将提交合并(如果没有未合并的路径)。
为避免这种情况,文本编辑器应退出并出现错误(如果需要,请确保
内容首先保存到备份文件)。 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 并进行非平凡的未提交更改是 气馁:虽然可能,但它可能会让你处于难以支持的状态 在发生冲突的情况下退出。
【讨论】:
如果您还没有提交合并并且您有合并冲突,您可以使用:
git merge --abort
或者你可以重置到之前的提交:
git reset --hard HEAD^
另外,您可以从git reflog 命令获得帮助以查找以前的结帐。
回到之前的状态是好事。
git reset --hard HEAD@{0}
【讨论】:
我想你想将一个分支合并到当前有一些冲突。如果是,请按照以下步骤操作。
git stash 保存您的本地更改。git merge branch合并分支,然后使用git commit。git stash pop 恢复您的更改。git commit。如果您只想知道如何退出合并过程,请尝试git merge --abort 终止它。希望对你有帮助~~
【讨论】: