Git 简介

Git 概念以及基本简介

引言

Git 是一个用于管理项目源码的软件,可以用于:

  • 新建分支开发新功能(branch)
  • 回滚代码到指定版本(commit)
  • 同步本地代码和远程仓库(remote)

安装

  1. 下载安装 here
  2. 命令行安装

使用

下面按 Git 功能来解释 Git 概念,以及一些简单的 Git 命令。

现在有个新项目,需要依次实现 a、b、c三个功能。

  • 新功能开发

新功能很容易实现,新建项目 P,在项目 P 上开发功能 a

1
2
3
mkdir Project // 项目名
cd Project
git init // 初始化,此时会有默认分支 master

可以把项目理解为最初的起源(origin),每个分支(branch)代表项目的一种可能性,分分支与分支间彼此隔离互不干扰。

  • 变更项目需求,优先开发功能 b

此时功能 a 开发到一半,需要将功能 b 优先级提前,功能 a 暂时搁置,但要删掉后重新开始吗?但功能 a 后面还是要完成的。因此,考虑将功能 a 暂存,重新开始开发功能 b。

1
2
git add . && git commit -m "Pause a" // 暂存功能 a
git checkout branch -b b // 新建分支 b(需要删除功能 a 相关代码,只保留项目基本框架)

git add . :此项目(准确来说是当前文件夹)的所有变更都添加进来

git commit -m "Pause a":为此次变更生成一个版本并添加信息记录变更内容

此时回顾上一小节,如果当初 master 分支只有基本的项目框架,开发功能 a 时新建分支 feature/a 是否更合理?

  • 项目要赶进度,协调新同事来完成功能 a

两个人该怎么协同合作一块完成项目呢?将代码拷贝一份给同事吗?但这样两个人如果修改了同一份文件,到时怎么合并?怎么确认同事只在分支 a 上完成?能否提供一个公共目录,自己和同事的项目都可以随时与其同步?

这就是远程仓库(remote):远程仓库是一个部署在服务器上的代码仓库,供多人协作完成项目,可以随时推送(push)和拉取(pull)源码。

推送项目到远程仓库:

1
2
3
4
5
6
7
git remote add origin https://github.com/xxx/P // 关联远程仓库地址
git add . && git commit -m "Finish xxx func" // 保存分支 b 的项目进度

git checkout master // 切换到分支 master
git push origin --set-upstream master // 关联本地分支 master 和远程仓库的 master (分支需要一一对应,分支名称最好保持一致,避免引起歧义)

git checkout b // 继续开发功能 b

origin 是地址 https://github.com/xxx/P 的简称,这表示一个项目可以有多个远程仓库地址(免费版 && 收费版)

git checkout [分支名]:根据分支名进行分支切换

git push origin --set-upstream [分支名]:将本地分支推送到 origin/[分支名] 并进行关联

同事拉取项目并继续开发功能 a

1
2
git clone https://github.com/xxx/P // 使用 clone 命令将项目从远程仓库复制到本地
git checkout -b a // 在 master 分支上新建分支 a 继续开发功能 a(新建分支 a 与分支 b 对应,互不影响)

clone 到本地的项目默认分支一般为 master(可以在远程仓库中设置)

  • 功能 a 和 b 开发的差不多了,要开始合并为一个分支并上线。该怎么操作呢?先将分支 a 合并到 master,然后再将分支 b 合并过去,如果两个分支更改了同一份文件,就需要解决文件更改冲突的问题了。
1
2
3
git checkout master // 切换到分支 master
git merge origin/a // 合并分支 a 并解决冲突(假设分支 a 和 分支 b 都已经推送到远程仓库了)
git merge origin/b // 合并 分支 b 并解决冲突

合并期间 master 分支不稳定(不确定会不会有分支冲突)

  • 此时 master 分支可以去提测了,在提测的时候需要继续开发功能 c,该怎么做?

继续在 master 分支上进行修改吗?虽然可以,但不建议这么做:

  • 测试出现问题时需要修复
  • 万一又有新功能 d 需要实现呢

所以应该在 master 上新建分支 c 进行开发。同时在提测后应该暂时冻结分支 master,避免测试发现问题后找不到对应的版本。那么有什么好办法用于冻结分支 master 呢?不妨使用 git tag 命令。

1
git tag v0.0.1-rc.01 // 首个版本提测

其实上述方法中有些操作可以改进:

  • 一开始就在 master 上新建分支 a 进行开发
  • 为保持 master 分支的稳定,引入新分支 develop 充当 master 分支的不稳定版本(预览版本)
  • 规范分支名称

master:主分支。维护项目稳定代码,每个tag都表示一个稳定的服务版本。

develop:开发分支。用于 checkout [功能|修复]分支和 merge [功能|修复]分支。develop 分支测试无误后就可以合并到 master 分支并上线。

feature:功能分支。用于开发新功能。

fix:修复分支。用于修复 develop 分支在测试时遇到的问题。

重新梳理后,可以按如下方式进行:

GitGraph

上述流程是一个比较流行的 Git 分支和项目开发流程,但也需要考虑如下情况:

  • develop 分支测试时,此时 feature 分支能否合并进来?如果合并进来后该怎么处理可能存在的 fix 分支?

方案一:feature 分支要在 develop 分支测试完成后再合并

方案二:feature 分支合并进 develop 分支后重新提测

方案三:放松片刻,不用着急开发新功能

  • 如果线上服务出现问题需要修复,该怎么做?

在 master 分支上 checkout 一个 fix 分支修复线上问题,测试无误后合并到 master 分支,然后将 mater 分支合并到 develop 分支。

总结

其他常用命令:

1
2
3
4
5
git status // 查看当前 git 状态
git diff aaa bbb // 对比 aaa 和 bbb 的区别
git fetch // 更新远程仓库
git restore xxx // 还原 xxx 文件
git rebase -i xxx // 回滚代码到指定版本

名词解释:

  • 工作区:修改后没有执行 git add xxx 命令,可还原(git restore xxx)
  • 暂存区:git add xxx 后文件从工作区转移到暂存区,可撤销(git restore –staged xxx)
  • 本地仓库:git commit -m "xxx" 后文件从暂存区转移到本地仓库,可回滚(git reset xxx 或 git rebase xxx)

以上只是 Git 工具和命令的基础部分,还有很多其他优秀的功能和命令,因本人精力有限,无法在此详细编写,特此推荐以下优秀书籍和项目:

Pro Git

Git 源码

Oh My Git!

learnGitBranching

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计