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

简介: 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 会用最近提交的版本来覆盖掉它
相关文章
|
6月前
|
开发工具 git
记IDEA Git版本回退并push到远程操作
记IDEA Git版本回退并push到远程操作
146 1
记IDEA Git版本回退并push到远程操作
|
6月前
|
开发工具 git
Git教程:深入了解删除分支的命令
【4月更文挑战第3天】
1123 0
Git教程:深入了解删除分支的命令
|
6月前
|
存储 Shell Linux
【Shell 命令集合 文件管理】Linux git命令使用教程
【Shell 命令集合 文件管理】Linux git命令使用教程
104 0
|
6月前
|
开发工具 git 开发者
|
5天前
|
存储 开发工具 git
git工具使用教程全讲解
本文介绍了版本控制的概念及其重要性,详细对比了多种版本控制工具,如VSS、CVS、SVN和Git,重点讲解了Git的基本使用方法、工作原理及与SVN的区别。此外,文章还介绍了GitHub、GitLab和Gitee等流行的代码托管平台,以及如何在这些平台上注册账号、创建和管理仓库。最后,文章还提供了如何在IntelliJ IDEA中配置和使用Git的具体步骤。
22 1
|
1月前
|
编译器 开发工具 数据安全/隐私保护
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
本文提供了一个关于如何在Gitee上进行多人协作和版本控制的详细教程,包括新建和初始化仓库、克隆仓库、邀请好友共同管理仓库以及注意事项,旨在帮助用户顺利进行代码协作开发。
122 0
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
|
3月前
|
Linux 开发工具 git
|
4月前
|
数据可视化 程序员 开发工具
小白也能玩转Git:从入门到实战详细教程
小白也能玩转Git:从入门到实战详细教程
|
5月前
|
开发工具 git
idea的git reset current branch to here操作详解
idea的git reset current branch to here操作详解
535 1
|
4月前
|
Ubuntu 开发工具 git
git 超实用教程【人人必会!】(含大厂的 git 操作规范)
git 超实用教程【人人必会!】(含大厂的 git 操作规范)
61 0