文章目录
git
What:开源的分布式版本管理系统。
Why:相较于 svn,有以下主要优势:
- 完全分布式,不依赖于中央服务器,支持离线开发。
- 本地存储了一个完整的代码库,且用元数据方式存储,体积小克隆速度快。
- 处理分支更加简单,大部分情况可以自动合并,出现冲突时也更容易解决。
- 命令行工具更加丰富,功能强大。
安装
git version #查看 git 版本
yum remove git #如有旧版本先卸载
#安装其他源
yum install -y http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
yum install -y git #安装新版本 git
git 信息流
通过 git 信息流,可以了解 git 的主要流程及操作命令。
主要概念:
- 工作区(workspace):当前工作目录。
- 暂存区(index):保存临时改动文件。
- 仓库(repository):本地仓库,存放提交的修改和历史变更。
- 远程仓库(remote):远程仓库,在统一管理代码的服务器上。
git 命令
基本操作命令
#克隆远程仓库
git clone [email protected]:userid/reponame.git
#查看远程仓库
git remote -v
#查看所有分支
git branch -a
#切换分支
git checkout feature/v1.0
#添加所有变更文件到暂存区
git add .
#提交暂存区到仓库
git commit -m "commit message"
#拉取最新代码,自动合并到本地当前分支
git pull
#拉取最新代码,不合并
git fetch
#合并 master 分支到当前分支
git merge master
#推送代码到远程仓库
git push
#查看仓库状态
git status
配置命令
#列出当前配置
git config --list
#列出当前仓库配置
git config --local --list
#列出全局配置
git config --global --list
#配置用户名
git config --global user.name "your name"
#配置邮箱
git config --global user.email "your email"
初始化命令
git init 用于初始化一个本地仓库,初始化完成后会生成一个 .git 隐藏目录,包含所有元数据。
#在当前目录初始化仓库
git init
#在test_dir目录下初始化仓库
git init test_dir
克隆命令
git clone 用于克隆一个仓库,克隆完成后会生成一个与远程仓库同名的目录,包含所有元数据。 克隆时支持 ssh、git、https 协议。
使用 https 协议时需要账号密码登录。
使用 ssh 协议时可以使用公钥认证,方法是:使用 ssh-keygen在本地生成密钥对,然后在~/.ssh目录下将pub后缀的公钥复制到远程仓库配置中。
#使用ssh协议地址
git clone [email protected]:userid/reponame.git
#使用https协议地址
git clone https://github.com/userid/reponame.git
#使用git协议地址
git clone git://github.com/userid/reponame.git
提交命令
git 相比 svn 增加了暂存区,文件变更在提交前需要先添加到暂存区。
另外,如果上一次提交未 push,则允许修改上一次提交。
#添加变更文件到暂存区
git add file1 file2
#添加所有变更文件到暂存区
git add .
#提交暂存区到仓库
git commit -m "commit message"
#自动添加所有变更文件到暂存区,然后提交到仓库
git commit -am "commit message"
#修改上次提交,修改提交信息
git commit --amend -m "commit message"
#自动添加所有变更文件到暂存区,然后提交到仓库,修改上次提交,修改提交信息
git commit --amend -am "commit message"
查看状态
git status 用于查看当前仓库状态,包括变更文件、暂存区文件、未跟踪文件、忽略文件。可以增加参数 -s 缩略显示。绿色表示暂存区变更,红色表示工作区变更。
符号说明:
- A(Added):添加的文件
- M(Modified):修改过的文件
- D(Deleted):删除的文件
- R(Renamed):重命名的文件
- ??(Untracked):未追踪的文件
拉取命令
git fetch 是安全拉取代码的命令,仅拉取最新代码,不会合并到当前分支,不会修改到工作目录的文件。fetch 之后远程跟踪分支 origin/
git pull 是拉取代码且合并到当前分支的命令,会自动合并代码,会修改到工作目录的文件。pull 相当于先 fetch 再 merge 远程跟踪分支到当前分支。
#假设当前的分支是 feature_v1.0
git pull
#等同于
git fetch
git merge FETCH_HEAD
#等同于
git fetch
git merge origin/feature_v1.0
推送命令
git push 是推送本地仓库代码到远程仓库的命令。省略分支名可以将当前分支推送到远程的对应分支。
push 执行时会自动检查远程分支的最新提交点,如果有新提交则会 push 失败。此时需要先 pull 合并远程变更后再 push。
push 执行后 origin/
分支管理命令
git 仓库的分支包括本地分支和远程跟踪分支。远程跟踪分支是对远程仓库分支的引用,在 fetch 时更新为最新。
远程跟踪分支名称为 origin/
本地分支与远程跟踪分支存在关联关系,在首次 checkout 创建本地分支时自动建立关联。
#查看本地分支
git branch
#查看远程跟踪分支
git branch -r
#查看所有分支
git branch -a
#查看本地分支与远程跟踪分支的关联关系
git branch -vv
#切换本地分支,如不存在会根据远程跟踪分支创建
git checkout feature_v1.0
#切换到远程跟踪分支
git checkout origin/feature_v1.0
#创建本地分支
git branch feature_v1.1
#删除本地分支
git branch -d feature_v1.1
#清理本地不存在的远程追踪分支
git remote prune origin
分支合并
git merge
git merge –abort 在合并冲突时使用,会抛弃合并过程并尝试重建合并前的状态。如果合并前未 commit 的文件,该命令并不能保证完全还原。一般建议合并前先 commit,或者用 stash 命令将未 commit 的文件暂存起来,合并完成后再 stash pop 出来。
git merge –no-commit 在合并冲突时使用,会合并冲突文件,但不会自动 commit。便于在提交前人工检查。
git merge –ff-only 除非当前可以使用 fast-forward 合并,否则会失败。
git merge –squash 用于压缩提交记录,从共同祖先节点到对方分支的顶点都会压缩在一起,产生一个新的节点。
git rebase 用于重设基底,合并对方分支的最新提交,并将最新提交作为当前分支的基底。
git cherry-pick
分支冲突的表示:<<<<<<< 当前更改 = = = = = = = 传入的更改 >>>>>>>
分支冲突的解决:选择采用当前更改,或选择传入的更改,或选择保留双方更改,或人工修改。
还原与回退
还原是将暂存区或工作区的文件还原为版本库的内容,不会修改到提交历史。
回退将当前分支回退到指定节点,会修改提交历史,是提交的逆向操作。回退也涉及暂存区或工作区文件内容的变更。
HEAD指针指向最近一次提交,表示当前版本。并且:
- HEAD^:表示上一个版本
- HEAD^^:表示上上个版本
- HEAD~n:表示上 n 个版本
#还原工作区文件,还原后与暂存区内容一致
git checkout file1 file2
#还原工作区所有文件变更
git checkout .
#还原暂存区,工作区不变
git reset HEAD
#还原暂存区与工作区,工作区变更丢失
git reset --hard HEAD
#回退到上一次提交,暂存区也回退,工作区不变
git reset HEAD^
#回退到上一次提交,暂存区和工作区都回退,工作区变更丢失
git reset --hard HEAD^
#回退到上一次提交,暂存区与工作区都不变
git reset --soft HEAD^
#回退到上一次提交(增加一个提交节点来回退)
git revert HEAD^
stash 堆栈
stash 用于临时存储工作现场(包括工作区和暂存区),为切换到其他分支开发再还原回来提供支持。stash 命令执行后暂存区和工作区被还原成版本库内容,所有变更消失。
stash 是堆栈结构,允许多次 stash ,再 pop 按照后进先出还原。
#存储工作现场
git stash
#存储工作现场,并指定名称
git stash save "work1"
#查看 stash 列表
git stash list
#恢复最近一个工作现场
git stash pop
#恢复指定工作现场
git stash apply stash@{0}
#删除指定工作现场
git stash drop stash@{0}
#删除所有工作现场
git stash clear
查看历史记录
#查看提交历史
git log
#查看提交历史,单行缩略显示
git log --oneline
#查看提交历史,包含文件变更统计
git log --stat
#查看提交历史,图形化显示
git log --graph
#查看提交历史,单行缩略显示,图形化显示
git log --oneline --graph
#查看file1文件的第 300 到 350 行的变更历史
git blame -L 300,350 file1
命令别名
全局设置命令别名后,可以直接用别名替代命令,提高输入效率。
#设置命令别名
git config --global alias.st "status"
git config --global alias.co "checkout"
git config --global alias.ci "commit"
git config --global alias.md "commit --amend"
git config --global alias.br "branch"
git 工作流
gitflow 工作流
gitflow 是一种常用的 git 工作流,用于管理大型项目,其分支结构如下:
其中:
- master:主干,保持与线上运行版本一致。
- develop:开发分支,保持最新的开发代码。
- hotfix:热修复分支,从master创建,合并回master和develop。
- feature:功能分支,从develop创建,开发完成合并回develop再从develop创建release分支。
- release:发布分支,从develop创建,主体功能测试完成等待发布。发布完成后合并回 develop和master。
- tag:从master分支打的标签,用于发布。
注意:hotfix、feature、release在完成开发合并回develop和master后可以删除。
forking 工作流
forking 工作流用于开源项目,其流程图如下:
forking 工作流中,项目的官方仓库只有维护者自己有权限写,其他开发者只能 fork 维护者的仓库,然后提交 pull request。项目维护者可以查看所有 pull request,并决定是否合并。
忽略文件
.gitignore 文件用于忽略某些文件,避免提交无用的文件。
约定式提交
约定式提交是一种基于提交消息的轻量约定,提供了一组用于创建清晰提交历史的简单规则。便于通过自动化工具提取变更历史。
格式如下:
<类型>[可选的作用域]: <描述>
[可选的正文]
[可选的脚注]
//注意:用英文冒号,且后面有一个空格。
其中:
- 类型:必须,包括feat(新功能)、fix(bug 修复)、docs(文档)、style(样式)、refactor(重构)、perf(性能改进)、test(测试)、build(构建)、ci(ci 配置或脚本)等。
- 作用域:可选,表示影响范围,如组件名或模块名等。
- 描述:必须,简短描述。
- 正文:可选,详细描述。
- 脚注:可选,如记录不兼容改动以 BREAKING CHANGE 开头加描述,如关闭 issue。