合並分支後,發現合並錯了分支。 master上還沒有提交任何東西,想取消這次合並,讓分支回到位,腫麼辦?
好在現在還沒commit另外的內容,如果不小心commit了,那又該怎麼辦啊?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
git 到底是個多麼奇葩的管理工具,一個問題能有這麼多解釋,一眼還不出來那個是對的。 http://git-scm.com/blog/2010/03/02/undoing-merges.html 這是官方的解答,我待看完,在此翻譯一下。
======================簡單翻譯開始====================
由於太多人問怎麼撤銷 merge 了,於是 git 官方出了這份教程,表示在 git 現有的思想體系下怎麼達到撤銷 merge 的目標。
方法一,reset 到 merge 前的版本,然後再重做接下來的操作,要求每個合作者都曉得怎麼將本地的 HEAD 都回滾回去:
$ git checkout 【行merge操作时所在的分支】 $ git reset --hard 【merge前的版本号】
方法二,當 merge 以後還有別的操作和改動時,git 正好也有辦法能撤銷 merge,用 git revert:
$ git revert -m 【要撤销的那条merge线的编号,从1开始计算(怎么看哪条线是几啊?)】 【merge前的版本号】 Finished one revert. [master 88edd6d] Revert "Merge branch 'jk/post-checkout'" 1 files changed, 0 insertions(+), 2 deletions(-)
這樣會創建新的 commit 來抵消對應的 merge 操作,而且以後 git merge 【那個編號所代表的分支】 會提示:
Already up-to-date.
因為使用方法二會讓 git 誤以為這個分支的東西都是咱們不想要的。
方法三,怎麼撤銷方法二:
$ git revert 【方法二撤销merge时提交的commit的版本号,这里是88edd6d】 Finished one revert. [master 268e243] Revert "Revert "Merge branch 'jk/post-checkout'"" 1 files changed, 2 insertions(+), 0 deletions(-)
這樣就行了,可以正常 merge 了,不過可能會有很多衝突噢! !
$ git merge jk/post-checkout Auto-merging test.txt Merge made by recursive. test.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
=====================簡單翻譯結束====================
最後的最後,還是覺得頂上那些都麻煩爆了。前端天天用 WebStorm 寫程式碼的看過來: WebStorm 右鍵點選專案檔案或資料夾,有一個:
Local History -> Show History
點開後出現一個窗口,可以看到所有的本地改動。找到合適的那份,按左上角那個:
Revert
按鈕,也就是個紫色的彎曲的小箭頭就回去了。在文件量不大的時候十分管用,強烈推薦。
如果確定放棄這次合併的提交,假如是 merge 了錯誤的分支到 master,先通過 git reflog 或者 gitg、gitk、qgit 等工具确定你 merge 之前 master 所在的 commit,然后在 master 分支上使用 git reset --hard <commit> 重置头指针。一般来说,在 master 上直接执行 git reset --hard HEAD~ 也可以回到合并之前的提交,但 git reset --hard 命令还是使用确定的 commit 为好。注意,git reset --hard 命令有风险,除非十分确定要放弃当前提交,否则最好先 git branch 為當前的提交建立個新的分支引用後再繼續,待確定無誤後刪除即可。
git reflog
git reset --hard <commit>
git reset --hard HEAD~
git reset --hard
git branch
如果錯誤的合併之後又有了新的提交,可以在完成前述正確的合併之後,通過 git rebase --onto <错误的合并提交> <正确的合并提交> <新提交所在分支> 来在正确的合并提交上重建新的提交。git rebase --onto 命令所重建的提交序列最好是线性的,否则非线性的提交会变成线性的。若需要保存非线性的提交历史,可以考虑使用 --preserve-merges 參數,不過結果很不可靠,具體視提交的非線性程度而定。
git rebase --onto <错误的合并提交> <正确的合并提交> <新提交所在分支>
git rebase --onto
--preserve-merges
B-R-A-N-C-H / --Merge M-A-S-T-E-R----M
你用git reset --hard R的雜湊值, 退回到R就 可以了。 從 Merge過後的M 退到R。
我想這裡應該是需要 git merge --abort 吧
合併時遇到衝突想取消操作,恢復index,用git merge --abort git reset --hard 可以回退到某個提交 git revert可以撤銷某個提交,撤銷會產生一個新的提交
git rebase還木有仔細研究過。
http://opensource.apple.com/source/Git/Git-26/src/git-htmldocs/howto/revert-a-faulty-merge.txt
哪位有空將它翻譯一下。
git 到底是個多麼奇葩的管理工具,一個問題能有這麼多解釋,一眼還不出來那個是對的。
http://git-scm.com/blog/2010/03/02/undoing-merges.html 這是官方的解答,我待看完,在此翻譯一下。
======================簡單翻譯開始====================
由於太多人問怎麼撤銷 merge 了,於是 git 官方出了這份教程,表示在 git 現有的思想體系下怎麼達到撤銷 merge 的目標。
方法一,reset 到 merge 前的版本,然後再重做接下來的操作,要求每個合作者都曉得怎麼將本地的 HEAD 都回滾回去:
方法二,當 merge 以後還有別的操作和改動時,git 正好也有辦法能撤銷 merge,用 git revert:
這樣會創建新的 commit 來抵消對應的 merge 操作,而且以後 git merge 【那個編號所代表的分支】 會提示:
因為使用方法二會讓 git 誤以為這個分支的東西都是咱們不想要的。
方法三,怎麼撤銷方法二:
這樣就行了,可以正常 merge 了,不過可能會有很多衝突噢! !
=====================簡單翻譯結束====================
最後的最後,還是覺得頂上那些都麻煩爆了。前端天天用 WebStorm 寫程式碼的看過來: WebStorm 右鍵點選專案檔案或資料夾,有一個:
Local History -> Show History
點開後出現一個窗口,可以看到所有的本地改動。找到合適的那份,按左上角那個:
Revert
按鈕,也就是個紫色的彎曲的小箭頭就回去了。在文件量不大的時候十分管用,強烈推薦。
如果確定放棄這次合併的提交,假如是 merge 了錯誤的分支到 master,先通過
git reflog
或者 gitg、gitk、qgit 等工具确定你 merge 之前 master 所在的 commit,然后在 master 分支上使用git reset --hard <commit>
重置头指针。一般来说,在 master 上直接执行git reset --hard HEAD~
也可以回到合并之前的提交,但git reset --hard
命令还是使用确定的 commit 为好。注意,git reset --hard
命令有风险,除非十分确定要放弃当前提交,否则最好先git branch
為當前的提交建立個新的分支引用後再繼續,待確定無誤後刪除即可。如果錯誤的合併之後又有了新的提交,可以在完成前述正確的合併之後,通過
git rebase --onto <错误的合并提交> <正确的合并提交> <新提交所在分支>
来在正确的合并提交上重建新的提交。git rebase --onto
命令所重建的提交序列最好是线性的,否则非线性的提交会变成线性的。若需要保存非线性的提交历史,可以考虑使用--preserve-merges
參數,不過結果很不可靠,具體視提交的非線性程度而定。B-R-A-N-C-H
/ --Merge
M-A-S-T-E-R----M
你用git reset --hard R的雜湊值, 退回到R就 可以了。 從 Merge過後的M 退到R。
我想這裡應該是需要 git merge --abort 吧
合併時遇到衝突想取消操作,恢復index,用git merge --abort
git reset --hard 可以回退到某個提交
git revert可以撤銷某個提交,撤銷會產生一個新的提交
git rebase還木有仔細研究過。
http://opensource.apple.com/source/Git/Git-26/src/git-htmldocs/howto/revert-a-faulty-merge.txt
哪位有空將它翻譯一下。