在git中撤消提交,然后重新合并?

时间:2016-02-08 18:11:14

标签: git

哎呀,我想要撤消合并。

我创建了一个新的分支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 

而不是正在进行的工作'提交,我在暂存时有一堆已更改的文件。

这可能吗?如果是这样,怎么样?

3 个答案:

答案 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>

中提琴。