版本控制工具--Git(用后整理)

简介:

Git常用命令表

版本控制工具--Git(用后整理)_第1张图片



Git命令思维导图

版本控制工具--Git(用后整理)_第2张图片




git命令:

user@ROOT:~$ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
最常用的 git 命令有:
   add        添加文件内容至索引
   bisect     通过二分查找定位引入 bug 的变更

   branch     列出、创建或删除分支

          列出分支

               git branch -a     

          创建分支

               git branch my2.6.14 v2.6.14

          删除分支

              git branch -d feature_x
   checkout   检出一个分支或路径到工作区

         例子: git checkout project3.0

创建分支:
git checkout -b branch-001  -- 建立分支并checkout该分支
git push origin branch-001  -- 将分支push到远程分支上

删除分支:
git checkout master       -- 切换到master分支
git branch -d branch-001  -- 删除本地分支branch-001
git push origin :branch-001 --将本地删除的分支push到远程分支


 clone      克隆一个版本库到一个新目录

         执行如下命令以创建一个本地仓库的克隆版本:
                  git clone /path/to/repository
         如果是远端服务器上的仓库,你的命令会是这个样子:
                 git clone username@host:/path/to/repository

   commit     记录变更到版本库
   diff       显示提交之间、提交和工作区之间等的差异
   fetch      从另外一个版本库下载对象和引用
   grep       输出和模式匹配的行
   init       创建一个空的 Git 版本库或重新初始化一个已存在的版本库
   log        显示提交日志
   merge      合并两个或更多开发历史
   mv         移动或重命名一个文件、目录或符号链接
   pull       获取并整合另外的版本库或一个本地分支
   push       更新远程引用和相关的对象
   rebase     本地提交转移至更新后的上游分支中
   reset      重置当前HEAD到指定状态
   rm         从工作区和索引中删除文件
   show       显示各种类型的对象
   status     显示工作区状态
   tag        创建、列出、删除或校验一个GPG签名的 tag 对象

命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些指南。参见
'git help <命令>' 或 'git help <指南>' 来查

user@ROOT:~$ git help -a
用法:git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

在 '/usr/lib/git-core' 下可用的 git 命令

  add                       merge-one-file
  add--interactive          merge-ours
  am                        merge-recursive
  annotate                  merge-resolve
  apply                     merge-subtree
  archive                   merge-tree
  bisect                    mergetool
  bisect--helper            mktag
  blame                     mktree
  branch                    mv
  bundle                    name-rev
  cat-file                  notes
  check-attr                p4
  check-ignore              pack-objects
  check-mailmap             pack-redundant
  check-ref-format          pack-refs
  checkout                  patch-id
  checkout-index            prune
  cherry                    prune-packed
  cherry-pick               pull
  clean                     push
  clone                     quiltimport
  column                    read-tree
  commit                    rebase
  commit-tree               receive-pack
  config                    reflog
  count-objects             relink
  credential                remote
  credential-cache          remote-ext
  credential-cache--daemon  remote-fd
  credential-store          remote-ftp
  daemon                    remote-ftps
  describe                  remote-http
  diff                      remote-https
  diff-files                remote-testsvn
  diff-index                repack
  diff-tree                 replace
  difftool                  request-pull
  difftool--helper          rerere
  fast-export               reset
  fast-import               rev-list
  fetch                     rev-parse
  fetch-pack                revert
  filter-branch             rm
  flow                      send-pack
  fmt-merge-msg             sh-i18n--envsubst
  for-each-ref              shell
  format-patch              shortlog
  fsck                      show
  fsck-objects              show-branch
  gc                        show-index
  get-tar-commit-id         show-ref
  grep                      stage
  hash-object               stash
  help                      status
  http-backend              stripspace
  http-fetch                submodule
  http-push                 subtree
  imap-send                 symbolic-ref
  index-pack                tag
  init                      unpack-file
  init-db                   unpack-objects
  instaweb                  update-index
  log                       update-ref
  ls-files                  update-server-info
  ls-remote                 upload-archive
  ls-tree                   upload-pack
  mailinfo                  var
  mailsplit                 verify-pack
  merge                     verify-tag
  merge-base                web--browse
  merge-file                whatchanged
  merge-index               write-tree
  merge-octopus

命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些指南。参见
'git help <命令>' 或 'git help <指南>' 来查看给定的子命令帮助或指南。

看给定的子命令帮助或指南。


Git 工作区、暂存区和版本库使用业务流程图

暂存区(stage, index)是 Git 最重要的概念之一,理解了这个概念很多 Git 命令就不再那么神秘了。 今天在写这部分的内容,画了一个图,看看有没有什么问题。  理解 Git 暂存区(stage)  把上面的“实践二”从头至尾走一遍,不知道您的感想如何?
  • —— “被眼花缭乱的 Git 魔法彻底搞糊涂了?”
  • —— “Git 为什么这么折磨人,修改的文件直接提交不就完了么?”
  • —— “看不出 Git 这么做有什么好处?”
在“实践二”的过程中,我有意无意的透漏了“暂存区”的概念,为了避免用户被新概念吓坏,在暂存区出现的地方用同时使用了“提交任务”这一更易理解 的概念,但是暂存区(stage, 或称为 index)才是其真正的名称。我认为 Git 暂存区(stage, 或称为 index)的设计是 Git 最成功的设计之一,也是最难理解的一个设计。 在版本库(.git)目录下,有一个 index 文件,我们针对这个文件做一个有趣的试验。 首先我们执行 "git checkout" 命令撤销工作区中 welcome.txt 文件尚未提交的修改。
$ git checkout -- welcome.txt
$ git status -s
我们通过状态输出,看以看到工作区已经没有改动了。我们查看一下 .git/index  文件,注意该文件的时间戳(19:37:44):
$ ls --full-time .git/index
-rw-r--r-- 1 jiangxin jiangxin 112 2010-11-29 19:37:44.625246224 +0800 .git/index
我们再次执行 "git status" 命令,然后显示 .git/index  文件的时间戳(19:37:44),和上面的一样。
$ git status -s
$ ls --full-time .git/index
-rw-r--r-- 1 jiangxin jiangxin 112 2010-11-29 19:37:44.625246224 +0800 .git/index
现在我们更改一下 welcome.txt 的时间戳,但是不改变它的内容。然后再执行 "git status" 命令,然后查看 .git/index 文件时间戳(19:42:06)。
$ touch welcome.txt
$ git status -s
$ ls --full-time .git/index
-rw-r--r-- 1 jiangxin jiangxin 112 2010-11-29 19:42:06.980243216 +0800 .git/index
看到了么,时间戳改变了! 这个试验说明当执行 "git status" 命令扫描工作区改动的时候,先依据 .git/index  文件中记录的(工作区跟踪文件的)时间戳、长度等信息判断工作区文件是否改变。如果工作区的文件时间戳改变,说明文件的内容  可能  被改变了,需要要打开文件,读取文件内容,和更改前的原始文件相比较,判断文件内容是否被更改。如果文件内容没有改变,则将该文件新的时间戳记录到 .git/index  文件中。因为判断文件是否更改,使用时间戳、文件长度等信息进行比较要比通过文件内容比较要快的多,所以 Git 这样的实现方式可以让工作区状态扫描更快速的执行,这也是 Git 高效的因素之一。

文件 .git/index 实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的 内容并不存储其中,而是保存在 Git 对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。下面这个图展示了工作区、版本库中的暂存区和版本库之间的关 系。

版本控制工具--Git(用后整理)_第3张图片

工作区、版本库、暂存区原理图

在这个图中,我们可以看到部分 Git 命令是如何影响工作区和暂存区(stage, index)的。
  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。
  • 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个“游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,我们会在后面的章节重点介绍。
  • 当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID 被记录在暂存区的文件索引中。
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
  • 当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  • 当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • 当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动。



版本控制工具--Git(用后整理)_第4张图片

Git diff : 魔法

  • git diff : 工作区和暂存区比较
  • git diff --cached : 暂存区和HEAD比较
  • git diff HEAD : 工作区和HEAD比较

参考资料:

git - 简明指南 http://rogerdudler.github.io/git-guide/index.zh.html

git使用简介  http://www.cnblogs.com/timsheng/archive/2012/11/28/2792977.html

Github使用指南 https://github.com/neuola/neuola-legacy/wiki/github%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97

如何创建你自己的Git服务器 http://blog.jobbole.com/60505/

<Git权威指南>

git clone简介 http://hubingforever.blog.163.com/blog/static/17104057920123142049243/

git分支建立删除,打tag : http://blog.csdn.net/dijason/article/details/9042425

git思维导图 : http://www.imyukin.com/wp-content/uploads/2012/06/git.png

我痛恨 Git 的 10 个理由 http://www.open-open.com/news/view/889e6

Git Cheat Sheet http://www.zhiweinet.com/Image/20092182110463177801.pngy

介绍一个成功的 Git 分支模型   http://www.oschina.net/translate/a-successful-git-branching-model

你可能感兴趣的:(版本控制工具--Git(用后整理))