Git教程
Git简介和安装
Git是一个先进的分布式版本控制系统,由Linux的大牛Linus创建。
1. 集中式版本控制系统(svn、cvs)
版本库集中存放在中央服务器。干活时,先从中央服务器取得最新的版本,干完活了,再把自己的活推送给中央服务器。
2. 分布式版本控制系统(Git、Mercurial)
每个人的电脑上都是一个完整的版本库,多人协作时,只需把各自的修改推送给对方,就可以互相看到对方的修改了。在实际使用分布式版本控制系统时,通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改。
在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 |
本地删除远程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)。
第二步:git commit把暂存区的修改提交到分支。
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 |
分支策略
- master分支应该是非常稳定的,仅用来发布新版本。
- 干活都在dev分支上,dev分支是不稳定的。到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
- 小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了
合并分支时,加上--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
多人协作的工作模式:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用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://