文章目录
Git
Git 官网:https://git-scm.com/
Git 概述
Git 简介
-
Git 是一个代码协同管理工具。
-
Git 是一个开源分布式版本控制系统,可用于高效的管理大小项目。
-
Git 是2005年由 Linus Torvalds (Linux 之父)主导开发。
Git 的作用
-
防止代码丢失,可以做备份。
-
代码版本的管理,可以进行多个版本之间的跳跃。
-
可以方便的将代码在多人之间进行共享传输。
-
多人开发时,有各种模式可以方便代码管理。
Git 和 Svn
用的最多的两种代码管理工具:Git、Svn
分布式:每一个结点都保存完整的代码,没有统一的中央服务器,节点之间相互推送下载代码完成代码共享,例如git。
集中式:代码集中管理,每次完成的代码上传到中央管理器,然后再统一从中央管理器中下载代码使用,例如svn。
安装 Git
Windows下安装 Git
官网下载:https://git-scm.com/download/win
Linux 下安装 Git
$ sudo apt-get install git
$ git --version
git version 2.7.4
配置 Git
Git 有三个不同级别的配置文件,可以通过 git config
来配置。
-
系统级:系统中所有的用户都可以使用该配置,配置文件目录为
/etc/gitconfig
。# 查看系统级配置列表 git config --system --list
-
用户级:当前用户可使用该配置,配置文件目录为
~/.gitconfig
或~/.config/git/config
。# 查看用户级配置列表 git config --global --list
-
项目级:当前项目可使用该配置,配置文件目录为
./.git/config
。# 查看项目级配置列表 git config --list # 默认为 --local,与 git config --local --list 效果相同
每一个级别会覆盖上一级别的配置,所以 .git/config
的配置变量会覆盖 /etc/gitconfig
中的配置变量。也就是说优先级顺序为:项目级 > 用户级 > 系统级
。
常用配置:
# 查看所有的配置以及它们所在的文件
git config --list --show-origin
# 配置项目级用户名
git config user.name Hujingbo
# 配置项目级邮箱
git config user.email hujingbo98@163.com
# 配置项目级编辑器为 vim
git config core.editor vim
使用 Git
工作流
工作区中写代码 --> 添加到暂存区 --> 提交到本地仓库 --> 发布到远程仓库
工作区:就是项目所在的目录,编写代码的区域。
暂存区:如果项目中的文件想备份或者进行其他操作,需要将指定的文件先保存在暂存区。
本地仓库:本地仓库是真正保存备份或者其他操作文件的区域,只能被当前项目所在的目录使用。
远程仓库:如果想将某一个项目与其他主机进行共享或者传递,需要使用远程仓库。
# Git 工作流
#------------------------------------------------------------------------------
# 初始化仓库
git init
# 克隆现有仓库
git clone <url>
# 查看本地状态
git status
# 工作区 -> 暂存区
git add <pathspec> # 将指定的已修改文件提交到暂存区
git add <. | *> # 将当前目录下所有已修改的文件提交到暂存区
# 暂存区 -> 工作区
git restore --staged <file>...
# 暂存区 -> 本地仓库
git commit -m <msg>
# 撤销上次 commit
git reset HEAD~
#------------------------------------------------------------------------------
# 查看日志
#------------------------------------------------------------------------------
# 查看 commit 日志
git log
# 查看单行日志
git log --pretty=oneline
# 按补丁的格式输出日志
git log --patch
git log -p
# 查看提交的简略统计信息
git log --stat
#------------------------------------------------------------------------------
# 比较工作区文件和本地仓库文件的区别
git diff [<path>]
恢复操作
# 查看所有的历史版本
git reflog # 最新的操作始终在最上边
# 回到上一个版本
git reset --hard HEAD^ # HEAD后面的^数量决定了回到上几个版本
# 回到指定的版本
git reset --hard <commit_id> # 只需要commit id的前七位即可
标签管理(版本管理)
标签就是在当前工作的位置添加快照,保存工作状态,一般用于版本的迭代。
# 创建标签
#------------------------------------------------------------------------------
# 创建标签
git tag <tagname>
# 创建标签并设置提示信息
git tag <tagname> -m <msg>
# 默认是在最新的commit id处创建标签
git tag v1.0
# 指定某一个commit id处创建标签
git tag <tagname> <commit id>
#------------------------------------------------------------------------------
# 删除标签
git tag -d <tagname>
# 查看标签
#------------------------------------------------------------------------------
git tag
# 查看指定标签的具体信息
git show <tagname>
#------------------------------------------------------------------------------
# 推送标签操作到远程
#------------------------------------------------------------------------------
# 第一种:推送操作的标签
git push origin :refs/tags/<tagname>
# 第二种:更直观的删除远程标签的方式
git push origin --delete <tagname>
#------------------------------------------------------------------------------
# 检出标签
git checkout <tagname>
# 基于标签创建分支
git checkout -b <branch> <tagname>
# 恢复到指定标签的位置
git reset --hard <tagname>
贮藏操作
# 贮藏工作区的修改
#------------------------------------------------------------------------------
git stash
git stash push
# 贮藏新增文件
git stash -u
# 带备注贮藏
git stash save "备注"
# 带备注贮藏新文件
git stash save "备注" -u
#------------------------------------------------------------------------------
# 查看贮藏
git stash list
# 贮藏弹出
#------------------------------------------------------------------------------
# 弹出指定贮藏
git stash apply stash@{编号}
# 弹出最近的贮藏并删除
git stash pop
# 删除指定的贮藏
git stash drop stash@{编号}
# 删除所有的贮藏
git stash clear
#------------------------------------------------------------------------------
分支操作
# 查看分支
#------------------------------------------------------------------------------
# 查看分支,前面有 * 的分支为当前检出分支
$ git branch
# 查看所有分支
$ git branch --all
# 查看每一个分支的最后一次提交
$ git branch -v
# 查看哪些分支已经合并到当前分支
$ git branch --merged
# 查看所有包含未合并工作的分支
$ git branch --no-merged
# 查看尚未合并到master分支的有哪些?
$ git branch --no-merged master
#------------------------------------------------------------------------------
# 分支创建
git branch <分支名称>
# 分支切换
git checkout <分支名称>
# 创建并切换到新的分支:
git checkout -b <分支名称>
# 合并分支
#------------------------------------------------------------------------------
# 将指定的分支合并到当前分支
git merge <分支名称>
# 注意: 合并过程中如果没有冲突,直接合并后当前分支即为干净的状态,直接保存在本地仓库
# 中。如果产生冲突,需要人为的选择,然后在进行add和commit的操作。在创建分支前,尽量
# 保证当前分支是安静的,以减少冲突的发生
#------------------------------------------------------------------------------
# 删除分支
#------------------------------------------------------------------------------
# 删除指定的分支
# 注意: 如果删除的分支没有合并,是不能用当前命令删除的,使用 -d 删除,表示强制删除指
# 定分支。
git branch -d < 分支名称>
# 从服务器上删除 serverfix 分支
git push origin --delete <branch>
#------------------------------------------------------------------------------
远程仓库
远程仓库可以共享仓库中的项目,可以被其他主机接收到。
# 添加远程仓库
git remote add <name> <url>
# 删除远程仓库
git remote rm <name>
# 将本地仓库的文件推送到远程仓库
# 注意:第一次推送需要加-u,以后不需要。
git push
git push -u <repository> <branch>
# 从远程仓库获取项目
git clone <url>
# 从远程仓库拉取分支并与当前分支合并
git pull <repository> <branch>
# 从远程仓库拉取分支(不合并):
git pull <remote repository> <remote branch>:<local branch>
# 将本地仓库的文件推送到远程仓库
git push
# 从远程仓库中更新代码
git pull
# 也用于更新,但是如果有新的分支不会合并
git fetch
# 本地旧覆盖版远程新,当本地比远程旧,用本地覆盖远
git push --force <remote repository>
分支开发工作流程
什么是分支开发?
分支主要用于多人协作工作,分支即获取原有代码,在此基础上创建自己的工作环境,单独开发,不会影响其他分支的操作,开发完成后再统一合并到主线分支中。分支开发的好处,安全,不影响其他人工作。
project(项目库)
master(主线分支)
hotfix(线上紧急bug修复分支)
develop(开发分支)
feature(功能分支)
release(发布分支)
bugfix(bug修复分支)
长期分支
master主线分支
记录项目主线版本的开发迭代过程,该分支是已发布的稳定的产品版本。
master分支的权限由版本管理员统一进行管理,除版本管理员外,其他任何人不允许向master分支合并代码。其他分支需要向master分支合并代码时,首先提出合并请求,然后由版本管理员合并到master分支,合并后,版本管理员应立即添加版本号,发布随时可用的产品版本;每向master分支合并一次,产品版本号就会增加一次。
develop开发分支
记录所有开发人员日常工作的成果,该分支是相对稳定的开发版本。
develop分支的合并操作由研发主管和版本管理员共同管理,不允许开发人员将自己的代码直接合并到develop分支,也不允许开发人员在develop分支上直接进行开发工作,一经发现严肃处理。
一个项目库只能有一个master分支和一个develop分支。项目库创建后,由版本管理员从master分支创建develop分支,项目组所有成员需要克隆服务器上的项目库到本地,然后再从develop分支创建自己的feature分支进行工作。
短期分支
项目库中存在的短期分支有:feature、release、bugfix和hotfix。
feature:功能分支
用于开发新的功能。所有新功能的开发都要先创建feature分支,然后再进行开发工作,feature分支由开发人员从develop分支创建,不同的功能需创建不同的feature分支。
release:发布分支
用于产品发布准备。新功能开发完成后需要发布产品新版本时,要创建release分支进行发布准备,release分支由版本管理员从develop分支创建。
bugfix:bug修复分支
用于修复不紧急的bug。系统测试过程中发现bug,开发人员需要从release分支创建bugfix分支进行修改,不允许开发人员在release分支上直接修改bug。
hotfix:线上紧急bug修复分支
用于修复产品发布后出现的紧急bug。产品上线后,在客户现场出现问题,需要马上解决时,由开发人员从master分支创建hotfix分支进行紧急修复。