2015-11-21 155 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