Git还原合并加上一个提交在顶部再次重新合并

时间:2015-11-21 13:34:00

标签: git intellij-idea merge git-revert

我从ide(intellij idea)做了很大的合并,所以当所有冲突都解决了,som代码被修改了,我确实提交了(合并一个),然后注意到有两个文件正在重新提交。所以我又做了一次。

有两个问题:

  1. 为什么我有第二次提交。那是因为IDE不知何故错过了added提交合并(ide不聪明,需要在一次合并的上下文中看到所有这些变化吗?)。如果我忘记add文件到index,如果我在合并后使用命令行(?)

  2. ,会发生什么?
  3. 如何恢复这两个提交以便我可以进行一次纯合并?

  4. 喜欢图片:

      

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

    我尝试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会没有任何冲突,因为我已经合并了..所以这可能不会显示真正的(hi)故事从它合并的地方......但至少最终结果应该是相同的。理论上

2 个答案:

答案 0 :(得分:1)

你在一篇文章中有很多问题。

为什么你最终得到了第二次提交?很可能是因为IntelliJ的git插件的怪癖。它并没有很好地区分分段和工作区域,如果在分辨率之后编辑合并文件,这可能会导致像你这样的情况。没有什么危险,只需要在上游推动变更之前要格外小心。除非它们非常简单,否则解决与IDE的冲突仍然更方便。

至于修复,你第一次尝试进行交互式改造是朝着正确的方向发展的。我不确定你的例子中你指的是第二个rebase是什么,但是git rebase -i HEAD~2应该显示你最后两次提交,你可以将最后一个压缩到第一个。

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

答案 1 :(得分:0)

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

所以是的,确实是IDE / IntelliJ Idea的工作方式 - 它确实合并了,但是一旦你在Merge Tool中进行了编辑,然后在主代码编辑器中进行了编辑(还没有提交任何东西),就保持代码的转换,然后从UI提交/ change-list - 它将首先提交(合并本身),但是一些文件将保留在更改列表中。那么你可以将它们作为sepparate commit提交。 (那是我做过的..)

所以要从命令行解决问题。

也许有点笨拙

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