Git - fast, scalable, distributed revision control system
本文用于教学,面向初学者
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而使用C和Shell开发的一个开放源码的版本控制软件。
GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。
网上资源
安装
Centos/RedHat
$ yum install curl-devel expat-devel gettext-devel \
openssl-devel zlib-devel
$ yum -y install git-core
$ git --version
git version 1.7.1
Windows
Git 配置
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用git config
时用--system
选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用git config
时用--global
选项,读写的就是这个文件。- 当前项目的 Git 目录中的配置文件(也就是工作目录中的
.git/config
文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config
里的配置会覆盖/etc/gitconfig
中的同名变量。
在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings$USER。
此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。
$ git config --global user.name "wangxk"
$ git config --global user.email seb.wang@zippowxk.com
文本编辑器
$ git config --global core.editor emacs
差异分析工具
$ git config --global merge.tool vimdiff
查看配置信息
$ git config --list
$ git config user.name
工作流
一般协作方式
开源协作方式
Git三区
我们先来理解下Git 工作区、暂存区和版本库概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
Git建库
$ git init 或者 $ git init reponame
$ git add . 或者 $ git add filename
$ git commit -m '初始化项目版本'
我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。
克隆仓库的命令格式为:
$ git clone <repo> <directory>
$ git clone /Users/wxkmac/Document/a/.git # 本地
$ git clone git://github.com/schacon/grit.git # 远程git协议
$ git clone http://github.com/schacon/grit.git # 远程http协议
基本操作
基本快照
Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。本章将对有关创建与提交你的项目的快照的命令作介绍。
git add
git add 命令可将该文件添加到缓存,如我们添加以下两个文件:
$ touch README
$ touch hello.php
$ ls
README hello.php
$ git status -s
?? README
?? hello.php
$ git add README hello.php
$ git status -s
A README
A hello.php
git status
git status 以查看在你上次提交之后是否有修改。
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
new file: hello.php
git diff
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别
- 尚未缓存的改动:git diff
- 查看已缓存的改动: git diff –cached
- 查看已缓存的与未缓存的所有改动:git diff HEAD
- 显示摘要而非整个 diff:git diff –stat
$ echo this is some new content >> README
$ git diff
git status 显示你上次提交更新后的更改或者写入缓存的改动, 而 git diff 一行一行地显示这些改动具体是啥。
git commit
使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。
Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。
$ git add hello.php
$ git status -s
A README
A hello.php
$ $ git commit -m '第一次版本提交'
$ git status
# On branch master
nothing to commit (working directory clean)
$ git commit -a -m "commit message"
-a 可以省略 git add .
这一步。
-m 如果缺省则会进入对应的文本编辑器中,填写commit 信息
git reset HEAD
git reset HEAD 命令用于取消已缓存的内容。
git rm
如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以用以下命令完成此项工作
$ git rm <file>
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
$ git rm -f <file>
如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 –cached 选项即可
$ git rm --cached <file>
git mv
git mv 命令用于移动或重命名一个文件、目录、软连接。
分支管理
列出分支
$ git branch
* master
此例的意思就是,我们有一个叫做”master”的分支,并且该分支是当前分支。
当你执行 git init 的时候,缺省情况下 Git 就会为你创建”master”分支。
如果我们要手动创建一个分支。执行 git branch (branchname) 即可。
$ git branch testing
$ git branch
* master
testing
切换分支
$ git checkout master
创建分支并切换
$ git checkout -b newtest
删除分支
git branch -d (branchname)
$ git branch -d testing
分支合并
一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:
git merge otherbranch
合并冲突
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
在两个分支对同一个文件进行修改,然后使用进行合并
$ git merge change_site
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat test.txt
<<<<<<< HEAD
runoob.com
新增加一行
=======
www.runoob.com
>>>>>>> change_site
出现了冲突,可以手动编辑文件或使用冲突工具解决冲突。
<<<<<<< HEAD
runoob.com
新增加一行
=======
www.runoob.com
>>>>>>> change_site
删掉 <<<<<<< HEAD ======= >>>>>>> change_site
确认冲突最终解决方案。
修改完成后使用
$git add .
保存修改
查看历史
$ git log
$ git log --oneline # 显示单行
$ git log --oneline --graph # 展示分支合并的拓扑图
$ git log --reverse --oneline # 反向展示
$ git log --author=Linus --oneline -5 # 只看某个作者的提交
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges # 带有日期
标签
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
现在,注意当我们执行 git log –decorate 时,我们可以看到我们的标签了:
#### 打标签
$ git tag -a v1.0
$ git tag -a <tagname> -m "runoob.com标签" # tag信息
#### 查看标签
$ git tag
v0.9
v1.0
远程库
git remote add [shortname] [url] # 添加远程库
git remote # 查看远程库
提取远程仓库
从远程仓库下载新分支与数据:
git fetch
该命令执行完后需要执行git merge 远程分支到你所在的分支。
从远端仓库提取数据并尝试合并到当前分支:
git merge
推送到远程仓库
推送你的新分支与数据到某个远端仓库命令:
git push [alias] [branch]
以上命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支,实例如下。
$ git push origin master # 推送到 远程库的master分支中
删除远程仓库
git remote rm [别名]