深入了解git的checkout命令

检出命令(git checkout)是Git最常用的命令之一,同时也是一个很危险的命令.

因为这条命令会重写工作区.检出命令的用法如下:

用法一: git checkout [-q] [<commit>] [--] <path>...

用法二: git checkout [<branch>]

用法三: git checkout [-m] [[-b|--orphan] <new_branch>] [<start_point>>]

第一种用法的<commit>是可选项,如果省略则相当于从暂存区(index)进行检出.

这和之前的重置命令大不相同:重置的默认值是HEAD,而检出的默认值是暂存区.

因此重置一般用于重置暂存区(除非使用--hard参数,否则不重置工作区)

而检出命令主要是覆盖工作区(如果<commit>不省略,也会替换暂存区中相应的文件).

第一种用法:

先来合个影:

在Git中,"留影"用的命令是叫做tag,更加专业的术语叫做"里程碑"(打tag,或者打标签)

"留影"的命令如下:

$ git tag -m "say bye to previous"  old_practice

只需要知道里程碑也无非是一个引用.通过记录提交ID(或者创建Tag对象)来为当前版本库的状态进行"留影"

$ ls .git/refs/tags/old_practice

留影之后,可以执行git describe命令将最新提交显示为一个容易记忆的名字.

显示的时候会选取离该提交最近的里程碑作为"基础版本号",后面附加标识距离"基础版本"

的数字,以及该提交的SHA1哈希值的缩写.因为最新的提交上恰好被打了一个"里程碑".

所以直接显示"里程碑"的名称.这个技术会在后面的示例代码中经常用到.

删除文件:(这个时候工作区只有一个test1.txt文件是已经commit结束,又增加了新的东西,处于modify状态)

在这个暂存区和工作区都包含文件修改的情况下,使用删除命令更具有挑战性.

删除命令有很多种使用方法,有的方法很巧妙,而有的方法则需要更多的输入.

为了分别介绍不同的删除方法.还要使用之前使用过的保存进度的git stash 命令.

保存进度:

在恢复进度.注意不要使用git stash pop ,而是使用git stash apply,因为这个保存的进度要被多次用到.

本地删除不是真的删除.

$ls是看工作区中有哪些文件.

$rm test1.txt 命令执行之后,工作区中处于修改Modified状态的test1.txt文件被删除了.

但是执行$ git ls-files 之后还是可以看出有文件的.

从文件的状态来看,文件只是在本地进行了删除,尚未添加到暂存区(提交任务)中.

也就是说:直接在工作区删除,对暂存区和版本库没有任何影响.

从Git的状态中可以看出,本地删除如果要反应在暂存区中应该用git rm命令,对不向删除的文件执行

git checkout -- <file>,可以让文件在工作区中重现.

这个时候如果用checkout命令的话,刚才已经"被删除"的test1.txt就会恢复在工作区了.

不过这个文件是没有修改之前的状态.上面的图中我也已经$git status 了.

执行git rm命令删除文件

$ git rm test1.txt
这样删除的动作加入了暂存区,这时执行提交动作,就从真正意义上执行了文件删除.

$ git commit -m "delete files(using:git rm)"

不过不要担心,文件只是在版本库的最新提交中被删除了,在历史提交中尚在.可以通过下面的命令查看历史版本的文件列表.

$ git ls-files --with-tree=HEAD^

也可以查看在历史版本中尚在的删除文件的内容.

$git cat-file -p HEAD^:test1.txt

命令git add -u 快速标记删除

在前面执行git rm命令时,写下了所有要删除的文件名,很长.能不能简化些?

实际上git add就可以.即使用-u参数调用git add命令.含义是将本地有改动(包括修改和删除)的文件标记到暂存区.

为了重现刚才的场景,先使用重置命令抛弃最新的提交,再使用进度回复到之前的状态.

文件的整个过程操作:

上图中$git stash apply -q 恢复保存的进度(参数-q 使得命令进入安静模式)

执行完上面这个命令恢复到了在test1.txt的modified状态.

执行 git add -u 命令可以将(被版本库追踪的)本地文件的变更(修改,删除)全部记录到暂存区中.

关于Git中的一些常用的命令的更多相关文章

  1. 图解git中的最常用命令

    图解git中的最常用命令 Git命令参考手册(文本版) git init                                                  # 初始化本地git仓库(创 ...

  2. git中常见的几个命令

    git中常见的几个命令 本地仓库 三个区域 工作目录 暂存区 本地仓库 文件的四个状态 未跟踪 untracked 已暂存 staged 已提交commited 已修改 modified 基本命令 g ...

  3. mac中一一些常用的命令

    本文转载至 http://blog.csdn.net/chen505358119/article/details/9244701   这里主要讲的是mac中的一些命令,怕忘记了所以记在这里. 1.首先 ...

  4. git操作分支的常用的命令

    查看所有的分支:                 git branch -a 查看当前所在的分支:          git branch 检出分支:                          ...

  5. git中通过实际操作来了解常用命令

    基本的6个命令 常用的就下面6个命令,但是详细的可能有上百个命令. 还需要特别了解git的几个名词,workspace:工作区,Index/Stage:暂存区,Respository:本地仓库,Rem ...

  6. GIT中常用的命令

    最近项目中使用到了GIT,所以记录一下GIT中常用的命令. GIT使用的客户端有Git Bash:http://code.google.com/p/msysgit/ 还有乌龟TortoiseGit:h ...

  7. 总结下git中一些常用命令

    一.目录操作 1.cd 即change directory,改变目录,如 cd d:/www,切换到d盘的www目录. 2.cd .. cd+空格+两个点,回退到上一目录. 3.pwd 即 print ...

  8. Git 中的一些其他常用命令

    1.查看提交的历史版本(git log) 我们可以使用 git log 命令来查看提交的历史版本. 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面.每个版本都有 ...

  9. git常用的命令集合

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone g ...

随机推荐

  1. Cppcheck代码分析(2)

    功能 解析函数中的可能的代码执行流 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ,for 代码流举例 ...

  2. MFC 文件操作

    MFC中文件的建立 在操作系统中,文件是放在一定的目录下,在创建以及操作文件以前,我们要查看文件要保存的目录有没有存在,如果不存在要创建.这就要用到GetFileAttributes()和Create ...

  3. leetcode@ [124] Binary Tree Maximum Path Sum (DFS)

    https://leetcode.com/problems/binary-tree-maximum-path-sum/ Given a binary tree, find the maximum pa ...

  4. C# Asp.net中的AOP框架 Microsoft.CCI, Mono.Cecil, Typemock Open-AOP API, PostSharp -摘自网络 (可以利用反射 Attribute 进行面向切面编程 可以用在记录整个方法的Log方面)

    Both Microsoft.CCI and Mono.Cecil are low-level, and don't validate produced assemblies. It takes lo ...

  5. rabbitMQ 笔记

    1. 端口 rabbitMQ  server 使用的端口是5672  ,   AMQP协议的端口 rabbitMQ  web 使用的端口是15672  ,   管理工具的端口 rabbitMQ  cl ...

  6. Java同步问题面试参考指南

    同步 在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程 ...

  7. UVA 10806 Dijkstra, Dijkstra.(费用流)

    n个点的无向带权图,求1->n的最短往返路径,不走重复边. 这里涉及到一个知识点:求无向图上s->t的最短路,其实就是费用流. 而求1->n最短往返路径呢?增加源点s,由s到1加弧, ...

  8. TFS的使用

    1.http://www.kwstu.com/ArticleView/kwstu_201462311500744

  9. 空循环比较 for foreach array_map array_walk

    申请一个数组,然后不断的跑空循环,看看执行时间 for循环 foreach (不使用键) foreach(使用键) array_map array_walk 查看效率速度发现很明显 是foreach更 ...

  10. C# 条形码 生成函数 (Code 128 标准

    C# 条形码 生成函数 (Code 128 标准参考:GB/T 18347-2001) 最近在做单据打印,发现客户要求用到条形码,在网上找了,发现只有一些条形码的标准,但打出来发现根本不能扫,还要加某 ...