在我的主分支中,我做了一个 git merge some-other-branch
本地,但从未将更改推送到原始主人。我不是故意合并,所以我想撤消它。做的时候 git status
合并后,我收到了这条消息:
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
基于一些 我发现的说明,我试过跑步
git revert HEAD -m 1
但现在我收到了这条消息 git status
:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
我不希望我的分支机构通过任意数量的提交领先。我该如何回到这一点?
同 git reflog
在合并之前检查哪个提交是一个(git reflog将是比git log更好的选项)。然后你可以使用以下方法重置它
git reset --hard commit_sha
还有另一种方式
git reset --hard HEAD~1
会让你回来1提交。
请注意,任何已修改和未提交/未缓存的文件都将重置为未修改状态。保持他们要么隐藏变化或看到 --merge
选项如下。
正如@Velmont在他的回答中所建议的那样,在这个直接案例中使用:
git reset --hard ORIG_HEAD
可能会产生更好的结果,因为它应该保留您的更改。 ORIG_HEAD
将在合并发生之前直接指向提交,因此您不必自己寻找它。
进一步的提示是使用 --merge
切换而不是 --hard
因为它不会不必要地重置文件:
- 合并
重置索引并更新工作树中<commit>和HEAD之间不同的文件,但保留索引和工作树之间不同的文件(即具有尚未添加的更改)。
假设您的本地主人不在原点/主人之前,您应该能够做到
git reset --hard origin/master
那你当地的 master
分支应该看起来相同 origin/master
。
看到 Git书中的第4章 和 Linus Torvalds的原帖。
撤消合并 那已经被推了:
git revert -m 1 commit_hash
如果你再次提交分支,请确保恢复恢复,如Linus所说。
奇怪的是,最简单的命令丢失了。大多数答案都有效,但撤消了刚才的合并, 这是简单而安全的方式:
git reset --merge ORIG_HEAD
裁判 ORIG_HEAD
将指向合并之前的原始提交。
(该 --merge
选项与合并无关。就像 git reset --hard ORIG_HEAD
,但更安全,因为它不会触及未提交的更改。)
对于较新的Git版本,如果您还没有提交合并 你有一个合并冲突,你可以简单地做:
git merge --abort
从 man git merge
:
[此]只能在合并导致冲突后运行。 git merge --abort
将中止合并过程并尝试重建合并前状态。
您应该重置为上一次提交。这应该工作:
git reset --hard HEAD^
甚至 HEAD^^
还原该还原提交。如果您不确定应该采取多少步骤,则始终可以提供完整的SHA参考。
如果您遇到问题且主分支没有任何本地更改,您可以重置为 origin/master
。
最近,我一直在使用 git reflog
帮助解决这个问题。这大部分仅在合并刚刚发生时才有效,并且它在你的机器上。
git reflog
可能会返回如下内容:
fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting
第一行表示发生了合并。第二行是我合并之前的时间。我只是 git reset --hard 43b6032
强制此分支在合并之前进行跟踪,并随身携带。
使用现代Git,您可以:
git merge --abort
较旧的语法:
git reset --merge
老套:
git reset --hard
但实际上,值得注意的是 git merge --abort
只相当于 git reset --merge
鉴于 MERGE_HEAD
存在。这可以在Git help for merge命令中读取。
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
合并失败后,什么时候没有 MERGE_HEAD
,失败的合并可以撤消 git reset --merge
,但不一定是 git merge --abort
, 所以他们不仅是同一件事的新旧语法。
我个人觉得 git reset --merge
在日常工作中更加强大和有用,所以这是我一直使用的。
好吧,这里给我的其他人的答案很接近,但是没有用。这就是我做的。
这样做......
git reset --hard HEAD^
git status
......给了我以下状态。
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
然后我不得不输入相同的内容 git reset
多次命令。每次我这样做,消息都会被改变,如下所示。
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
此时,我看到状态消息已更改,所以我尝试了一个 git pull
,这似乎工作:
> git pull
Updating 2df6af4..12bbd2f
Fast forward
app/views/truncated | 9 ++++++---
app/views/truncated | 13 +++++++++++++
app/views/truncated | 2 +-
3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master
长话短说,我的命令归结为:
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
你可以用 git reflog
找到以前的结帐。有时这是一个你想要回归的好状态。
具体而言,
$ git reflog
$ git reset --hard HEAD@{0}