git merge 撤销 同时清除 merge 的本地文件

一、开门见山

法一: git reset --merge merge前的任何一次提交的hash串
  • 如果工作区在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

  • 撤回 merge git reset --merge 7f811bf 或执行git reset --merge HEAD^
    HEAD^此例中是7f811bf,上面提交历史可看到7f811bf就是merge前提交的hash串

  • 查看本地文件 ls 并查看文件内容

    最终结果: 本地文件改动都被重置了(即开发者一号merge后增加的--余虽好修姱以鞿羁兮, 謇朝谇而夕替,被删除了),但暂存区还有内容。故工作区merge 后有改动慎用

  • 撤回 merge git reset 7f811bf

  • 再次查看当前本地文件 ls

  • 注意:这里看到本地原来的文件 test.txt 也将被删除,这不是我所期望的。我只希望可以删除 meger 的文件。

  • 将 test.txt 文件加入 .gitignore 再执行预删除

  • echo test.txt > .gitignore
    git add .gitignore
    git clean -n