2015-11-21 248 views
2

我做了巨大的合并,从ide(intellij想法),所以当所有的冲突解决,并且som代码被修改,我做了提交(合并) ,然后注意到有两个文件正在重新提交。所以我再次承诺。Git恢复合并,再加上一个提交重新合并

有两种questionss:

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

  2. 如何恢复这两个提交以便我可以执行一个纯合并?

像图:

[commit1] < - [megre提交] < - [前提交] | (主)

我试图git rebase -i rebase HEAD~2(只是最初的想法到两次提交合并),但显示所有121个commists - 一个commit1和合并提交120。

基本上我想将[lost] /'detached'[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 

那么这个混帐合并new_branch会去没有任何冲突,因为我alredy被合并..所以可能不会显示从那里它是从真正的合并(HI)的故事..但至少最终的结果应该是一样的。理论上。

+0

这孩子,这就是为什么使用IDE的Git的整合永远是您自己的风险,以及为什么使用CLI几乎总是首选。你**可能能够通过交互式底图来压缩提交(如果你还没有推送提交)。但是,请确保它适用于合并提交,因为我不确定。 –

+0

IDE刚好适合合并,所以我看到了不错的图片,改变了什么以及如何改变。 – ses

+0

我遵循任何Git GUI的“look,do not touch”规则。 –

回答

1

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

为什么你结束了第二次提交?很可能是因为IntelliJ的git插件的怪癖。它不能很好地区分分期和工作区域,如果您在解决方案后编辑合并文件,这可能会导致类似您的情况。没有危险,只是在向上游推送您的更改之前要格外小心。除非它们非常微不足道,否则解决与IDE的冲突仍然更为方便。

至于修复,你第一次尝试做一个交互式基础是正确的方向。我不确定在你的例子中你指的第二个rebase是什么,但git rebase -i HEAD~2应该向你展示了最后两个提交,你可以在这里提供最后一个提交。

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

+0

这听起来正确我只记得用git rebase -i HEAD〜2向我展示了来自该合并提交的许多提交。我会在真正的项目上尝试它。 – ses

0

我检查过简单的演示。

所以,的确,IDE/IntelliJ Idea的工作方式 - 它会合并,但是一旦您在该合并工具中完成编辑,然后在主代码编辑器(尚未提交任何内容)中继续修改代码, UI /更改列表 - 它将首先提交(合并本身),但有些文件将保留在更改列表中。那么你可以将它们提交为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