文章目录
Git知识总结
SVN是集中式版本控制工具:
- 单点故障的时候数据全没
- 历史记录存在集中服务器
Git是分布式版本控制工具
- 可以避免单点故障
- 每个单机都有历史记录
- 每个单机都可以做版本控制
Talk is cheap, show me the code. ----Linus
个人开发:
为了对功能更好的控制,方便自己多次修改,有利于思路的改变
团队协作:
多人开发过程中容易引起同一文件的内容冲突,需要一个版本管理。
具备功能
- 协同修改
- 多人并行修改服务器的同一个文件
- 数据备份
- 不仅保存目录和文件的当前状态,还能够保存每一个提交过得历史状态
- 版本管理
- 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约空间,提高运行效率
- SVN采用的是增量式管理的方式,Git采用了文件系统快照的方式
- 权限控制
- 对团队中参与开发的人员进行权限控制
- 对团队外开发者贡献代码进行审核–Git独有此功能
- 历史记录
- 查看修改人、修改时间、修改内容、日志信息
- 将本地文件恢复到某一个历史状态
- 分支管理
- 允许开发团队在工作中多条生产线同时推进任务,进一步提高效率
版本控制
根据工程设计领域使用版本控制管理蓝图,实现代码开发领域版本管理。
Git优势
- 大部分操作在本地完成,不需要联网
- 完整性保证,对数据进行hash操作保证完整性
- 尽可能添加数据而不是删除或修改数据
- 分支操作非常流畅
- 与Linux命令全面兼容
基础概念
本地库:历史版本
暂存区:临时存储
工作区:写代码
Git和代码托管中心
托管中心:维护远程库文件
Github
码云
Gitlab
本地库和远程库
一个本地库通过推送(push)到远程库,另外一个本地库通过clone到自己的本地库,加入到团队中,就可以实现push操作。本地库可以通过拉取(pull)操作从远程库拉取文件到本地库。
另外的团队可以通过fork将其他人远程库fork到自己的远程库,然后在自己的本地库clone下来,完成开发后,再push到远程库,在远程库通过提交PR(pull request)操作请求合并megre操作到开发团队的远程库,需要审核。
Git基础文件命令操作
- 本地库初始化
- git init
- .git目录中存放的是本地库中相关的子目录和文件,不要删除,也不要乱修改。
- 设置签名
- 形式:
- 用户名:txp
- email地址:aa@aa.com
- 用于区分不同开发人员的身份
- 这里设置的签名和远程库的账号密码没有任何关系
- 命令:
- 项目级别/仓库级别:仅在当前本地库生效
git config user.name txp_pro
git config user.email aa_pro@aa.com
- 系统用户级别:登录当前操作系统的用户范围
git config --global user.name txp_glb
git config --global user.email aa_glb@aa.com
- 上面的设置保存在
~/.gitconfig
文件中 - 优先级:
- 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别
- 如果只有系统用户级别的签名,就以系统用户级别为准
- 二者都没有,不允许
- 项目级别/仓库级别:仅在当前本地库生效
- 形式:
- 状态查看
git status
- 查看文件提交状态
- 添加文件到暂存区
git add <file>...
追踪文件,将工作区的“新建/修改”添加到暂存区- 移除暂存区
git rm --cached <file>...
- 将文件提交到本地库
git commit -m "commit message" <file>
git commit -a
直接追踪并提交到本地库
- 撤回已经提交暂存区的修改文件
git restore --staged <file>...
to unstage 撤销已经修改的文件到暂存区
- 版本的前进与后退
- 历史记录
- 显示提交日志
git log
显示全部日志git log --pretty=oneline
显示完整hash值的每一行日志git log --oneline
hash值缩短显示每一行日志,只显示当前到以后的日志git reflog
移动到当前版本需要的步数
- 在及历史记录上前进或后退
- HEAD指针
- 基于索引值操作
- 根据
git reflog
查看文件索引值 git reset --hard a83a04e
退回到某一个索引值的文件记录
- 根据
- 基于^符号
- 只可以往后退
git reset --hard HEAD^
一个^异或符号退一步,多个退多步
- 使用~符号
- 只可以往后退
git reset --hard HEAD~n
表示后退n步
- reset 三个命令对比
- –soft
- 仅仅在本地库移动HEAD指针
- –mixed
- 在本地库移动HEAD指针
- 重置暂存区
- –hard
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
- –soft
- 历史记录
- 删除文件再找回
- 添加到本地库
- 这个文件已经提交到本地库
- git只增加版本不删除版本
- 通过版本回退找到文件
- 工作区已经不存在但是本地库已经存在
- 添加到暂存区
- 使用
git reset --hard
命令
- 使用
- 删除前文件存在时的状态提交到了本地库
- 操作已经提交到本地库:指针位置指向历史记录
- 操作尚未提交到本地库:指针位置使用HEAD
- 添加到本地库
- 比较文件
git diff <file>
和暂存区比较git diff HEAD <file>
和历史版本比较git diff
比较工作区所有文件
Git分支管理
以功能开发为分支管理
master
feature_blue
feature_game
hot_fix
分支好处:
- 同时并行推进功能开发,提高开发效率
- 各个分支在开发的过程中,如果某一个分支开发失败,不会对其他的分支有任何影响,失败的分支删除重新即可。
分支操作
创建分支
git branch <branch name>
查看分支
git branch -v
git branch -a
切换分支
git checkout <branch name>
合并分支
- 切换到接收修改的分支上(被合并分支,增加新内容)
git checkout <branch name>
- 执行
git merge <new branch name>
解决冲突
- 修改同一个文件同一个位置,就会引起冲突,需要手动解决冲突。
- 冲突解决
- 编辑文件,删除特殊符号
- 修改文件到满意程度
git add <file name>
git commit -m "message"
不能加文件名
Git原理
采用hash
校验hash值,对比文件是否修改
git底层采用SHA-1
Git保存版本的机制
- 集中式版本控制工具的文件管理机制
- Git的文件管理机制
- Git把数据看做是小型文件系统的一组快照。
Git与远程仓库操作
git remote add <origin name default origin> <URL.git>
添加远程仓库git remote -v
查看远程仓库地址git push origin master
推送到远程仓库git clone <URL.git>
- 克隆远程仓库项目
- 不需要手动初始化本地仓库
- 创建origin远程地址别名
- 团队协作
- 邀请队员加入团队,并同意加入团队
- clone项目
- pull = fetch + merge
git fetch origin/master
拉取(抓取)远程的master分支数据git merge origin/master
合并远程的master分支数据- 冲突解决
- 对同文件操作每次推送先拉取,更新本地为远程最新版本
- 执行
git pull origin/master
- 执行
- 解决冲突,提交commit,push到远程
- 要点
- 如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先进行拉取
- 拉取下来后如果进入冲突状态,则按照”分支冲突解决“操作解决即可
- 类比
- 债权人:老王
- 债务人:小刘
- 老王说:10天后归还。小刘接受,双方达成一致。
- 老王媳妇说:5天以后归还。小刘不接受。老王媳妇需要和老王达成一致确认后再执行。
- 对同文件操作每次推送先拉取,更新本地为远程最新版本
- fork操作
- 通过GitHub上fork操作
- 在本地clone
- 修改项目提交commit
- push项目到自己的GitHub
- 发起PR(Pull Request),提交PR
- 可以通过PR请求中讨论对话
- 通过Merge Pull Request合并代码,通过PR请求
- 团队成员将修改后的远程库拉取到本地完成流程
- SSH连接
- 见其他博客
Git工作流
- 集中式
工作中不分支,用的少。 - GitFlow
功能开发、发布准备和维护都建立相应的分支 - ForKing
虚拟团队用的多。
GitFlow
避免在master分支修改
GitLab
查看官网教程。