我已经读到做git reset commitBeforeDoingMerge --hard不会撤消合并:
1pm-3pm This is my branch and I need to merge master into it
1pm-2pm This was master
1pm-2pm-3pm-4pm Merging ended up doing this, 4pm being the merge commit
1pm-2pm-3pm if This is the result if you do git reset 3pm --hard, because it does not undo the merge, it just goes back to that commit in the branch that was merged.
现在,另一个建议是执行git revert 4pm -m 1,但是根据manual,这是有问题的:
通常您无法还原合并,因为您不知道哪一方 合并的内容应视为主线。此选项指定 主线的父编号(从1开始),并允许还原 相对于指定的父项撤消更改。
还原合并提交声明您将永远不需要树 合并带来的更改。因此,以后的合并只会 引入由非祖先提交引起的树更改 先前还原的合并。这可能是您想要的,也可能不是。
那么,有没有一种方法可以轻松便捷地撤消git merge?
答案 0 :(得分:0)
重设应该有效,但在主机上重设为e:
合并后:
a-b-d (mybranch)
\
c-e (master)
从myBranch
到master的合并应该给出:
a-b---d (mybranch)
\ \
c-e-f (master)
没有分支列出abcdef,ony abcef(主)
如果您在reset --hard e
期间master
,您将获得原始历史记录(上面的第一个记录)
如果您reset --hard d
在使用master时,您已经移动了master HEAD,但是合并仍然存在:
a-b---d (mybranch, master)
\ \
c-e-f
答案 1 :(得分:0)
我已经读到做git reset commitBeforeDoingMerge --hard不会撤消合并
无论您读到什么,那都是错误的。这正是撤消合并的方法。
假设您正在将branch
合并到master
中。所以我们在合并之前就拥有了这个:
A -- B -- C (master)
\
X -- Y (branch)
好的,所以我们git checkout master
和git merge branch
。结果是:
A -- B -- C -- D (master)
\ |
X -- Y (branch)
...其中D是合并提交,C和Y作为其父项。
如果您现在说git reset --hard <SHA-of-C>
,您将回到此状态:
A -- B -- C (master)
\
X -- Y (branch)
这是一个完美的撤消。
答案 2 :(得分:0)
我仍然不确定您在做什么,但这不是git merge
的工作方式。我将尝试重新创建您所做的事情,也许您可以发现差异。
首先,我创建了两个起始分支:
git log --oneline --graph --all
* 0593ba1 (HEAD -> test) 3pm
| * eba415c (master) 2pm
|/
* 7f9a804 1pm
将主机合并到测试中。
git merge master -m "4pm"
git log --oneline --graph --all
* 6be609f (HEAD -> test) 4pm
|\
| * eba415c (master) 2pm
* | 0593ba1 3pm
|/
* 7f9a804 1pm
现在我们将测试重置为下午3点
git reset --hard 0593ba1
HEAD is now at 0593ba1 3pm
git log --oneline --graph --all
* 0593ba1 (HEAD -> test) 3pm
| * eba415c (master) 2pm
|/
* 7f9a804 1pm
现在我们看到2pm提交仅在master中,以确认唯一测试的日志
git log --oneline
0593ba1 (HEAD -> test) 3pm
7f9a804 1pm
这就是我合并和撤消合并的方式,请随时让我知道您在做什么,或者我还没有重新创建您的示例,您将如何做。