Git 常规使用和执行流程

  给新人做 Git 使用培训,整理此篇文章。旨在快速入门、熟练使用最常规的操作。Git 的详细介结、Git 与 SVN 的区别,可从网上了解。

  Git 使用相关教程资源Git 中文网, Git 官网中文教程, 廖学峰 Git教程, Runoob Git教程, git - 简明指南

  Git 是开源的分布式版本控制系统,这里的分布式主要体现在各个开发工程师都有项目的本地仓库,在做修改后,先是提交到本地仓库,再推送到远程共享仓库,即使远程仓库断开,仍可以基于本地仓库继承更新开发和跟踪,不会丢失元素数据。

  Git 即是客户端,也是服务器;不同于 SVN 有个中心服务器。Git 可以使用四种主要协议来传输数据:本地传输、SSH 协议、Git 协议、HTTP协议。 GitHub 是基于 Git 技术的最大的开源项目托管平台。

Git 安装

  1. 安装
    1
    apt install git
  2. 查看版本
    1
    git --version
  3. 可通过help查看命令使用,子命令同样可查看帮助
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //查看命令使用帮助
    git
    git --help

    //简要帮助说明
    git log -help

    //详细帮助说明,Windos会弹帮助页面,Linux相当于:man git-log
    git log --help

    //Linux 下使用
    man git-reset

Git 配置

使用 Git,配置作者相关信息,git config 如果加上 --golobal参数,则是设置全局配置。

  1. 查看 git 配置

    1
    git config --list
  2. 查看 git 用户名,密码,邮箱配置

    1
    2
    3
    git config user.name
    git config user.password
    git config user.email
  3. 设置 git 用户名,密码,邮箱

    1
    2
    3
    git config user.name "Tom"
    git config user.password "123456"
    git config user.email "tom@163.com"
  4. 设置 git 用户名,密码,邮箱 的全局配置

    1
    2
    3
    git config --global user.name "Your Name"
    git config --global user.password "Your Password"
    git config --global user.email "Your Email Address"
  5. 设置 git 区分文件名大小写,默认不区分

    1
    git config core.ignorecase false

仓库管理

版本库又名仓库,英文名 repository, 可理解为操作系统中的一个目录,该目录下的所有资源都将被 Git 管理起来,每个文件的增、删、改都将被跟踪并记录历史,可以追踪历史和还原。

创建本地仓库

将一个空目录创建为本地仓库

1
git init

克隆远程仓库

  1. 从远程共享仓库拉取项目到本地

    1
    2
    git clone https://xxx/xxx-project.git
    git clone git@github.com:your-name/xxx-project.git
  2. 查看远程仓库信息

    1
    2
    3
    git remote
    git remote -v //显示详细信息
    //默认会有 fetch 和 push 两个分支。

从远程仓库更新

1
2
//拉取远程仓库更新的内容, 默认拉取最新的版本
git pull

推送到远程仓库

git commit 提交到本地仓库后,还需要推送到远程仓库以作备份,或供给项目团队多人协作

1
2
3
4
5
6
//默认推送本地的 origin 分支到远程的 master 分支上
git push
git push origin master

//推送到其他分支,如开发分支 dev
git push origin dev

Git 空间

创建仓库后,文件所在的目录是工作区,隐藏目录.git是 Git 版本库,Git 的版本库中还有暂存库和随仓库创建而自动创建的master分支,以及指向masterHEAD指针。
在把修改的文件添加到 Git版本库时,分两步执行:

  1. 使用git add工作区的修改的文件添加到暂存区(index)。
  2. 使用git commit暂存区的所有内容提交到当前分支

修改提交

对比差异

对比已修改待提交的文件与当前版本的差异,可看到详细的差异内容

1
2
3
4
5
//对比所有差异
git diff

//指定文件对比差异
git diff filename

查看状态

查看工作区和暂存区的状态,此命令可看到哪些修改已被暂存(add), 哪些没有暂存。

1
git status

添加修改

提交已修改的文件到本地仓库的暂存区git add 后面跟.表示当前目录修改的文件, 后面跟文件名则是添加指定的文件。
每次提交成功后都会生成一个40位长度 commit id来作为本次提交的版本号,该版本号是用 SHA1 计算得出,十六进制表示。

1
2
3
4
5
6
7
8
9
10
11
//添加新文件和编辑过的文件,不包括删除文件
git add .

//添加所有变更,包括增加、修改、删除
git add -A

//添加修改、增加的变更, 不包括新增的文件
git add -u

//添加指定文件
git add file1.txt file2.txt

提交修改

给本次提交添加说明,内容以描述修改为佳,易于阅读。git commit只对已执行git add的文件执行提交。

1
2
3
4
5
//提交并添加说明
git commit -m "说明"

//将添加和提交个步骤合并到一条命令执行
git commit -a -m "说明"

查看历史

  1. 查看提交历史
    1
    2
    3
    4
    5
    查看提交历史,显示是按从最近到最远的提交日志来排序。每个版本号是以
    git log

    查看每个版本的大致变动情况
    git log --stat --summary
  2. 指定版本查看细节
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //查看当前版本
    git show
    git show HEAD

    //查看上一个版本
    git show HEAD^

    //查看前第4个版本
    git show HEAD~4

    //指定commit_id查看
    git show dfb02

撤销修改

  1. 撤销工作区的修改

    1
    2
    //checkout 检出版本库中的文件到当前工作区覆盖不需要的修改达到撤销修改的目录
    git checkout -- filename
  2. 撤销添加到暂存区的修改
    撤销暂存区中的修改,默认是回到 HEAD 版本

    1
    2
    3
    4
    5
    6
    7
    //默认撤销所有已添加到暂存区但未提交的修改
    git reset
    git reset HEAD

    //指定当前版本中的文件撤销
    git reset filename
    git reset HEAD filename

删除文件

1
2
3
4
5
6
//删除文件并提交
git rm filename
git commit -m "说明"

//恢复误删除的文件
git checkout -- text.txt

删除目录

1
2
3
4
5
6
7
8
9
10
11
12
//切换到分支
git checkout branch_name

//删除目录
git rm folder_name -r -f

//提交
git commit -m "delete xxx folder"

//推送到远程分支
git push origin

版本回退

Git 使用 HEAD 表示当前版本,上一个版本用HEAD^表示,上上一个版本用HEAD^^表示,若要往上50个版本,可用HEAD~50表示。git reset即可以用来撤销添加到暂存区的修改,也可用于回退版本。

  1. 回退到上一个版本
    1
    git reset HEAD^
  2. 回退到指定版本
    1
    2
    3
    4
    //先使用 **git log** 查看历史版本,并记录要回退到的版本号
    git reset commit_id

    示例:$ git reset a238
    注意:执行回退版本前,最好记录最新的版本号,以便于还原到最新的版本;因为回退版本后,比回退到的版本更新的版本都不再显示,但实际存在。
  3. 还原版本和回退版本是同样的操作
    1
    git reset "还原到的版本号"
  4. Git 对版本号的变更保存了操作记录,可使用git reflog查看, 当要还原版本又不记得版本号时有用。
    1
    git reflog 

分支管理

项目开发过程会创建很多分支来区分定制版本或稳定版本与开发中的版本的区别。

master:主分支是非常稳定的,仅用来发布新版本,时刻要与远程主分支同步。
dev:开发分支是不稳定的,在 dev分支上工作。在团队协作时,每个人有自己的分支,往dev分支上合并。
bug 分支:用于在本地修复Bug, 若修复的是线上Bug, 修复后是需要发布版本,就需要推送到远程仓库。

查看分支

列出所有分支,master 是主分支,分支前面带星号(*)的是当前分支

1
git branch

创建分支

1
git branch <branch_name>

切换分支

1
2
git checkout <branch_name>
git checkout -b <branch_name> //创建+切换分支

合并分支

1
2
3
4
5
6
7
8
9
10
11
12
13
//切换到主分支,要全并到某个分支,就切换到这个分支作为当前分支,再把其它分支合并到当前分支上
git checkout master
//合并某分支到当前分支,通常情况下,我们是把开发分支测试通过后合并到主分支。
git merge <branch_name>

//禁用 Fast forward, -m 添加注释
git merge --no-ff -m "new merge" <branch_name>

//查看分支合并图
git log --graph

//查看分支树
git log --graph --pretty=oneline --abbrev-commit

推送分支

推送分支到远程仓库

1
git push --set-upstream origin <branch_name>

拉取远程分支

1
2
3
4
5
//将自动创建一个本地分支,并与远程分支关联
git checkout -b local_branch_name origin/remote_branch_name

//若出现 fatal,可先执行
git fetch

删除分支

1
2
3
4
5
// -d 选项只能删除已经合并过的分支,未合并的分支无法删除。
git branch -d <branch_name>

// -D 选项是强行删除分支。
git branch -D <branch_name>

Bug分支

需要从在线版本的分支上创建修复Bug分支来修复Bug, 而正在开发的分支还未完成不能提交,Git 提供了一个把当前工作区收藏起来的功能(stash),相当于把当前工作区进行隔离,这样当前工作区变成干净的了,就可以放心创建分支来修复Bug,又不影响之前未提交的工作区。

  1. 收藏(隔离)当前工作区
    1
    git stash
  2. 查看收藏的工作区
    1
    git stash list
  3. 恢复收藏的工作区
    1
    2
    3
    4
    5
    6
    //恢复内容但不删除
    git stash apply
    git stash drop //删除工作区

    //恢复同时删除工作区
    git stash pop
  4. 若有多次stash,可指定stash进行恢复。
    1
    2
    3
    4
    5
    6
    7
    git stash list
    //输出
    stash@{0}: WIP on test: d59518b merger
    stash@{1}: WIP on dev: 2259e12 add ffff

    //恢复指定的工作区
    git stash pop stash@{0}

标签管理

分支的ID不容易记住,所以提供了给分支打标签的功能,实际使用一般将人为定义的版本号作为标签来操作。
通常在master分支发布线上版本时打标签,以标签发布的版本。

打标签

  1. 打标签, 默认是打在最新 commit 上

    1
    2
    3
    git branch master
    git tag v1.0
    git tag -a v1.0 -m "v1.0 released" cf810a1 //给标签添加说明
  2. 给指定的 commit_id 打标签

    1
    2
    3
    4
    5
    //查看 commit log
    git log --pretty=oneline --abbrev-commit

    //给指定的 commit_id 打标签
    git tag v1.0.1 cf810e4

查看标签

  1. 查看所有标签
    1
    git tag
  2. 查看标签详细信息
    1
    git show v1.0

推送标签

创建的标签都只存储在本地,不会自动推送到远程,若要将本地某签推送到远程,可使用如下命令:

1
2
git push origin <tagname>
git push origin --tags //一次推送所有远程还没有的本地标签

拉取标签版本

拦取打了标签的版本源码,实际和拉取分支是同一个操作

1
2
3
4
5
6
7
//根据标签名检出源码
# git checkout tag_name

//根据标签的提交ID检出源码
# git show v1.3.1
commit e0694b01ccf904b842ec8434a6e5b4db52f45fb7 (tag: v1.3.1, tag: show, origin/master, origin/HEAD, master)
# git checkout e069

删除标签

标签一般不会执行删除操作,除非打错了标签

1
2
3
4
5
//删除本地标签
git tag -d <tagname>

//删除远程标签,需要先删除本地标签, 再推送到远程标签
git push origin :refs/tags/<tagname>

Git 使用流程

Git 的使用要确保 master 分支的稳定,主分支只与发布版本有关;提交冲突控制在最小分支范围内。

遵循以下两和要原则:

  1. master 发布分支确保稳定,即确保为发布的最低版本。

    严禁把 master 往开发分支合并的操作。

  2. 分支合并,必须遵从单向合并,即 feature > develop > test > release > master 合并。

修复Bug分支

  1. 使用 git stash暂存当前工作区

  2. 拉取 master 分支,创建 hotfix 分支,在此分支上修复 Bug

  3. 在 hotfix 分支上打包测试

  4. 测试通过,把 hotfix 分支合并到 master 分支,发布生产

    同时把 hotfix 分支合并到 develop 分支

  5. 使用 git tash pop 恢复工作区

多feature分支

一个大的项目,有多个小团队并行开发,有先发布,后发布。

  1. 项目领导从 master 上创建 develop 分支
  2. 小团队分别从 develop 分支创建各自的 feature 分支
  3. 各个 feature 分支开发完,只能往 develop 上合并,合并可能出现冲突,谨慎解决
  4. develop 打包给测试,测试通过,develop 合并到 release 预发布分支
  5. 即发布环境没问题,release 往 master 合并,生布生产

命令参考

  1. Git 的工作流程
  2. Git 常用命令速查手册
作者

光星

发布于

2018-10-31

更新于

2022-06-13

许可协议

评论