起初 git 是 Linus Torvalds 为了便于管理 Linux 内核开发而开发的一个开放源码的版本控制软件,这是一个开源的分布式版本控制系统,可以高效地处理从很小到非常大的项目版本管理。
简单来说,如果你严肃对待编程,就必定会使用"版本管理系统" (Version Control System)。
简介
不像更古老的 SVN 采用集中管理,Git 采用的是分布式的管理,简单来说,如下所示。
所有人除了可以从 origin 获取提交最新的代码之外,每个人还可以从不同人的代码库中获取代码,这也就意味着,比如两或多个人可以共同开发一个特性,测试无误之后再提交到 origin 即可。
另外,需要注意的是,所有版本控制系统,只能跟踪文本文件的改动;对于像图片、视频这类的二进制文件,虽能管理,但没法跟踪文件内容的变化,只知道从 1K 变为了 2K 而改变的内容不知道。
基本概念
因为是分布式版本管理,本地代码仓都会保存一份完整数据,在本地会分成三部分:
Working Directory
工作目录。用来保存当前工作文件所在的目录,在切换分支时会被删除或者替换。Staging Area
暂存区,通过 add 命令添加之后正式提交之前,就保存在这里,作为临时缓存。GIT Directory
也就是.git
目录,与版本管理相关的历史版本、元数据等,都保存在该目录下。
在 .git
中隐藏目录中,会自动创建了第一个分支 master,以及指向 master 的一个指针 HEAD。
提交到版本库包含了两步:
- 使用
git add
把文件添加到暂存区。 - 使用
git commit
把暂存区的所有内容提交到当前分支上。
在修改文件后、执行 add 后、执行 commit 后分别通过 status 命令查看文件的不同状态,也就是说,添加到 stage 区域后,只要未提交,可以多次修改文件并 add 到 stage 区。
配置文件
config 配置有 system(全局)、global(用户)、local(仓库) 三个级别的配置,其中底层可以覆盖顶层配置,对应三个配置文件:/etc/gitconfig
、~/.gitconfig
、.git/config
,其优先级依次递增,后者的配置会覆盖前面的配置项。
三者可以通过如下命令查看,通过 --edit
进行编辑,默认是用户级别的。
$ git config --system --list
$ git config --global --list
$ git config --local --list
在使用的时候,通常要增加如下的配置。
----- 设置用户的默认用户名和密码
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
$ git commit --amend --reset-author ← 未提交远端的可以进行修复
----- 默认的使用nano编辑器,可以选择自己常用的编辑器
$ git config --global core.editor vim
$ git config --global merge.tool vimdiff
----- 开启颜色显示
$ git config --global color.ui true
还有一些其它的配置技巧。
----- 设置简单别名
$ git config --system alias.st status # git st
进入工作根目录,运行 git config -e
,这样就只会修改工作区的 .git/config
文件。
常见操作
接下来,先看下一些常见的操作。
----- 1. 创建新仓库
$ git init ← 会在.git目录下保存元数据
----- 2. 创建文件,并添加到版本库中
$ echo 'Hello World!' > README ← 新建文件
$ git add README ← 添加到版本库中
$ git ls-files ← 查看版本库中的文件
$ git commit -m 'Initial Commit' ← 提交并添加注释
$ git status ← 是否有未提交的文件
----- 3. 修改文件
$ echo 'What A Hell.' >> README ← 修改文件添加一行
$ git commit -a -m 'Add a new line' ← 提交下
$ git log --pretty=oneline ← 查看提交信息
----- 4. 回退
$ echo 'It is A real world' > README ← 覆盖之前的内容
$ git reset --hard HEAD ← 回退到之前提交版本,HEAD^(上个) HEAD~N(上N个)
$ git reflog ← 查看版本号,貌似是UUID
$ git reset --hard 6fcfc89 ← 回退到指定的版本
----- 5. clone一个副本
$ git clone /tmp/foobar . ← 从本地复制一个副本
$ git clone username@host:/path/to/repository ← 复制远端服务器上的仓库
常用技巧
修改仓库地址
如果只是仓库地址修改了,那么可以通过如下方式修改。
$ git remote -v
$ git remote set-url origin GitURLNew
参考
- Windows 下的客户端可以参考 git for windows,Linux 可以使用基于 ncurses 的客户端 tig ,也可以直接参考 github;另外,一本不错介绍 Git 的资料 Pro Git Book 。
- 对于一种不错的 Git 分支管理模式,也即如上的介绍,可以参考 A successful Git branching model。
- 其它整理的参考资料 Git-Tips、A Visual Git Reference 。