一、初识
1、概念
Git 是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理。特点:项目越大越复杂,协同开发者越多,越能体现出 Git 的高性能和高可用性。
Git 之所以快速和高效,主要依赖于它的两个特性:直接记录快照,而非差异比较;几乎所有操作都是本地执行。
2、git 和svn的区别
-
存储方式: git是分布式的,有本地和远程两个版本库,SVN是集中式,只有一个远程版本库;
-
git 有工作区,暂存区,远程仓库,git add将代码提交到暂存区,commit提交到本地版本库,push推送到远程版本库。svn是add 提交到暂存,commit是提交到远程版本库。
-
版本控制差异: git是基于快照进行版本控制,快照是在原有文件版本的基础上重新生成一份新的文件,类似于备份。为了效率,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。SVN是基于差异的版本控制,它们存储的是一组基本文件和每个文件随时间逐步累积的差异。
-
文件目录差异
git目录结构
- .git
- hooks 钩子文件
- applypatch-msg.sample
- commit-msg.sample
- fsmonitor-watchman.sample
- fsmonitor-watchman.sample
- pre-applypatch.sample
- pre-commit.sample : commit时会触发这个钩子
- pre-push.sample : push触发
- pre-rebase.sample
- pre-receive.sample
- prepare-commit-msg.sample
- update.sample : update触发
- info
- exclude : 忽略的文件
- object : git数据对象,包括commit,trees,二进制对象,标签等
- COMMIT_EDITMSG : 上一次提交的注释信息
- log : 各个refs的历史信息
- refs : 每个分支指向那个提交
- config : 本项目配置信息,包括仓库地址,分支,用户账号等
- description : 项目描述
- HEAD : 当前分支的最后一次提交
- index : 索引文件,存贮git add把要添加的项
- packed-refs : 分支标识文件
- hooks 钩子文件
svn目录结构
- .svn
- pristine 各个版本纪录,这个文件一般较大
- tmp
- entries 当前版本号
- format 文本文件, 放了一个整数,当前版本号
- wc.db 二进制文件
- wc.db-journal 二进制文件
- .git
-
命令对比
| 作用 | git | svn |
|---|---|---|
| 版本库初始化 | git init | svn create |
| clone | git clone | svn co(checkout) |
| add | git add (.除去.gitignore,*所有的文件) | svn add |
| commit | git commit | svn commit |
| pull | git pull | svn update |
| push | git push | - |
| 查看工作状态 | git status | svn status |
| 创建分支 | git branch <分支名> | svn cp <分支名> |
| 删除分支 | git branch -d <分支名> | svn rm <分支名> |
| 分支合并 | git merge <分支名> | svn merge <分支名> |
| 工作区差异 | git differ (-cached / head) | svn diff |
| 更新至历史版本 | git checkout | svn update -r |
| 切换tag | git checkout | svn switch |
| 切换分支 | git checkout branch | svn switch branch |
| 还原文件 | git checkout -path | svn revert path |
| 删除文件 | git rm path | svn rm path |
| 移动文件 | git mv path | git mv path |
| 清除未追踪文件 | git clean | svn status sed -e |
二、常用操作
* 初始化仓库 并提交到远程仓库
git init: 初始化一个本地仓库,在同级目录下会出现一个隐藏的.git文件
git add .
git commit -m '初始化仓库‘
git push origin master
* 仓库迁移
git clone --bare git@ip:port/test-new.git 下载新仓库地址(含操作日志信息)
cd test-new
git push --mirror git@ip:port/test-old.git 将代码强制提交到新仓库中
三、常用命令
* git config : 查看git配置信息
- git congif -l : 查看Git配置信息
- git config user.name 'ai' : 设置用户名
- git config user.email 'xxxxxx@qq.com' : 设置邮箱
* git init : 初始化git仓库
* git clone : 代码克隆
- git clone <远程仓库地址>
- git clone --bare <远程仓库地址> : 下载远程仓库代码,并带log信息
* git add: 将文件从工作目录提交到暂存区
- git add [file1] [file2]
- git add [dir]
- git add .
* git commit: 将文件提交到本地仓库
- git commit -m '注释内容' : 将文件从暂存区提交到本地仓库
- git commit -amend : 将文件从暂存区提交到本地仓库(会带入上次提交点的注释信息)
- git commit -a -m '注释内容' : 将文件从工作区提交到本地仓库(git add和git commit 组合)
* git push : 将文件从本地仓库提交到远程仓库
- git push <远程仓库地址> <本地分支名称>:<远程分支名称> : 将本地分支上传到远程并合并
- git push origin <本地分支名称>:<远程分支名称> :将本地分支上传到远程并合并,如果远程分支名称和本地分支一致可不传
- git push origin <标签名称> :将标签推送到远程仓库
- git push --mirror <远程仓库地址> : 将代码强推到远程仓库
- git push origin --delete <远程分支名称> : 删除远程分支
* git status:查看上次提交之后是否有对文件进行再次修改
- git status
- git status -s:输出简短信息
* git branch : 分支相关操作
- git branch 新分支名称 : 创建分支(在当前所在分支基础上创建一个分支)
- git branch 新分支名称 标签名称 : 创建分支(根据标签创建分支)
- git branch tjd-3 提交点id(6e5d12d) : 根据提交点创建分支
- git branch -v :查看分支信息
* git checkout : 分支相关操作
- git chekcout 分支名称:切换分支
- git checkout -b 分支名称:创建并切换分支
- git checkout -d 分支名称:删除分支(仅删除引用)
* git merge 分支名称: 分支合并(合并后在本地分支)
* git rebase 分支名称:将当前分支新增的提交点 提交到指定分支后面(合并起来减少分支)(不建议使用)
* git reflog : 查看git提交引用日志
* git reset: 提交记录回退,一般配合reflog使用(实质上是修改head的引用)
- git reset --mixed(默认可不写)提交点标识 : 移动本地库的HEAD指针,被回滚的代码在暂存区
- git reset --soft 提交点标识: 移动本地库的HEAD指针,重置暂存区,重置工作区
- git reset --hard 提交点标识 : 移动本地库的HEAD指针,重置暂存区
- git reset --keep 提交点标识 : 移动本地库的HEAD指针,重置工作区
提交点标识:可以通过git reflog 查看 提交点hash值 或者 HEAD~数字(当前版本回退几个)HEAD^(回退一个)或者 标签
* git revert : 撤销提交
- git revert -n <提交点标识> : 撤销某一提交点,但不影响后面的版本
* git tag : 标签相关
- git tag -a <标签名称> <提交点信息ID> -m <注释内容> : 根据提交点创建分支(创建后在本地仓库,使用 git push origin <标签名称> 推送到远程仓库)
- git tag -l : 查询所有tag
- git tag -l | grep stg或git tag -l "stg2020*" : 过滤指定字母开头的tag
- git tag -d <标签名称> : 删除本地仓库tag
- git push -d origin $(git tag -l "stg2020*") : 删除远程标签
* git log : 操作日志相关
- git log -p:查看commit详细的改动
- git log --stat:查看commit重大改动
- git log --pretty=oneline
- git log --oneline
- git log --oneline --graph ### * git diff :文件比较
- git diff --staged(或者 --cached):查看暂存区和上一条commit的区别
- git diff: 查看工作目录和暂存区的区别
- git diff HEAD:查看工作目录和上一条commit的区别
* git show:查看某个具体的commit
- git show commit的引用(或SHA-1)
- git show 文件名称
* git fetch:仓库代码同步到本地
* git pull <仓库地址> <分支名称(可选)>: 仓库代码同步到本地,并合并到当前本地分支(pull=fetch+merge)
* git remote : 远程库相关
- git remote add 连接名 远程地址 : 连接远程仓库
- git remote -v : 查看远程仓库信息
四、核心概念
HEAD、master、branch区别
HEAD:当前分支,最新提交点引用
master: 核心分支,创建项目的默认分支
branch: 分支 实际上就是提交点点引用
git四大区域及区域之间的转换
git存储结构
五、git flow
流程常用分支
- Production分支(master分支):也就是我们常用的master分支,这个分支只能从其他分支合并,不能在这个分支直接修改
- Develop分支(主开发分支):主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,Feature分支
- Feature分支(开发分支):用来开发新功能的分支,一旦开发完成后将合并回Develop分支进入下一个Release
- Release分支(预发布分支):当需要发布一个新的Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支
- Hotfix分支(bug补丁修复分支):当我们Production发现新的bug的时候,我们需要创建一个HotFix,完成Hotfix后,我们合并回master和Develop分支,所有 HotFix的改动会进入下一个Release