zoukankan      html  css  js  c++  java
  • 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 会用最近提交的版本来覆盖掉它
  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/poloyy/p/14773020.html
Copyright © 2011-2022 走看看