Skycoop

初识Git

2018-07-06
skycoop
git

工作两年,用的版本控制是SVN,对于Git从未了解。在学习Git的过程中,思考了svn与git的差别,git的优势在哪?在项目开发过程中,需要掌握到git到什么程度。我以零基础的Git初学者,开发者的视角来试着解这个问题。

Git 的安装

无论如何,Git的安装在第一次学习时,总是避不过去的。

Linux下的安装

类Fedora系统

sudo yum install git

类Ubuntu系统

sudo apt-get install git

Windows安装(1)

Windows安装(2)

初次运行Git前的配置

安装完Git之后,我们需要配置自己的用户信息,以便在提交时自动附加自己的信息,同时基于命令行的个人习惯设置则可自由商榷。

  • 配置用户信息
git config --global user.name "Skycoop"
git config --global user.email skycoop@163.com
  • 个人设置
# 命令快捷方式设置
git config --global alias.st status
git config --global alias.ct "commit -m"
git config --global alias.br branch
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
# 开启git输出着色
git config --global color.ui true
# 设置中文支持
git config --global core.quotepath false

获得帮助

无论如何,看再多再多次的Git教程,都无法记住所有的命令。所以必须学会看懂Git的帮助文档来查阅。

在命令行里输入git则会出现常用的命令或是man git来查看帮助文档。又或是

git help <verb>
git <verb> --help
man git-<verb>

例如,要想获得 config 命令的手册,执行git help config

Git 基本命令

基于常见的使用情境,掌握以下基本命令便足够。

clone, init, add, mv, reset, rm, bisect, grep, log, show, status, stash, branch, checkout, commit, diff, merge, rebase, tag, remote, fetch, pull, push

掌握了基本的Git命令,在 Git 日常的使用中,就可以应用到这些使用情境:

  • 版本库的创建与导入导出
  • 更新,提交,同步
  • 查看提交历史
  • 对比差异以及文件追溯
  • 解决冲突,合并
  • 撤销与恢复
  • 版本管理

完整的Git命令列表

全部弄懂下面这些命令没必要。但有必要弄清楚这些命令是解决什么问题的,跟什么问题有关是最重要的。遇见问题再实际解决。

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

SVN 与 Git 对照表

不同角色所需的掌握程度

让我们思考一个问题,在使用Git的过程中,我们扮演的是什么角色?我们深知Git的命令一大堆,细节很多,是有一定的学习成本的。如果需要快速上手,我们需要舍弃掉复杂难懂的命令,以及自己使用场景不会应用到的命令。

角色(1) —– 一个孤独的开发者

不用跟其他人进行协作。项目的所有者仅有你一个人,项目的开发,管理,代码的日常更新与提交,项目的版本管理,甚至如果可能,连Git服务器的管理你都要操心。但是这种情况下,是最自由的,没有任何限制,依个人而定。

角色(2) —– 团队的新手或参与者

你需要跟其他人一起工作,但是你又很菜,你不能分辨和控制风险,你要做的是尽量学会最基本的操作,最快的熟悉整个的工作流程,永远不要擅自做决定,尤其是当遇见你不熟悉的东西,要在第一次时寻求帮助,并要求自己重复的问题只能问一次。要尽快的分辨出哪些操作是危险的,哪些操作是可撤销的,慎重对待那些会引起麻烦的操作,尤其是对别人而言。尽量追上别人的脚步吧,早日成为一个令人信任的老手。

角色(3) —– 团队的集成者

作为团队里对项目最熟悉的老手,要做的会的就要比新手多得多了。不仅仅要求会基本的操作,也要求能够接受他人所做的更改,审查并集成它们并发布结果以供其他人使用。历史的快速查看与编辑,版本的发布与管理,问题的追溯和定位,开发工作流的管理等高级技巧也掌握。

角色(4) —– 团队的独裁者

你就是团队的BOSS,项目的第一手管理者。管理其他成员的权限,管理项目的版本库规划,制定团队的提交规范,重要守则,决定版本控制的工作流模型。Git 服务器的管理方案选择。Git 与其他第三方系统的集成与选型,如持续集成,持续部署,SVN迁移等。

现在的我,是一个孤独的开发者,又是团队的新手或参与者。所以在实操中学习吧。

Git的特性

  • 分布式
  • 直接记录快照,而非差异比较
  • 对非线性开发模式的强力支持(独有的分支模型)

1. 分布式

每一个客户端都是一个完整的版本库,跟svn不一样有一个集中的唯一的版本库,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像拷贝下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

2. 直接记录快照,而非差异比较

Git和SVN的主要差别在于 Git 对待数据的方法。概念上来区分,SVN 以文件变更列表的方式存储信息。SVN将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引,这点上类似虚拟机的快照功能。所以SVN的历史提交记录总是线性的,而Git的就不一定了。

3. 对非线性开发模式的强力支持(独有的分支模型)

Git 的分支是独特于SVN的,因为SVN总是线性的开发模式,而Git则可能不同,为此Git可能根据需要设定不同的开发协作流程。比如层次模型式的工作流。

基础概念 - 三种状态

Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:Git 仓库工作目录以及暂存区域

Git 仓库 即项目根目录下的.git目录,这是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

工作目录 是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

暂存区域 是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作索引,不过一般说法还是叫暂存区域


相关文章

目录