一、開門見山
解決辦法
法一:git reset --merge merge前的任何一次提交的hash串
注1:
- 如果工作區在merge之后沒有任何改動,大膽的用此方法。
- 如果工作區在merge之后有了改動,那么此方法會重置工作區的一切修改,慎用。但是會保留暫存區的改動。
注2:當MERGE_HEAD 在當前的提交上的時候 (就是當合并分支時遇到錯誤或者沖突,分支旁邊會多出“|MERGING”這個東西)git merge --abort
與此方法一樣
法二:
git reset merge前的任何一次提交的hash串
git clean -n #預刪除
#將預刪除不想刪除的文件加入.gitignore
git add .gitignore
git clean -f
二、構造環境
約定:遠程倉庫 URL 使用 remote url
代替
1、模擬開發者一號
mkdir gitTest #新增文件夾gitTest
cd gitTest
git init
git remote add origin "remote url"
echo "長太息以掩涕兮, 哀民生之多艱。" > lyrics.txt #新建 lyrics.txt 并在里面寫入文字
git add lyrics.txt #將 lyrics.txt加入暫存區
git commit -m "lyrics.txt from user 1"
git push origin master
git checkout -b dev
git push origin dev:dev
2、模擬開發者二號
mkdir gitTest2
cd gitTest2
git clone "remote url"
cd gitTest
echo "Don't make me suffer" > Suffer.txt
git add Suffer.txt
git commit -m "Suffer.txt from user2"
git push origin dev
3、模擬開發者一號
git checkout master
git merge origin/dev #合并遠程dev分支
echo "余雖好修姱以鞿羈兮, 謇朝誶而夕替。" >> lyrics.txt #修改文件 lyrics.txt
echo "余雖好修姱以鞿羈兮, 謇朝誶而夕替。" > test.txt #新建test并寫入內容
git add test.txt #將 test.txt 加入暫存區
三、撤銷 merge
開發者一號面臨的情況:本地master合并了遠程dev的內容,本地多了一個Suffer.txt的文件。但是發現合錯了分支,要撤銷剛剛的合并操作。但是本地文件又有改動。
-
查看當前本地文件
ls
-
查看工作區和版本庫的區別
git diff HEAD
- 查看提交歷史
git log --oneline --graph
驗證法一
撤回 merge
git reset --merge 7f811bf
或執行git reset --merge HEAD^
HEAD^此例中是7f811bf,上面提交歷史可看到7f811bf就是merge前提交的hash串-
查看本地文件
ls
并查看文件內容
-
再次查看提交記錄
git log --oneline --graph
-
查看
- 工作區和暫存區的區別
git diff
- 工作區和版本庫的區別
git diff HEAD
- 暫存區和版本庫的區別
git diff --cached
- 工作區和暫存區的區別
最終結果: 本地文件改動都被重置了(即開發者一號merge后增加的--余雖好修姱以鞿羈兮, 謇朝誶而夕替,被刪除了),但暫存區還有內容。故工作區merge 后有改動慎用
驗證法二
撤回 merge
git reset 7f811bf
-
再次查看當前本地文件
ls
-
再次查看提交記錄
git log --oneline --graph
階段結果:很明顯可以看到,merge已經回滾了,但是本地合并過來的文件依然還在。還要將多余合并的文件(Suffer.txt)刪除。
- 在刪除之前可以先看看執行刪除操作會刪掉那些內容(預刪除)
git clean -n
注意:這里看到本地原來的文件 test.txt 也將被刪除,這不是我所期望的。我只希望可以刪除 meger 的文件。
將 test.txt 文件加入 .gitignore 再執行預刪除
echo test.txt > .gitignore
git add .gitignore
git clean -n
階段結果:可以看到將會被刪除的文件只剩下 merge 的多余文件了。
- 執行 刪除操作
git clean -f
- 最終結果: