git 安装
以centos 为例
先安装依赖包
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gccperl-ExtUtils-MakeMaker
下载git安装包,三部曲完成安装
$ wget https://github.com/git/git/archive/v2.3.0.zip
$ unzip v2.3.0.zip
$ cd git-2.3.0
make configure
$ ./configure --prefix=/usr
$ make all doc info
$ sudo make install install-doc install-html install-info
安装完成后,git –version 查看安装是否成功
默认安装git 没有命令补全功能, 需要另外安装completion文件
wget https://github.com/markgandolfo/git-bash-completion.git
cp git-completion.bash ~/.git-completion.bash
source ~/.git-completion.bash
修改~/.profile 增加 source ~/.git-completion.bash
git 设置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
创建版本库
git init
当前目录下创建工作目录,会产生.git的目录,下面包含了记录版本的历史信息文件; 可以在当前目录中进行git 操作,文件的增删改查、以及版本切换等; 但一般不作为仓库使用,因为工作目录容易因为他人的提交操作,导致混乱;
git –bare init
创建裸仓库作为远程仓库,仅生成包含提交版本历史记录信息的.git目录,其他人可以往上面提交版本,而不会产生混乱;
文件配置
工程中可能某些文件不想加入git监控,可以通过配置gitignore文件,分为全局和局部两种:
全局:
通过修改全局配置 git config 中的 excludesfile 指定全局忽略文件。设置方法:
$ git config --global core.excludesfile ~/.gitignore
局部
忽略文件默认为当前目录的 .gitignore ,但它只作用于当前目录下。上面说到,在全局的 .gitignore 文件中添加 .o 会忽略所有目录下产生的 .o 文件,但在当前目录下的 .gitignore 中添加 .o 却只能忽略当前目录下的 .o 文件。
版本操作
git版本管理 分三个区:工作区、暂存区、版本库
git status 查看工作区修改情况
git add 将文件从工作区添加到暂存区
git commit -m "comment" 将文件从暂存区提交到版本仓库中
git diff 查看工作区文件与版本库文件的差异
git log命令显示从最近到最远的提交日志
git reflog 回退版本后看不到版本,可以看历史命令信息
git reset 回退版本
git checkout 回退修订
git status 查看仓库修改情况:
Changes not staged for commit:
modified: readme.txt
暂存区有修订没有提交到仓库
Changes to be committed:
modified: readme.txt
新增文件
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# LICENSE
git log命令显示从最近到最远的提交日志 git log –pretty=oneline
git不是以累加的版本号记录管理版本,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
git reset –hard HEAD^ 回退到上一个版本, 回到上一个版本后 git log将查看不到上一个版本信息,如果想回退可以 使用git reset –hard 3628164 前提是知道版本号
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向“append GPL”:
回退版本后如果没有版本号 可以使用git reflog查看命令历史记录
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
提交后,用“git diff HEAD – readme.txt”命令可以查看工作区和版本库里面最新版本的区别:
$ git diff HEAD -- readme.txt
Git会告诉你,git checkout – file可以丢弃工作区的修改:
$ git checkout -- readme.txt
命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
删除仓库中某个文件
$ git rm test.txt
rm 'test.txt
$ git commit -m "remove test.txt"
误删没有提交到仓库中可以使用git checkout恢复, 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
分支管理
Git鼓励大量使用分支,git分支控制命令:
git branch 查看分支 -a 所有分支, -r 远程分支,前面带 * 当前所在分支
git branch name 创建分支
git checkout name 切换分支
git checkout -b name 创建+切换分支
git merge name 合并某分支到当前分支,有冲突手工解决后提交
git branch -d name 删除一个分支
查看分支历史
git log --graph --pretty=oneline --abbrev-commit
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;、
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
当在dev开发过程中 报出已发布版本的bug, 但开发未完成不能提交代码,这时候又要创建临时分支来处理bug,想避免开发的数据丢失,可以使用git stash 保存现场信息
在branch 分支开发过程中,需要开发其他实验性功能, 又不想搞砸开发中的branch分支,可以在branch环境中 git checkout -b feature-name 创建并且复制branch分支信息,开发完后 同步到branch分支, git merge dev
远程操作
版本克隆
git clone <版本库地址>
远程主机操作
git remote 列出所有远程主机名, -v 详细模式
git remote show <主机名> 查看某个主机名信息
git remote add 添加远程主机
git remote rm 删除远程主机
git remote rename <原主机名><新主机名>
更新
git fetch <远程主机名> <远程分支名>:<本地分支名>
从远程获取最新版本到本地,不会自动merge,选择合并还需要用git fetch <主机名>/<远程分支名> 进行合并
git pull <远程主机名><远程分支名>:<本地分支名>
从远程获取更新,并且自动合并;相当于git fetch + git merge;不写本地分支名,将合并到当前使用分支,不写远程分支名,将当前分支自动对应到远程分支中
推送
git push <远程主机名><本地分支名>:<远程分支名>
引用:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000