Git是一个开源的分布式版本控制系统,可以有效、高速的处理或大或小的项目版本管理。Git起初是由Linus Torvalds开发的。由于在工作中需要写大量的shell和python脚本,为了方便自己的工作和修改调整,尝试使用git在linux上对相关的脚本进行版本管理,由于之前使用更多的是svn,对git的了解相对较少,只能参考这网上的相关文档一点点的熟悉和操作,期间也试过几次大坑,导致之前的数据都没了。
目前版本控制系统主要有两种,分别是集中式版本控制系统(如CVS和SVN)和分布式版本控制系统(如Git)。
集中式版本控制系统:有一个中央服务器,所有代码库都只保存在其中,工作时都用的自己电脑,从服务器获取,提交时最终都要汇总到中心服务器。总之,服务器挂了,所有库都完蛋了。而且必须要联网的情况下才能使用,上传速度也慢。
分布式版本控制系统:分布式版本控制系统没有中央服务器,每个人的电脑上都是一个完整的版本库,只要交换对方的修改就行,把各自的修改推送给对方。而且分布式版本控制系统也有一台充当“中央服务器”的电脑,只是用来交换修改之用。
区别:集中式需要联网,分布式不需要;集中式上传速度慢,分布式快;集中式必须要有中心节点才能干活,分布式可以不需要;集中式不需要初始化很多东西就能干活,而分布式则要拷贝整个历史记录。
好的工具,还是需要一点一点的去学习理解的。一切知识都没有捷径的,继续要理论支持,也需要实践去验证。
1 安装和创建版本库
1.1 安装配置
Mac OS,Linux和Windows对git都支持。
git基础配置:
|
|
解释:git config命令的–global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
1.2 创建版本库
版本库=仓库(repository),也可以理解为一个目录。
Step1:Linux创建一个目录
|
|
Step2:git init将目录变成Git可以管理的仓库
|
|
Step3:添加文件到Git仓库里
|
|
2 版本管理
2.1 版本修改查看
在README.txt中添加“This is the README.txt!”,然后使用git status
查看相关的状态
|
|
git diff
查看文件的修改的内容
|
|
然后git add
添加进缓存区
|
|
使用gitcommit
提交到仓库
|
|
2.2 版本回退
git log
可以查看最近到最远的详细提交日志
|
|
git log --pertty=oneline
简略显示最近的日志
|
|
在Git中使用HEAD^表示上一个版本,HEAD^^表示上上个版本。
git reset --hard HEAD^
回退到上一个版本
git reset --hard 091320b2
回退到指定版本
回退到某个版本后,若是又想恢复到新版本,先执行git reflog
找到历史命令中要恢复的版本commit id,然后执行git reset --hard commit_id
2.3 工作区和缓存区
Git和其他版本控制系统不同的是拥有一个暂存区的概念
- 工作区(Working Directory):就是在电脑中能看到的目录
- 版本库(Repository):即工作区中的隐藏目录“.git”
GIT的版本库里存了最终能够的称为stage
或者叫index的暂存区
Git会自动创建的第一个分支master和指向master的一个指针HEAD
暂存区就是存放修改后的代替叫文件,git add
命令就是将要提交的所有修改放到暂存区(Stage),而git commit
命令就是将暂存区的所有修改提交到分支。
2.4 管理修改
git diff HEAD -- README.txt
查看工作区和版本库里面最新版本的修改信息。
每次修改文件后,若是不把修改内容add进暂存区,就无法加入到commit中。
2.5 撤销修改
git checkout -- file
可以丢弃工作区的修改,有可能回到最近一次的git commit
状态或是git add
的状态。
|
|
git reset HEAD file
把暂存区的修改撤销(unstage),重新返回工作区
git reset
命令既可以回退版本,也可以吧暂存区的修改回退到工作区。当用HEAD时,便是最新的版本。
2.6 删除文件
本地命令删除rm README.txt
,然后版本库中删除命令git rm README.txt
git checkout -- README.txt
若是删除后想恢复
3 远程仓库
Github托管:注册帐号后,本地Git仓库和Git远程仓库之间的传输是通过SSH加密的。
设置如下:
Step1:创建SSH Key,Shell下或Git bash下执行——$ ssh-keygen -t rsa -C “邮件地址”
,一路设置,最终在用户主目录年里面生成ssh目录,里面包含公/私钥两个文件。
Step2:登录Github,打开“Account settings”,“SSH Keys”页面,然后点击“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa_pub
文件内容,然后点击“Add Key”,Key添加成功。
GitHub允许添加多个Key,以便可以在多台电脑上进行提交。
3.1 添加远程库
在Github上创建一个仓库,以便与本地仓库同步。
由于Github上的learn_android
仓库是空的,需要将本地仓库与之关联。
本地仓库下执行:
将当前分支master推送到远程仓库。
第一次推送加-u
参数,不仅为了将本地的master分支推送到远程新的master分支,还可以将本地的master分支和远程master分支关联起来,以便以后的推送和拉去中简化命令。
|
|
3.2 从远程库克隆
git clone
克隆一个本地库
$ git clone git@github.com:GitHub账号名/仓库名.git
SSH方式
**https://github.com/
Https方式
GitHub账号名/仓库名.git\
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
4 分支管理
4.1 创建分支和合并分支
创建dev分支,然后切换到dev分支
|
|
git branch
查看分支
|
|
切换回master分支
合并dev分支到master分支
合并后删除dev分支
4.2 解决冲突
当Git无法自动合并分支时,必须先解决冲突。
冲突解决后,再add和commit。
git log --graph
查看分支合并图
4.3 分支管理策略
通常,合并分支时,如果可能,Git会用“Fast forward”模式,但这种模式下,删除分支后,会丢掉分支信息,所以若是想要保留合并的历史,在merge时加上–no-ff参数就会使用普通模式进行合并,而且合并后在版本库中会有记录。
|
|
4.4 Bug分支
若是在某个开发分支工作进行到一半,需要修复一个已有版本的bug,那么先将工作现场储藏起来,执行以下命令:
|
|
假设需要在master分支进行修改,则创建临时分区,执行以下命令:
修改完成后在master分支进行修改,则创建爱你临时分支
修改完成后在合并,然后撒谎年初临时分支,最后再切回之前的开发分支
恢复之前保存的内容,并将stash的内容删除
git stash apply
恢复git stash drop
删除
4.5 Feature分支
开发一个新feature时,最好新建一个分支,若是要丢弃一个没有被合并过的分支,执行强制删除命令:* git branch -D 分支名称*
4.6 多人协作
查看远程库的信息
|
|
git push origin master
推送本地master分支到远程库
git push origin dev
推送本地dev分支到远程库
git checkout -b dev origin/dev
假设要在dev分支上开发,则创建远程仓库origin的dev分支到本地
注意:git push origin dev
若是失败,就先用git pull从origin/dev拉取更新,本地合并解决冲突后再推送,若git pull也失败,出现“no tracking information”提示,原因可能是没有指定本地dev分支与远程origin/dev分支的链接,那么,我们设置链接:
|
|
故障排查:
- 首先,可以试图用 git push origin branch-name 推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin branch-name 推送就能成功。
5 标签管理
5.1 创建标签
切换到打标签的分支
|
|
打标签
|
|
查看所有标签
|
|
在commit id是“6224937”的版本上打标签
|
|
查看标签信息
|
|
创建带有说明的标签:-a
指定标签名,-m
指定说明文字
|
|
通过-s
用私钥签名(签名采用PGP签名的)
|
|
5.2 操作标签
标签打错了,需要删除
|
|
推送某个标签到远程
|
|
标签已推送到远程,先从本地删除
|
|
然后从远程删除。
|
|
6 自定义Git
Git显示颜色
|
|
配置别名
|
|
配置又颜色格式等信息的log
|
|