Git 中常用的 4 个命令

使用 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 +0800

    ddd

commit fbb28efb4e156031704abbf015b12c8ef16031c8
Author: sylan215 <sylan215@sylan215.com>
Date:   Thu Oct 19 15:15:26 2017 +0800

    revert

如果 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 reset
 1 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.txt

no 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Git安装和使用 Git安装和使用 刚开始用git的小白适用,,转自http://www.cnblogs.com/qijunjun/p/7137207.html 实际项目开发中,我们经常会用一些版本控制器来托管自己的代码,今天就来总结下Git的相关用法,废话不多说,直接开写。 目的:通过Git管理g
fatal: remote origin already exists.解决方法 第一个问题git remote add origin**************fatal: remote origin already exists.(报错远程起源已经存在。)上网查了下,有很多小白遇到过这个问题,以
git常用命令(二)查看历史记录 git log [--pretty=oneline] [ --oneline] / reflog Eniac-W 于 2020-10-18 18:12:38 发布 2368 收藏 3分类专栏: git 文章标签: git版权 git专栏收录该内容10 篇文章0 订阅
git之如何把本地文件上传到远程仓库的指定位置 git专栏收录该内容2 篇文章0 订阅订阅专栏2018.11.26添加内容: 对于自己的仓库,我们建议将远程仓库通过clone命令把整个仓库克隆到本地的某一路径下。这样的话我们从本地向远程仓库提交代码时,就可以直接把需要提交的文件拖到我们之前克隆下来的
代码规范之 lint-staged 在代码提交之前,进行代码规则检查能够确保进入git库的代码都是符合代码规则的。但是整个项目上运行lint速度会很慢,lint-staged能够让lint只检测暂存区的文件,所以速度很快。 安装与配置 安装husky和lint-staged: yarn add hu
方法:1、文件没有git操作时用“git checkout--文件”命令还原;2、文件提交到暂存区时用“git reset HEAD”命令回退当前版本还原;3、文件提交到仓库区时用“git reset HEAD^”命令回退上一个版本还原。 本文操作环境:Windows10系统、Git2.30.0版、
使用Git将本地文件提交到远程仓库 一 操作准备条件: git远程仓库已经建好了,本地文件已经存在了,现在要将本地代码推到git远程仓库保存。 解决办法如下: 1、(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2、把文件添加到版本库中,使用命令
GitHub克隆代码到本地全教程 因为工作原因更换电脑,想要从GitHub上拉取代码的话需要重新配置ssh keys,时间过的久了怕忘记就把步骤给记录下来。 具体步骤: 1.安装git 这我就不说了 2.在TortoiseGit的安装文件中找到 puttygen.exe应用程序 ,默认应该都是 :C
github上传项目的时候报出git@github.com: Permission denied (publickey). fatal: Could not read from remote repo 前言 会不会有程序员小伙伴在刚开始使用github的时候上传项目的时候困难重重,但是又基于自己本身
查看历史 git log --pretty=onelinegit log (然后一直按enter键) 一个是切换根据历史里面的id切换git checkout ID git log 需要不断按enter键出来历史提交记录 git log --pretty=oneline 是直接出来历史记录
Git工作原理及常用命令 欧怼怼发布于&#160;2020-12-08 git介绍 git(读音/ɡɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 git
git git提交项目的具体流程 git项目流程:以下主要有3个角色:负责人、成员A、成员B(若负责人也要修改代码,则负责人同时兼任2个角色:负责人、成员) 主要负责人:搭建项目架构且提交到git上1.github官网登录后,新建仓库,生成地址url,复制线上仓库.git结尾的地址url2.在一个空
git上传项目全部流程 一、下载git 进入网址:https://git-scm.com/downloads; 点击中的Download 2.16.0 for Windows; 在中选择蓝色字段点击,根据电脑64或32位选择适合的下载,点击即可进行下载,下载完成后傻瓜式安装,一直点击下一步即可完成安
Your local changes to the following files would be overwritten by checkout问题的解决 于 2018-07-17 11:38:27 发布 Git 的本地版本管理有三个部分 名称&#x9;说明工作区(Working Directory)&#x9;
Git配置SSH Keys步骤使用教程 1.若是首次安装使用git,先配置用户名称和邮箱(如果有就不需要配置) 打开Git Bash,输入 git config --global user.name &quot;姓名&quot;git config --global user.email &quot
基本配置完成,接下来就是上传你要上传的项目了。 1、初始化git 进入你要上传的项目的文件夹,在文件夹内鼠标右击,选择“Git Bash Here”打开git命令行,输入: $ git init 目的是初始化git,并且会创建个“.git”文件夹,里面有个“config”就是用来保存远程厂库路径地址
本篇内容主要讲解“gitee如何上传代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“gitee如何上传代码”吧! ...
这篇“从gitee上下的代码如何用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
这篇文章主要介绍“gitee如何下载仓库里的项目”,在日常操作中,相信很多人在gitee如何下载仓库里的项目问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
本篇内容主要讲解“怎么在Gitee上更新代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Gitee上更新代...