哎呀,我想要撤消合并。
我创建了一个新的分支new_branch
。我在这个分支上做了一些工作,并且(为了在文件同步上进行备份)使用临时提交进行了检查。
然后我回到master
分支,并做了大约12次提交。
然后我回到new_branch
,不假思索地跑了:
git merge master
现在我在这个分支上的历史看起来像这样:
- master commit 1
- master commit 2
- master commit 3
...
- work in progress
我想与master合并,撤消正在进行的工作提交,然后重新合并master。最终我想结束,所以我在这个分支上的历史就是这样:
- master commit 1
- master commit 2
- master commit 3
...
- master commit 12
而不是正在进行的工作'提交,我在暂存时有一堆已更改的文件。
这可能吗?如果是这样,怎么样?
答案 0 :(得分:0)
假设您没有推送合并或“临时提交”,请执行以下操作(在new_branch
上时):
git reset --hard head~ #undoes the merge
git reset --soft head~ #undoes the temp commit, but leaves the commit's content in the index
git stash #stashes your work in progress from the temp commit
git merge master
git stash pop
您可能希望首先使用git tag temp_tag
标记HEAD,以防这些步骤不能完全符合您的要求,这样您就不会失去任何工作。
编辑:请注意,如果您对步骤(先提交临时提交,然后合并)的描述正确,则适用这些说明;您提供的分支历史记录似乎暗示合并发生在临时提交之前。
答案 1 :(得分:0)
如果我理解正确,只有new_branch
代码已经生效?而且您不希望保留正在进行中的代码?你希望new_branch
成为最新大师的新副本吗?
在这种情况下,只需删除分支并重新创建它可能是最简单的解决方案......
但是,让我们回答你的问题,以防我误解或你感兴趣。
通常,要重置提交,您需要在要撤消的提交之前找到提交。在这种情况下,我假设这是主提交12。
然后运行git reset --hard master_commit_12_sha
如果您不想找到sha(标识提交的一系列数字),您也可以从头部向后计数。
git reset --hard HEAD~1
现在,我不认为你是在问这个问题,但如果问题是这样的话:
- master commit 1
- master commit 2
- 的 mistake_commit 强>
- 主提交3 ...
- master commit 12
在这种情况下,你可以:
git rebase -i <master commit 2>^
,然后在交互式rebase中选择&#34;删除&#34; the wrong_commit。git revert mistake_commit
,它将生成一个新的提交,撤消在wrong_commit中所做的更改。 注意:如果已经推送到原点,此选项可能是最佳选择,因为它不会更改历史记录。以下是一些链接,可以阅读我刚才所说的内容:
答案 2 :(得分:0)
为了使其简单适用于您的情况:
<your repo root>git log
这将列出从头部(屏幕顶部)到分支的开始提交的当前分支。
查找并复制sha的一部分,表示您希望分支返回的位置。 (为了安全起见,并且作为一个好习惯,将“git log”输出的大部分剪切并粘贴到文本文件中作为备份。)
<your repo root>git reset --hard <paste the copied sha portion here>
中提琴。