Git教程

Git简介和安装

Git是一个先进的分布式版本控制系统,由Linux的大牛Linus创建。

1. 集中式版本控制系统(svn、cvs)

Alt text

版本库集中存放在中央服务器。干活时,先从中央服务器取得最新的版本,干完活了,再把自己的活推送给中央服务器。

2. 分布式版本控制系统(Git、Mercurial) Alt text

每个人的电脑上都是一个完整的版本库,多人协作时,只需把各自的修改推送给对方,就可以互相看到对方的修改了。在实际使用分布式版本控制系统时,通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改。

在Windows上安装Git

  • msysgit是Windows版的Git,从http://msysgit.github.io/下载。
  • 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
mkdir mydemo && cd mydemo //
git init //初始化一个git项目

Git基础操作命令

命令 功能
git add 提交到暂存区
git commit -m "" 从暂存区提交到当前分支
git status 查看状态
git diff 对比工作区与版本库内容
git log 查看所有commit记录
git reflog 查看所有操作记录
git reset --hard HEAD^^ 回退到上一个版本
git reset --hard commitID 回退到指定版本
git reflog 显示所有操作记录
git checkout -- <文件名> 取消工作区内容,拿暂存区或版本库内容替换
git checkout xxx 切换到xxx分支
git diff HEAD -- <文件名> 对比工作区和版本库最新版本的修改
git remote add <库地址> 关联远程库
git remote rm <库地址> 取消远程库关联
git push :gh-pages 本地删除远程github分支(原理:推送空白分支覆盖)
git clone <库地址> 克隆远程库到本地
git branch 查看分支
git checkout -b xxx 创建并切换到新分支
git merge xxx 合并xxx分支到当前
git branch -d xxx 删除xxx分支

Git工作区和暂存区概念

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区

版本库(Repository)

工作区有一个隐藏目录.git,这个就是Git的版本库。 Git的版本库里有一个称为stage暂存区,还有Git为我们自动创建的第一个分支master。

第一步:git add把提交的修改放到暂存区(Stage)。

Alt text

第二步:git commit把暂存区的修改提交到分支。

Alt text

Git的常见操作

1. 修改回退

git checkout — xxx 撤销工作区的文件,用暂存区or版本库替换
git reset HEAD xxxx 丢弃暂存区的修改

已提交到暂存区,没有入库

git reset HEAD xxxx //丢弃暂存区的修改
git checkout — xxx // 撤销工作区的文件,拿版本库替换工作区

已提交到暂存区,且已入库

git reset –hard HEAD^ //直接使版本回退上一版本

把删除操作添加到暂存区

git add xxx  // 错误
git rm xxx  // 正确

暂存区 回退:git reset HEAD xxxx 版本库 回退:git reset --hard HEAD^

2. 删除文件

文件管理器中删除 或 rm命令删除 从版本库删除:git rm删掉,并且 git commit: 从版本库恢复:git checkout -- <文件名>

3. 其他操作

命令 操作
git add files 把当前文件放入暂存区域
git commit 给暂存区域生成快照并提交
git reset -- files 用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件
git checkout -- files 把文件从暂存区域复制到工作目录,用来丢弃本地修改
git commit -a 相当于运行 git add 把所有当前目录下的文件加入暂存区域再运行git commit
git commit files 进行一次包含最后一次提交加上工作目录中文件快照的提交。并且文件被添加到暂存区域
git checkout HEAD -- files 回滚到复制最后一次提交

Git远程操作详解

指令 操作
git clone 版本库的网址 从远程主机克隆一个版本库
git remote
git remote -v 参数-v,列出远程主机网址
git remote add <主机名> <网址> 参数add,添加远程主机
git remote rm <主机名> 参数rm,删除远程主机
git remote rename <原主机名> <新名> 参数rename,远程主机改名
git fetch
git fetch <远程主机名> <分支名> 取回远程主机的更新到本地
git branch -r <远程主机名> <分支名> 查看远程分支
git branch -a 查看所有分支(包括远程分支)
git pull
git pull <远程主机名> <远程分支名>:<本地分支名> 取回远程主机某个分支的更新,再与本地的指定分支合并
git push
git push <远程主机名> <本地分支名>:<远程分支名> *

SSH验证

第一步:创建SSH-key: 打开Git Bash 输入:

$ ssh-keygen -t rsa -C "youremail@example.com"

在用户主目录里将会生成.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第二步:登录Github => [Add SSH Key] => 粘贴id_rsa.pub里内容

SSH警告

当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?

这是因为SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

杀手锏—分支管理

分支管理常用命令

命令 功能
git branch 查看分支
git branch <分支> 创建分支
git checkout <分支> 切换到分支
git checkout -b <分支> 创建+切换分支
git merge <分支> 合并分支到当前分支
git branch -d <分支> 删除分支
git branch -D <分支> 强行删除没被合并的分支
git merge --no-ff -m "" dev merge时会生成一个新的commit

分支策略

  1. master分支应该是非常稳定的,仅用来发布新版本。
  2. 干活都在dev分支上,dev分支是不稳定的。到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
  3. 小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了 Alt text

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

Bug分支

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场

首先,隐藏当前工作现场

git stash

确定要在哪个分支上修复bug,就从那个分支创建临时bug分支

$ git checkout master
$ git checkout -b issue-101

修复bug,然后提交

$ git add readme.txt 
$ git commit -m "fix bug 101"

切换到master分支,完成合并,最后删除bug分支

git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101

最后回到dev分支干活

$ git checkout dev

多人协作的工作模式:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

注意:

如果git pull提示“no tracking information”,则用命令git branch --set-upstream dev origin/dev 创建本地分支和远程分支的关链。

查看远程库信息,使用git remote -v;

本地新建的分支如果不推送到远程,对其他人就是不可见的;

标签管理

Git的标签是版本库的快照,它指向某个commit的指针。发布一个版本时,先打一个版本标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。

配置git

忽略特定文件

配置命令

git config --global alias.

Git服务器搭建

untracted 无踪迹的

-----------------------------------------

git log 命令

git log 命令

[-p] 显示patch

[--color] 彩色模式

[--stat] 统计

[--pretty=...] 格式化显示格式

[--short] 短格式

[--graph] 文本图形显示,查看分支之间的状况很有用

[--reverse] 逆向显示日志

[--topo-order] 拓扑结构来显示,可以看清各个提交和分支

git diff $git diff [--cached]

--cached参数只显示将要被提交的改变

$git diff branch1..branch2

比较两个分支

$git diff HEAD

比较当前工作目录和上次提交(HEAD)

$git diff file

比较file在当前工作目录和上次提交

[--stat] 统计数据

git pull $git pull repourl branchname

默认的branch_name是master,这会将远程的repo拉过来并且和当前分支合并。

远程工作时,可以添加别名

$git remote add aliasname repourl

$git fetch alias_name

fetch命令只会拉下来更新,而不会执行merge工作

$git merge aliasname/branchname

git tag git tag用来为某个提交创建一个轻量级标签

$git tag stable-1 1b2e3f

如果想为标签添加注释,那么需要创建一个标签对象。创建标签对象后,一个对象就会被添加到git对象库中,然后标签指向这个对象

$git tag [-a|-s|-u] stable-1 1b2e3f

签名的标签

git config user.signingkey

github 创建项目主页page

  • 登录github 新建一个 mybook项目 仓库
  • 建立本地git的远程关联
git remote add mybook git@github.io/xxx.git //
git checkout -b ph-pages // 建立ph-pages分支
git add xxx   
git commit -m ""  //将要发布的内容提交入库

git push mybook -u ph-pages //推送到远程仓库并 -u参数建立绑定

通过访问http:///github.io/<项目名> 访问项目主页

© QIANSR all right reserved,powered by Gitbook该文件修订时间: 2015-11-30 18:55:21