再议git的checkout, revert, 和reset命令

再议git的checkout, revert, 和reset命令

这三个命令都是git用于回退,修正错误的命令。

三个基本概念

Working Directory(工作区) <--> Staged Snapshot(暂存区) <--> Commit History

git checkout

迁出历史版本文件。

用法
git checkout <branch> # 这个是切换branch,不讨论
git checkout <commit> # 这个命令很难用, 我不知道怎么用?
git checkout <commit> -- <file> #连续两个连号(--)表示后面是文件名,而不是分支名。

功能

  • git checkout -- <file>
    丢弃当前工作区的文件,把Staged区文件拷贝到当前工作区。

  • git checkout HEAD -- <file>
    丢弃当前工作区和Staged区的文件,把HEAD文件拷贝到当前工作区和Staged区。

  • git checkout <commit> -- <file>
    把历史版本的文件拷贝到当前工作区和Staged区,接下来有两个选项可以继续

    • 只是看一下历史版本,然后丢弃历史版本
      git checkout HEAD -- <file> # 这个命令的含义是把HEAD再拷贝到当前工作区和Staged区,冲掉之前的历史版本
    • 需要提交这个历史版本
      git add <file>
      git commit <file>

补充一点 git checkout <commit>的用法
通常把某个<commit>迁出后,在迁出的代码上拉一个新的分支,然后在新的分支里面继续做开发,最后提交新分支的代码。

$ git checkout <commit>
Note: checking out '<commit>'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at <commit>... <description>
$ git status
# HEAD detached at <commit>
nothing to commit, working directory clean
$ git branch
* (detached from <commit>)
  <current_branch>
$ git checkout -b test_branch    
Switched to a new branch 'test_branch'
$ git status
# On branch test_branch
nothing to commit, working directory clean
$ git branch
  <current_branch>
* test_branch

git revert

revert的作用是翻转一个commit;作用对象是一个commit,把它所有的改动翻转。
revert不能翻转单个文件,只能对一个完整的commit翻转。这个commit可以是最新的commit,或者历史上的任何一个commit。

用法
git revert <commit>
git revert HEAD~1

功能

  • 如果翻转过程顺利,没有合并冲突, 那么
    这个翻转操作会自动发起一个新的commit提交; 在代码历史里面可以看到本次翻转的commit操作。
  • 如果翻转过程存在冲突,不能自动完成(通常发生在需要翻转一个历史commit时),那么
    git revert 命令会把冲突的文件保存在当前工作区,然后用户手工完成代码merge操作,然后git add 加到stage区,最后git commit 手动发起commit操作

git reset

reset的作用是回退到之前的某一个状态
reset既可以作用于commit,也可以作用于file

注意和revert的区别,revert作用于具体一个commit,而reset是commit所处的那个点的状态,所以那个点之后的信息全会被丢弃,包括历史,即那个点之后的所有操作历史都丢弃了。
也就是说以前的操作历史都被抹去了,是不是很开心,犯了错误找不到痕迹了?(想的美:-))

用法
git reset <commit> [<file>]
git reset HEAD~2 [<file>]

功能

  • git reset <commit>
    则回退到<commit>的状态,也就是<commit>完成后的状态,所有<commit>之后的提交都丢弃,<commit>之后的commit历史记录也丢弃。
    然后会把所有<commit>之后的提交改动都存放在当前工作区,这样用户可以选择丢弃,也可以选择修改,再次提交;
  • git reset HEAD~2
    则是丢弃最近的两个commit,回退到最近的第三次提交状态。

注意reset之后,<commit>之后的操作历史都丢弃了,因此这个命令不能用在公共的分支上,也不能用在已经push到服务器上的分支上;所以通常在私有的分支上做reset操作。
因为如果分支已经push到服务器了,在reset完之后status命令会告诉你,当前分支已经落后服务器上的分支了,需要你重新从服务器pull下代码来,这样相当于reset没有用白做了嘛;而你如果想push到服务器,git直接就给你失败,因为你已经落后了。

三个选项
--soft – staged和当前工作区都不更新. (很少用到这个选项)
--mixed(default) – staged更新,但当前工作区不更新
--hard – staged和当前工作区都更新

git diff

缺省情况下git diff比较的是当前工作区和Staged区的文件差异。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,458评论 1 26
  • 本片内容转自CSDN http://blog.csdn.net/ithomer/article/details/7...
    五娃儿阅读 4,925评论 2 88
  • 人都是逼出来的。 每个人都是有潜能的,生于忧患,死于安乐。所以,当面对压力的时候,不要焦燥,也许这只是生活对你的一...
    故事学者阅读 625评论 0 4
  • 老师给了我们几个演讲的题目,我被其中的一个深深吸引,题目的名字是:唐僧、孙悟空、猪八戒、沙僧这四个人你想成为谁。...
    大宝饭饭阅读 948评论 1 1
  • 我们一起回顾一下耳熟能详的《西游记》的故事:孙悟空、猪八戒、沙僧辅保大唐高僧玄奘去西天取经,师徒四人一路抢滩涉险,...
    心若飘纱阅读 324评论 0 0