Git常见问题-如何放弃本地修改

2024/04/20 | 字数869 | 阅读2分钟


当我们在说放弃本地修改(注意:这里指还没有push到远端仓库)的时候,我们是在说如下几种场景:

  1. 只在工作区中做了修改
    • 如果需要全部撤销:git reset --hard HEAD
    • 如果只撤销个别文件:git checkout <file1>
  2. 在工作区中修改了,并且添加到了暂存区,但还没有commit
    • 先从暂存区中剔除:git reset <file>
    • 再按照场景1中的方法继续处理
  3. 已经执行commit操作
    • 先将撤销最近一次commit:git reset HEAD^
    • 然后按照场景1中的方法继续处理
  4. 已经commit了两次,但第一次有问题,第二次没问题(这个比较麻烦), 有3种方案可选:
    • 方案1:在最新的版本上修改掉问题,再commit一次;这样在历史记录中会有一个错误的commit;
    • 方案2:回退这两个修改,修改后,整合成一个commit提交;
      • 先保存之前的两个修改:git format-patch HEAD^^,备份用,修改完成后就删掉;
      • 先回退到两个版本之前:git reset HEAD^^,这个命令会将HEAD回退到两个版本之前,但工作区中的内容还是最新版本,也就是说,现在工作区中的文件是两次修改的总和。
      • 在此基础上修改问题,然后执行git commit提交到本地仓库;这样的好处是提交记录是干净的。坏处是,提交不够原子性。
    • 方案3:保存2个修改的patch,回退版本到修改前,逐个打patch,在过程中根据需要,修改其中的问题。
      • 先保存之前的两个修改:git format-patch HEAD^^,备份用,修改完成后就删掉;
      • 先回退到两个版本之前:git reset --hard HEAD^^
      • 逐个打patch
        • 第一个patch:git apply 0001-xxxx.patch,然后修改问题,之后执行git commit
        • 第二个patch:git am 0002-xxx.patch

          注意这里第一个命令用的git apply命令,这个命令不会直接生成一个commit,第二个用的git am命令,这个会直接生成commit;这刚好是我们需要的结果。同时,这个方案也有局限性,就是在两次修改了同一个文件的时候,可能会出现冲突,需要手动修复。

关于场景4中:

上一篇:Git使用-极简工作流 下一篇:Git常见问题-提交了一个垃圾文件怎么办

【文章不错,鼓励一下】