• Git 系列教程(7)- 撤销操作


    撤销操作

    • 在任何一个阶段,你都有可能想要撤销某些操作
    • 有些撤销操作是不可逆的

    --amend 修补提交

    有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,就可以运行带有 --amend 选项的提交命令来重新提交

    git commit --amend

    会再次提交暂存区的内容,但会覆盖最后一次提交的信息

    git commit -m 'initial commit'
    git add forgotten_file
    git commit --amend -m "second commit" 
    • 最终只会有一个提交历史,第二次提交将代替第一次提交的结果
    • 如果查看提交历史 git log,只会发现第二次提交的 second commit,而不会出现第一次提交的 initial commit
    • 优势:可以稍微改进最新的提交信息,而不会打乱代码仓库的提交历史,每修改一小块就提交一次,提交历史就会特别臃肿

    取消暂存的文件

    目前我用最新版的 git(2.31.1) ,它会提示用 git restore 来取消暂存,但是官方文档会用 git reset

    • git restore
    • git reset

    restore

    polo@B-J5D1MD6R-2312 watermarker % git add .
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        删除:     test1.txt
        删除:     ttrtt.txt

    执行 git restore

    polo@B-J5D1MD6R-2312 watermarker % git restore --staged test1.txt
    polo@B-J5D1MD6R-2312 watermarker % ls
    README.md    font        markers.py    test.py        venv
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        删除:     ttrtt.txt
    
    尚未暂存以备提交的变更:
      (使用 "git add/rm <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
        删除:     test1.txt

    这里未追踪的文件还能继续使用 git restore,会直接丢弃之前的改动,比如这里是删除文件,执行后它会恢复文件

    polo@B-J5D1MD6R-2312 watermarker % git restore test1.txt
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        删除:     ttrtt.txt
    
    polo@B-J5D1MD6R-2312 watermarker % ls
    README.md    font        markers.py    test.py        test1.txt    venv

    可以看到上面的 ls 和下面的 ls 对比,很明显 test1.txt 回来了

    reset

    git reset HEAD <文件名>

    具体栗子

    olo@B-J5D1MD6R-2312 watermarker % git add .
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        删除:     test1.txt
        删除:     ttrtt.txt
    
    polo@B-J5D1MD6R-2312 watermarker % git reset HEAD test1.txt
    重置后取消暂存的变更:
    D    test1.txt
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        删除:     ttrtt.txt
    
    尚未暂存以备提交的变更:
      (使用 "git add/rm <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
        删除:     test1.txt

    能看到 test1.txt 已经撤销暂存区了

    reset 同时撤销所有暂存区的提交

    git reset 

    高危操作,不加任何参数,直接把所有提交都撤销

    具体栗子

    polo@B-J5D1MD6R-2312 watermarker % git add .
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        重命名:   test1.txt -> test22.txt
        重命名:   ttrtt.txt -> test3.txt
        新文件:   testt.txt
    
    polo@B-J5D1MD6R-2312 watermarker % git reset
    重置后取消暂存的变更:
    D    test1.txt
    D    ttrtt.txt
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    尚未暂存以备提交的变更:
      (使用 "git add/rm <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
        删除:     test1.txt
        删除:     ttrtt.txt
    
    未跟踪的文件:
      (使用 "git add <文件>..." 以包含要提交的内容)
        test22.txt
        test3.txt
        testt.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    polo@B-J5D1MD6R-2312 watermarker % ls
    README.md    markers.py    test22.txt    testt.txt
    font        test.py        test3.txt    venv
    polo@B-J5D1MD6R-2312 watermarker %

    本来有三个提交,执行完 git reset 直接都撤销出暂存区,需要重新提交了

    撤销对文件的修改

    不想保留对某个文件的修改怎么操作?就是将它还原成上次提交时的样子(或者刚 clone 下来的样子)

    git 也有对应的提示(新版暂时没发现有这提示)

    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   CONTRIBUTING.md

    重点记住这个 checkout 命令

    git checkout -- <file>...

    具体栗子

    polo@B-J5D1MD6R-2312 watermarker % git add .
    polo@B-J5D1MD6R-2312 watermarker % echo 12344 >> test3.txt
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        重命名:   test1.txt -> test22.txt
        新文件:   test3.txt
        重命名:   ttrtt.txt -> testt.txt
    
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
        修改:     test3.txt
    
    polo@B-J5D1MD6R-2312 watermarker % git checkout -- test3.txt
    polo@B-J5D1MD6R-2312 watermarker % git status
    位于分支 master
    您的分支领先 'origin/master'5 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
        重命名:   test1.txt -> test22.txt
        新文件:   test3.txt
        重命名:   ttrtt.txt -> testt.txt

    可以看到 test3.txt 的修改已经被撤销了

    重点

    • 它也是一个高危命令
    • 执行 git checkout 命令后,对那个文件在本地的任何修改都会消失,而 Git 会用最近提交的版本来覆盖掉它
  • 相关阅读:
    sed与正则用法收集
    第一学期网络技术知识总汇
    常用的windows注册表大全
    1-1 Linux系统安装
    用javascript写计算器
    closure
    Linux-Rhel6 恢复误删文件
    flask第十一篇——自定义url转换器
    flask第十篇——url_for【3】
    flask第九篇——url_for【2】
  • 原文地址:https://www.cnblogs.com/poloyy/p/14773020.html
Copyright © 2020-2023  润新知