撤销合并后再加一个提交重新合并GIT

3

我进行了一次大合并,使用的是IDE(IntelliJ IDEA)。当所有冲突都解决完毕并且有些代码被修改后,我提交了这个合并。然后我注意到还有两个文件没有提交,所以我又进行了一次提交。

有两个问题:

  1. 为什么我需要进行第二次提交?这是因为IDE在合并时不够聪明,错过了“添加”提交吗?如果我在合并后使用命令行忘记将文件添加到索引中,是否会发生这种情况?

  2. 如何撤销这两个提交,以便我可以进行一个纯粹的合并?

像图片一样:

[commit1] <- [megre-commit] <- [before-commit] | (master)

我尝试了 git rebase -i rebase HEAD~2 (只是想要合并两个提交的第一个想法),但是它显示了所有121条提交记录——一个commit1和120个merge-commit。

基本上我想要将我的“丢失/分离的”[commit1] 添加到 [merge-commit] 中并进行一次合并。

更新:

 // revert two commits to have one
 1. git reset --soft HEAD~ 
 2. git revert -m 1 merge-commit
 3. git commit

我期望会再次看到改变,所有那些1+120的提交。但是接下来我该如何合并呢?

 // move my merged stuff into new branch 
 4. git push origin -u new_branch

 // move back on history in master branch
 5. git reset --hard before-commit
 6. git merge new_branch
 7. git push -f origin master 

那么这个 git merge new_branch 将会顺利进行,因为它已经被合并了...所以可能不能真实地显示从哪里合并的历史记录...但至少最终结果应该是相同的。理论上来说。


孩子们,这就是为什么使用IDE的Git集成始终存在风险,而使用CLI几乎总是更好的原因。如果您还没有推送提交,您可能可以通过交互式变基将提交压缩在一起。但是,请确保它适用于合并提交,因为我不确定。 - Madara's Ghost
IDE很搭配合并,所以我可以看到漂亮的图片,了解了哪些内容发生了变化。 - ses
我在使用任何Git GUI时都遵循“看,不要碰”的原则。 - Madara's Ghost
2个回答

1

您在一篇帖子中有许多问题。

为什么您最终使用了第二个提交?很可能是因为IntelliJ的git插件的怪癖。它不能很好地区分暂存区和工作区,如果您在解决冲突后编辑合并的文件,则可能导致像您这样的情况。没有什么危险,只是在将更改推送到上游之前需要额外小心。除非它们非常琐碎,否则使用IDE解决冲突仍然更方便。

至于修复,您尝试进行交互式变基的第一次尝试是正确的。我不确定您在示例中提到的第二个rebase是什么,但git rebase -i HEAD~2应该向您显示最近的两个提交,您可以将最后一个提交压缩到第一个提交中。

另一个选项可能是git reset HEAD^ && git commit --amend,本质上是相同的。


听起来没错,我只记得使用 git rebase -i HEAD~2 命令可以显示出那个合并提交的许多提交记录。我会在真实项目中尝试一下。 - ses

0

我已经检查了一个简单的演示。

是的,确实IDE / IntelliJ Idea的工作方式是合并,但是一旦你在Merge Tool中完成编辑,然后在主代码编辑器中(尚未提交任何内容)保持代码更改,然后从UI /更改列表进行提交-它将进行第一次提交(合并本身),但某些文件将留在更改列表中。因此,您可以将它们作为单独的提交进行提交。 (那就是我所做的..)

因此,要从命令行解决问题。

可能有点笨拙

git reset --soft HEAD~1   // revert left-over commit 
git stash                 // safe left-over commit to stas
git reset --soft HEAD~1   (get back merged content from merge-commit)

 git stash pop           // get stased


then during conflct accept all from stashed (since we know that those changes were made on top. so noew we have comined content from merge commit and that extra commit)

git commt -m "merged stuff'   // left over of first commit

那么,只要有一个提交..我可以将其合并到任何我想要的地方。

就像我本应该拥有的“合并”一样:

git checkout newone -b master 
git reset --hard HEAD~1

git checkout master 
git reset --hard HEAD~1

git merge newone // accepting all changes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接