git checkout

git checkout提供3种不同的功能:

checking out文件, checking out commits, checking out branch.

checkout commit会让你的工作目录整个回到某个commit的状态下. 你可以使用checkout commit查看你项目的老的版本, 而不需要担心会影响你项目的current状态. checkout一个文件会真正影响你的项目的current状态.

用法

git checkout master

回到master这个branch.

git checkout <commit> <file>

指定一个文件回到某个commit时的版本. 工作目录的<file>文件会完整copy<commit>中的文件的内容, 并且会被添加到stage区中.

git checkout <commit>

把工作目录所有的文件都回到指定的commit中时的状态. <commit>可以是一个hash或者一个tag. 运行后你是在一个detached HEAD的状态.怎么理解这个detached HEAD状态呢? 可以简单的说这个时候你运行git checkout master还是能回到最初那个真正的HEAD里面的状态. 你在detached状态里面做的修改(add, commit)其实不会真正有什么影响, 一git checkout master马上还原到最初的状态.  但是如果这个时候你使用git checkout -b <new branch> 创建一个新的分支, 然后git checkout master git merge <new branch> 你做的修改才会真正的起到作用.

讨论

一旦你创立了项目历史, git checkout能让你的本地机器的工作目录回到任何快照的时候.

checkout一个老的commit是一个只读的操作. 查看老的版本不会对你的仓储有什么影响. 你项目的当前状态还是在master这个branch里面, 没受什么影响. HEAD通常是指向master或者某个本地分支, 但是一旦你checkout了一个老的commit, HEAD不在指向分支, 而是指向你这个老的commit, 这就是所谓的detached HEAD状态.

不同的是, checkout一个老的文件会影响你仓储的当前状态. 你可以重新commit这个老版本的文件到新的快照中去. 所以git checkout可以让你指定的文件回到一个老的版本.

例子

查看一个老的版本

这个例子假设你要在你的项目中做一些疯狂的实验, 你不确定是否要保存你在这个实验中所做的工作. 首先你需要找到你想要的版本的ID.

git log --oneline

项目的历史如下:

b7119f2 Continue doing crazy things
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.py
435b61d Create hello.py
9773e52 Initial import

使用checkout 去查看“Make some import changes to hello.py”这个commit:

git checkout a1e8fb5

这时你的工作目录回到了a1e8fb5 commit的状态下. 这个时候你可以做任何你想要做的修改而不用担心你会破坏你的项目. 你在这做的任何操作都不会保存在你的仓储中.  使用下面的命令回到你项目的current状态中:

git checkout master

checkout一个文件

如果你只对某一个文件感兴趣, 你可以使用git checkout去获取这个文件的老版本. 例如, 如果只是想查看hello.py文件的一个老的版本, 你可以使用下面的命令:

git checkout a1e8fb5 hello.py

注意了, 和checkout一个commit不同, checkout文件会真正影响你项目的当前状态. 如果你不想要这个老版本了, 你可以checkout最新的版本:

git checkout HEAD hello.py

[译]git checkout的更多相关文章

  1. [译]reset, checkout和revert

    git reset, git checkout, git revert能让你撤销你本地仓储的一些修改,  前两种命令可以作用于commit或者一个文件. Commit级别的操作 注意了git reve ...

  2. 代码回滚:git reset、git checkout和git revert区别和联系

    git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...

  3. 分支合并git checkout adview git merge adview3

    分支合并 git checkout adview git merge adview3

  4. 每天一命令 git checkout

    检出 checkout  是git常用命令之一.主要用于创建切换分支,覆盖本地修改等 git checkout 用于显示工作区,暂存区,版本库中文件的区别 git checkout -b branch ...

  5. git checkout -b 的详细讲解

    创建分支: $ git branch mybranch 切换分支: $ git checkout mybranch 创建并切换分支: $ git checkout -b mybranch 更新mast ...

  6. [译]git push

    push就是把你本地仓储的commit传到远程仓储中去. 用法 git push <remote> <branch> push指定的分支到<remote>中去.   ...

  7. [译]git pull

    git pull把git fetch和git merge压缩成了一条命令. 用法 git pull <remote> 作用和git fetch <remote> &&a ...

  8. [译]git fetch

    git fetch从远程仓储导入commit到你的本地仓储. 这些fetch到的commit是做为一个远程分支存储在你本地的. 这样你可以在集成这些commit到你的项目前先看看都有些什么修改. 用法 ...

  9. [译]git rebase -i

    使用rebase -i会在终端出现一个交互页面. 在这个交互页面中我们可以对要rebase的commit做一定的修改. 用法 git rebase -i <master> 把当前的分支的c ...

随机推荐

  1. 分区还原工具(DiskGenius)

    不小心删除的分区可以实用DiskGenius进行还原. 下载地址:http://www.upantool.com/qidong/2012/DiskGenius_3.7.1.html 操作方法: 打开D ...

  2. oracle 锁的介绍 (转)

    本文转自:http://blog.csdn.net/gyb2013/article/details/6929697 一.什么是锁: Oracle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行 ...

  3. C/C++ Lua Parsing Engine

    catalog . Lua语言简介 . 使用 Lua 编写可嵌入式脚本 . VS2010编译Lua . 嵌入和扩展: C/C++中执行Lua脚本 . 将C++函数导出到Lua引擎中: 在Lua脚本中执 ...

  4. discuz /faq.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 . 通过获取管理员密码 . 对管理员密码进行破解.通过在cmd5.com ...

  5. dedeCMS /data/mysql_error_trace.php DB error raised PHP Code Injection Via /include/dedesql.class.php Log FIle Without Access Validation

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 dedecms采用面向对象封装的方式实现了功能操作的模块集中化,例如对于数据库管理 ...

  6. js实现A*寻路算法

    这两天在做百度前端技术学院的题目,其中有涉及到寻路相关的,于是就找来相关博客进行阅读. 看了Create Chen写的理解A*寻路算法具体过程之后,我很快就理解A*算法的原理.不得不说作者写的很好,通 ...

  7. Python编码格式的指定方式

    参考自: http://python.jobbole.com/85852/, 原文探究的更深,有兴趣的可以去看看. 简介来讲就是使用一种特殊的注释来声明编码格式,如何判断这种格式也用了很简单粗暴有效的 ...

  8. django models auto_now和auto_now_add的区别

    DataTimeField()中auto_now参数和auto_now_add参数区别: 前者添加或者修改的都为现在的时间,可以再次更新: 后者仅仅为添加时候的时间,不可更改.

  9. 总结jQuery选择器

    基本选择器 1. id选择器(指定id元素) 2. class选择器(遍历css类元素) 3. element选择器(遍历html元素) 4. * 选择器(遍历所有元素) 5. 并列选择器$('p,d ...

  10. [转]图片中的字符分割提取(基于opencv)

    http://blog.csdn.net/anqing715/article/details/16883863 源图片 像这些图片的字符就比较好操作,每个字符都独立,不连在一起,所以轮廓检测最好了.所 ...