使用 Git 进行版本管理时,肯定不只做提交,有时候也会需要回退修改,并且在回退的基础上进行重新提交,这时候有几个常用的命令就需要用到了,下面分别做介绍。

1、查看提交日志

首先,我们查看当前提交记录的命令:

$ git log
commit bfee9d6618bc1deae52ac4a7942b96990bbfe661 (HEAD -> master, origin/master, origin/HEAD)
Author: sylan215 <sylan215@sylan215.com>
Date:   Thu Oct 19 15:19:30 2017 +0800dddcommit fbb28efb4e156031704abbf015b12c8ef16031c8
Author: sylan215 <sylan215@sylan215.com>
Date:   Thu Oct 19 15:15:26 2017 +0800revert

如果 log 太多,可以加上参数 --pretty=oneline 使用:

$ git log --pretty=oneline
bfee9d6618bc1deae52ac4a7942b96990bbfe661 (HEAD -> master, origin/master, origin/HEAD) ddd
fbb28efb4e156031704abbf015b12c8ef16031c8 revert
ca0e36b485a3de75e6e11064aecc22ce100652dd new line
45dcf1bc797a773ca3dee07fc795ef986d10c346 t
5e29356aa7aea31e7e6bce302abbc2259324d806 test

2、查看命令执行记录

查看本机命令的执行记录:

$ git reflog
bfee9d6 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to bfee9d6618bc1deae52ac4a7942b96990bbfe661
bfee9d6 (HEAD -> master, origin/master, origin/HEAD) HEAD@{1}: commit: ddd
fbb28ef HEAD@{2}: reset: moving to fbb28efb4e156031704abbf015b12c8ef16031c8
fbb28ef HEAD@{3}: reset: moving to fbb28efb4e156031704abbf015b12c8ef16031c8
fbb28ef HEAD@{4}: commit: revert
ca0e36b HEAD@{5}: reset: moving to ca0e36b485a3de75e6e11064aecc22ce100652dd
ca0e36b HEAD@{6}: commit: new line
45dcf1b HEAD@{7}: reset: moving to 45dcf1

3、使用 reset 进行回退

我们可以通过上述两种方式查看之前的记录,并找到要回退的版本,回退的版本有两种表示方法,一个是 commit id,就是那一串字符,一种是相对 HEAD 的序号,看下命令:

$ git reset --hard HEAD^^
HEAD is now at ca0e36b new line$ git reset --har bfee9d
HEAD is now at bfee9d6 ddd

我们先使用 HEAD^^ 回退了两个版本,然后又使用 bfee9d 这个 commit id 回到了最新版本,注意 HEAD 方式只能回退到旧版本,没法往新版本前进, commit id 的方式可以回退到任意有效 id 的版本,至于怎么查看版本对应的 id 请看最开始介绍的 git loggit reflog 命令。

这个命令我们还可变相达成丢弃目前所有修改的效果,直接运行 git reset --hard HEAD 就行。

回退版本后,我们重新进行修改,并提交,会发现有如下报错:

$ git add .$ git commit -am "test reset"
[master 88b1dc8] test reset1 file changed, 1 insertion(+), 1 deletion(-)$ git push
To 192.168.252.130:/srv/myfiles.git! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@192.168.252.130:/srv/myfiles.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决方法是使用命令 git push -f 解决:

$ git push -f
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 286 bytes | 286.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.252.130:/srv/myfiles.git+ bfee9d6...88b1dc8 master -> master (forced update)

注意:git push -f 是强制提交的意思,如果和 reset 结合使用,就会把最新版本到 reset 到的版本之间的所有 commit 全部抹掉了,这在多人协作时,要特别注意。

具体我们通过命令后 git long --pretty=oneline 看得更直观:

$ git log --pretty=oneline
88b1dc8cb7228f7d1fe14d510a62201a9d584118 (HEAD -> master, origin/master, origin/HEAD) test reset
ca0e36b485a3de75e6e11064aecc22ce100652dd new line
45dcf1bc797a773ca3dee07fc795ef986d10c346 t
5e29356aa7aea31e7e6bce302abbc2259324d806 test

和最上面那一次的输出对比,commit id ca0e36b485a3de75e6e11064aecc22ce100652dd 之后的两个提交 id 都被回退了(fbb28efb4e156031704abbf015b12c8ef16031c8 和 bfee9d6618bc1deae52ac4a7942b96990bbfe661)。

4、另一种温柔的回退方式

使用 reset 是直接抹杀掉 commit 的方式,另外还有一种真正的「回退」命令,就是 revert,它的效果时,在当前版本基础上,删掉要回退版本的修改内容后新建一次提交。
我们看看效果:

$ git log --pretty=oneline
9eecd39b8e6a2109c3678c42dc034db2190840f6 (HEAD -> master, origin/master, origin/HEAD) change
e4f5e6920c22b748d765824e0be21015332fafa4 init$ git revert 9eec
[master f7c9eb4] Revert "change"1 file changed, 1 insertion(+), 2 deletions(-)$ git log --pretty=oneline
f7c9eb4120d368915a6e5491bf85dc5cd87a424f (HEAD -> master) Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 (origin/master, origin/HEAD) change
e4f5e6920c22b748d765824e0be21015332fafa4 init

我们在最新版本的基础上,把最后一次提交的修改给回退了,同时用回退后版本生成了一次提交,并生成了新的 commit id,这样所有的操作 log 均得到了正确的保留。

注意:命令 revert 是指回退指定版本的修改内容,而不是指指定版本到当前版本的所有内容,所以如果给定的 commit id 不是当前版本的最新 commit id,那么就会报错:

$ git log --pretty=oneline
45734f3dc12f45e78504bd0fb52ba334c0ae2c9f (HEAD -> master, origin/master, origin/HEAD) test
7c82b777a40dfb24fc1bba404be0daa3b3923a95 test revert
f7c9eb4120d368915a6e5491bf85dc5cd87a424f Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 change
e4f5e6920c22b748d765824e0be21015332fafa4 init$ git revert 7c82b
error: could not revert 7c82b77... test revert
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'$ git status
On branch master
Your branch is up-to-date with 'origin/master'.You are currently reverting commit 7c82b77.(fix conflicts and run "git revert --continue")(use "git revert --abort" to cancel the revert operation)Unmerged paths:(use "git reset HEAD <file>..." to unstage)(use "git add <file>..." to mark resolution)both modified:   test2.txtno changes added to commit (use "git add" and/or "git commit -a")

如果上图,我们跳过了 45734 的修改,想只回退 7c82b 的修改,这时候就提示冲突了,这时候要么手工修改冲突,要么取消 revert 后,一次指定多个 revert id 来实现,下面是一次使用多个 revert id 进行实现:

$ git revert --abort$ git log --pretty=oneline
45734f3dc12f45e78504bd0fb52ba334c0ae2c9f (HEAD -> master, origin/master, origin/HEAD) test
7c82b777a40dfb24fc1bba404be0daa3b3923a95 test revert
f7c9eb4120d368915a6e5491bf85dc5cd87a424f Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 change
e4f5e6920c22b748d765824e0be21015332fafa4 init$ git revert 45734 7c82b
[master 8140eb0] Revert "test"1 file changed, 1 insertion(+), 3 deletions(-)
[master 191816d] Revert "test revert"1 file changed, 1 insertion(+), 2 deletions(-)$ git log --pretty=oneline
191816d84c02a4ba591d3739739ddd0df114d7f1 (HEAD -> master) Revert "test revert"
8140eb0f69493f1a6306b0e92822f07c049a7a50 Revert "test"
45734f3dc12f45e78504bd0fb52ba334c0ae2c9f (origin/master, origin/HEAD) test
7c82b777a40dfb24fc1bba404be0daa3b3923a95 test revert
f7c9eb4120d368915a6e5491bf85dc5cd87a424f Revert "change"
9eecd39b8e6a2109c3678c42dc034db2190840f6 change
e4f5e6920c22b748d765824e0be21015332fafa4 init

这时候如果我们查看文件,会发现 45734 和 7c82b 的内容都被回退了,并新生成了两次的 commit(每个 commit id 的回退会单独生成一条记录)。

特别说明一下,为了保证 revert 的效果,建议每次提交修改的时候,尽量减少非耦合文件的一起提交,分批提交可以更利于以后的 revert。

转载于:https://blog.51cto.com/sylan215/2165155

Git 中常用的 4 个命令相关推荐

  1. Git之(三)Git中常用命令——分支管理

    三.Git中常用命令--分支管理 为什么要使用分支管理? 分支就是科幻电影里面的平行宇宙,也就是当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干 ...

  2. 检测网络是否稳定的计算机命令,电脑中常用的网络检测命令|电脑中检测网络是否存在故障的几条命令...

    ‍ 通常情况下,我们使用电脑的同时要求电脑要连接网络,而网络出现问题导致无法上网也是常见的现象.了解一些电脑中常用的网络检测命令有助于我们排查网络故障.在接下来的内容中,系统城要介绍几条检测电脑网络是 ...

  3. linux重启命令有哪些,​ linux中常用的关机/重启命令有哪些

    ​ linux中常用的关机/重启命令有哪些 发布时间:2020-11-13 10:33:43 来源:亿速云 阅读:98 作者:小新 这篇文章给大家分享的是有关 linux中常用的关机/重启命令有哪些的 ...

  4. Ubuntu中常用的解/压缩命令

    Ubuntu中常用的解/压缩命令 一..tar文件 二..tar.tgz文件 三..zip文件 四..rar文件 五..tar.gz文件 六..tgz文件 一..tar文件 # 解压 tar xvf ...

  5. hadoop如何使用linux命令,使用配置hadoop中常用的Linux(ubuntu)命令

    生成key: $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized ...

  6. linux中常用的60个命令及作用详解

    Linux 必学的 60 个命令 Linux 提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存 取.目录操作.进程管理.文件权限设定等.所以,在 Linux 系统上工作离不开使用系 ...

  7. Linux系统中常用的docker镜像命令

    在虚拟机中操作的镜像命令: 1.列出所有在运行的容器信息: 可以看到容器ID和名字等 docker ps 2.查看所有镜像: 可以看到镜像ID和名字等 docker images 3.通过dokerf ...

  8. git中查看全部分支的命令

    现在介绍一个超级实用.使用频率极高但几乎所有 Git 教程都不重视的命令 git branch -avv,它用来查看全部分支信息: 上图有三行信息,依次说明: 第一行,开头的星号表示当前所在分支,绿色 ...

  9. git中常用命令小结

    提交过程 查看文件改动以及新增的文件 git status 添加新增文件 git add your_file_path // 添加全部文件 git add * // 添加某类型文件 提交文件 git ...

最新文章

  1. el-date-picker设置默认日期_程序员必备:Java 日期处理的十个坑
  2. 使用WildFly和Java EE 7映像与Docker提供者一起流浪
  3. 算法与数据结构c语言版PPT,C语言算法与数据结构.ppt
  4. Java进阶之网络编程
  5. bootstrap modal远程加载的两种方式
  6. 清华大学计算机考研资料汇总
  7. 陕西2020行政区划调整_陕西2020行政区划调整
  8. 计算机now函数,玩转NOW函数 日期时间随心变
  9. 使用新浪API生成短连接
  10. 多后端深度学习开发框架TensorlayerX发布
  11. 华科_图形学笔记_05_初探造型技术_02
  12. Unity-点击屏幕进行移动
  13. 【PHP版】顺丰下单API 、查询订单API、取消订单API
  14. python适合做网站吗_怎么用python做网站
  15. 礼物说仿写项目iOS源码
  16. python数据框元素的性质_Pandas基础:文件读取与写入、Series和Dataframe、常用基本函数、排序...
  17. 读入数据+使用snownlp进行情感分析
  18. 高考数学95分能学计算机吗,你知道马云高考数学考了多少分吗?
  19. 欢迎报名广东省教育厅2022年科技劳动教育实践活动
  20. module java.base does not opens java.lang to unnamed module @‘‘xxxxxxxx‘‘

热门文章

  1. Android studio 第二次作业
  2. 第17章 使用iSCSI服务部署网络存储
  3. box-shadow属性
  4. Asp.net动态生成html页面
  5. LINUX动态链接库的创建与使用
  6. 海思3559A上编译FFmpeg源码操作步骤
  7. 图像轮廓的提取和绘制
  8. 【linux】printf在终端打印彩色hello world
  9. linux驱动:TI+DM8127+GPIO(二)之驱动
  10. java的关键字和保留字_「Java」详解常见的53个关键字