一、基本操作
1、版本控制工具
- 集中式:CSV ,SVN,VSS
- 分布式:Git,Darcs,...
2、配置用户信息
- 项目配置文件:文件在当前项目下.git/config
#项目配置文件,本地所有的文件夹有效,经常用
git config --global user.name "XXX"
git config --global user.email "XXX"
#查看配置信息
git config --global --list
- 全局配置文件:文件在~/.gitconfig
#当前的文件夹有效,很少用
git config --local user.email "XXX"
git config --local user.name "XXX"
- 系统配置文件:文件在/etc/.gitconfig,需要root权限
#当前系统文件夹有效,基本不用
git config --system user.email "XXX"
git config --system user.name "XXX"
3、基本操作
- 初始化
git init
注意:生成的 .git 目录中存放的是本地库相关文件,不要删除,删除意味着git不再管理本文件夹文件,而且之前提交的本地版本都将会消失
- 查看状态
git status #查看工作区、暂存区状态
- 添加文件至暂存区
git add .
- 提交
git commit -m "XXX"
- 重命名
git mv XXX XXXX
4、查看日志
git log
git reflog #常用
git log -n4 #查看最近的4个记录
git log --greph #图形显示,更直观
git log --pretty=oneline #漂亮一行显示
git log --oneline #简洁显示
说明:HEAD@{移动到当前版本需要多少步}
- pretty查看log日志
相比上图,信息显示得更加简洁
git log --graph --pretty=format:"%h %s"
5、回滚操作
- 回滚至之前的版本
git log
git reset --hard 版本号
- 回滚至之后的版本
git reflog
git reset --hard 版本号
- 使用 ^ 符号:只能回滚
git reset --hard HEAD^
例子:git reset --hard HEAD^^
注意:几个 ^ 表示后退几步
- 使用 ~ 符号:只能回滚
git reset --hard HEAD~n
例子:git reset --hard HEAD~4
- reset的三个参数比较
soft:
- 仅本地库移动HEAD 指针
mixed:
- 在本地库移动HEAD指针
- 重置暂存区
hard:
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
二、分支操作
- 查看分支
git branch
- 创建分支
git branch 分支名
- 切换分支
git checkout 分支名称
git checkout -b dev
注意:git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
- 合并分支
git merge 要合并的分支
注意:执行合并命令之前需要先切换到主分支(master)。合并的时候可能产生冲突,此时需要手动删减代码。
- 删除分支
git branch -d 分支名称
注意:一般合并过后,就会将合并后的分支删除。比如,线上出现bug,为了修复bug创建了bug分支,在修复bug后并将代码合并到主分支后,此时需要将bug分支删除。
三、Git和GitHub
1、 创建远程库
git remote -v #查看远程地址别名
git remote add 别名 远程地址
例子:git remote add origin https://xx
2、生成公钥
- 配置验证信息使用以下命令生成 SSH Key:
ssh-keygen -t rsa -C "[email protected]"
注意:后面的 [email protected] 改为你在 Github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在 ~/ 下生成 .ssh 文件夹,进去,打开 id_rsa.pub,复制里面的 key。
回到 github 上,进入 Account => Settings(账户配置)。
参考地址:https://www.runoob.com/git/git-remote-repo.html
- 验证配置验证信息是否成功,输入以下命令:
ssh -T [email protected]
3、推送代码
git push 别名 分支名
git push -u 别名 分支名 #-u指定默认主机
例子:git push origin master
4、克隆代码
完整的把远程库克隆到本地克隆下来后不要在主分支里面做开发 clone进行一次,从无到有的过程,更新用pull
git clone 仓库地址
5、拉取代码
本地存在clone下来的文件 就用pull更新
pull = fetch + merge
git fetch 别名 分支名
git merge 别名 分支名
git pull 别名 分支名
四、rebase(变基)
1、第一种情况:整合提交记录
比如:用如下命名分别创建a.py、b.py、c.py、d.py文件,并提交至版本管理区。
touch a.py
git add .
git commit -m "a.py"
查看提交记录如下:
Administrator@WIN-768K0UMH43F MINGW64 ~/Desktop/gitrest (master)
$ git log
commit 0b60ce7cf6c285737a594c7729b590377c65273b (HEAD -> master)
Author: xtank
Date: Thu Feb 20 12:06:26 2020 +0800
d.py
commit 26f9353e9614cecf2cd359f92a8cb00a99ee3fec
Author: xtank
Date: Thu Feb 20 12:06:08 2020 +0800
c.py
commit 74627eb94e9bcd3ae9a0618bd05dd646b9be53ae
Author: xtank
Date: Thu Feb 20 12:05:58 2020 +0800
b.py
commit ee27005a1e294456648332f2e53b00121f2326c2
Author: xtank
Date: Thu Feb 20 12:05:42 2020 +0800
a.py
现在想把第二次至第四提交的记录合并:
git rebase -i HEAD~3
注意:此命名和图片命名是一样的效果。合并的时候需要注意,这些合并的版本是提交至本地版本管理区的版本,而已经提交至远程仓库的版本最好不要合并。
2、第二种情况:合并记录
将分支记录合并到主线记录,使得开发提交记录看起来更简洁,缺点是信息没有那么详细。
比如:在主分支上开发到了一些功能,然后创建了dev分支,然后在dev分支上开发了一些功能,接着再切换到master分支,又开发了一些功能,现在把dev分支代码合并到master分支,使用的方法是merge。如图所示:
然后,继续分别在master分支和dev分支上进行开发。接着,切换到dev分支,执行变基命令
git checkout dev
git rebase master
注意:相当于将master分支合并到dev分支。在dev分支查看log,如图所示:
最后,再切换至master分支,再用merge命名合并dev分支
git checkout master
git merge dev
查看log信息,如图所示,可以看到master分支和dev分支的记录已经变成一致。也就是把,两个分支的日志合并到一块。
3、第三种情况:不产生分叉
两地开发的时候,比如在家和公司办公的时候,在家开发的功能到公司后,需要先pull到公司电脑,此时会产生分叉,为了不产生分叉,可以如下操作:
#原来的操作方式,就是在公司电脑上执行git pull
git pull origin
#而git pull的功能相当于下面两个命名
git fetch
git merge
#为了不分叉,现在执行
git fetch origin dev
git rebase origin/dev
五、冲突解决
1、冲突解决步骤
- 第一步:编辑,删除特殊标记
<<<
===
- 第二步:修改到满意位置,保存退出
- 第三步:添加到缓存区
git add 文件名
- 第四步:提交到本地库
git commit -m '日志信息'
注意:后面一定不能带文件名
2、beyond compare工具
beyond compare冲突解决工具。Beyond Compare是一款Scooter Software研发的文件对比工具。你可以选择针对多字节的文本、文件夹、源代码,甚至是支持比对adobe文件、pdf文件或是整个驱动器,检查其文件大小、名称、日期等信息。你也可以选择使用Beyond Compare合并两个不同版本的文件或文件夹。
官方下载地址:http://www.scootersoftware.com/
破解地址:https://www.onlinedown.net/soft/23172.htm
1、安装配置
git config --local merge.tool bc3
git config --local mergetool.path 'beyond compare安装目录'
git config --local mergetool.keepBacup false
注意:--local只对本项目有效,若要改成全局有效需要改为--global
2、简单使用
六、工作流
1、工作流分类
- 集中式工作流
像SVN一样,集中式工作流有一个中央仓库,所有的修改都提交到了Master分支上
- GitFlow工作流
主干分支master
开发分支develop
修复分支hotfix
预发布分支release
功能分支feature
GitFlow 有独立的分支,让发布迭代过程更流畅。
- Forking 工作流
在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。
安全可靠地管理大团队的开发者
2、单人两地办公流
一般在公司开发某些功能后,再推送到github,到家后首次需要克隆在本地,以后就可以用git pull origin 更新代码。
3、开发最简单工作流
开发中最简单的工作流是创建两条工作流,一条是正式版本线,一条是dev(开发)版本线。当dev开发完一个新功能后,再合并到正式版本线。开发的时候只在dev线上完成。
4、多人协同开发工作流
一般在大型公司开发人员都会有自己的分支,每个人在自己的分支上进行代码管理,然后报给领导review,代码通过后再上线。
七、git忽略文件
让git不再管理当前目录下的某些文件。比如某些敏感文件就不能推送到github上以免造成信息泄密。
*.h
files/
*.py[c/a/d]
忽略文件的原则:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件;忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
参考文件:https://github.com/github/gitignore
参考文件:https://www.liaoxuefeng.com/wiki/896043488029600/900004590234208
八、免密登录
1、URL中免密登录
原地址:https://github.com/v2net/Apple.git
修改后的地址:https://用户名:密码@github.com/v2net/Apple.git
git remote add origin https://用户名:密码@github.com/v2net/Apple.git
git push origin master
2、SSH登录
1、在本地生成公钥私钥,将公钥内容复制至github
ssh-keygen
2、登录GitHub。Settings --> SSH and GPG keys --> New SSH Key
3、回到本地配置SSH地址。git remote add 别名 SSH地址
比如:git remote add origin https://github.com/v2net/Apple.git
3、GIt自动管理凭证
git自动管理登录凭证
九、Tag标签
为了清晰的版本管理,公司一般不会直接使用commit提交
git tag -a v1.0 -m '版本介绍' #创建本地tag信息
git tag -d v1.0 #删除tag
git push origin v1.0
git push origin --tags #将本地tag信息推送到远程库
git pull origin --tags #拉取到本地
git checkout v.10 #切换tag
git clone -b v0.1 地址 #指定tag下载代码