image.png

一、git原理

  • git只能跟踪文本文件的变化,比如txt文件、程序代码等。而对于图片、视频等二进制文件的变化,就无法知道变化了哪里。
  • git 分支的理解:如下图所示,git分支可以理解为是一个指针以及提交历史组成。

不管git有多少分支,整个git可以理解为是一颗树(包含很多枝杈),不同的分支仅仅是对于不同枝杈的一份快照。

【git】学习笔记-小白菜博客

二、git基本操作

1、撤销修改

  • 撤销工作区的修改,用命令git checkout -- file
  • 撤销暂存区的修改:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
  • 丢弃提交:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用命令git reset --hard commit_id
  • 撤销提交git revert HEAD。在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。
  • 替换上一次提交:提交以后,发现提交信息写错了,这时可以使git commit --amend -m "",可以修改上一次的提交信息,并把暂存区有变化的文件一并提交。(相当于重新提交)

2、暂存修改

当我们在某个分支上工作进行到一半时,需要切换分支进行工作,这是我们不想提交代码,可以通过git stash命令,将工作现场“储藏”起来。
git stash list命令可以查看储存的内容:

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

当我们需要恢复工作现场时,使用**git stash pop**,这样在恢复的同时把stash内容也删了。

$ git stash pop
On branch dev
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   hello.py

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   readme.txt

Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)

3、复制其他分支的提交修改

比如我们在master分支上修复的bug,想要合并到当前dev分支,可以用**git cherry-pick <commit>**命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

4、标签管理

git 标签是指向与某次commit的指针的,在一些重要的代码提交上打上标签,可以帮助我们更好的识别和管理我们代码提交的历史。

  • 创建标签:git tag -a <name>
  • 创建带描述信息的标签:git tag -a <name> -m <msg>
  • 推送一个本地标签:git push origin <tagname>
  • 推送全部未推送过的本地标签:git push origin --tags
  • 删除一个本地标签:git tag -d <tagname>
  • 删除一个远程标签:git push origin :refs/tags/<tagname>

三、git分支管理

在git中创建和切换分支的代价是非常小的,我们应该多用分支。

1、日常开发中使用分支策略

当我们开发时,应该根据当前任务创建一个新分支进行开发,而不是在dev分支上进行开发,开发完成后再将开发完成的分支合并到dev分支。
比如:我们接到一个新的需求:

(dev)$: git checkout -b feature/xxx            # 从dev建立特性分支
(feature/xxx)$: blabla                         # 开发
(feature/xxx)$: git add xxx
(feature/xxx)$: git commit -m 'commit comment'
(dev)$: git merge feature/xxx --no-ff          # 把特性分支合并到dev

2、解决分支合并冲突

当合并代码出现冲突时,必须解决冲突后才能继续提交。
git 使用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改好再提交即可。

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

四、git实践

1、git 分支规范

master
dev
feat/xxx
release/xxx
hotfix/xxx

每个仓库有且仅有以下的 分支:
Branch: master 、 dev 、 feat 、 release 、 hotfix
其中:

  • master 受保护,不存放源代码,不直接提交代码,所有的 上线文件 需要推送到此分支。
  • dev 受保护,主分支,不能直接提交代码,在这个分支只能增加从 feat 合并 过来的 commit。紧急bug除外,紧急bug处理方式看后文bugfix。
  • feat 分支需要从 dev 切出,然后开发完成后,提交合并请求到 release 分支进行提测。
  • release 分支需要从 dev 切出,用来对项目中各个需求进行合并提测,改 bug 等均在此分支进行,测试成功后,提交合并请求到 dev。
  • hotfix 分支需要 dev 切出,待 bug 修复完成后,提交合并请求到 dev。

2、git 标签提交规范

  • 对应每个发布版本的源代码 tag。tag版本号与需求版本一致,从dev分支打tag,命名 release_版本号_日期,如:release_1.0_20200426
  • 对应每个发布版本的上线文件 tag。tag版本号与需求版本一致,命名 dist_版本号_日期,如:dist_1.0_20200426

3、提交规范

  - type
    - 用于说明 `commit` 的类别,只允许使用下面10个标识。
      - feat:新功能(feature)
      - fix:修补bug
      - docs:文档(documentation)
      - style: 格式(不影响代码运行的变动)
      - refactor:重构(即不是新增功能,也不是修改bug的代码变动)
      - perf:性能优化
      - test:增加测试
      - chore:构建过程或辅助工具的变动
      - revert:回退
      - build:打包
  - scope(可选)
    - 用于说明 `commit` 影响的范围,比如Button组件、store、首页、路由等等,视项目不同而不同。
  - subject(可选))
    - 是 `commit` 目的的简短描述,不超过50个字符。
      - 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
      - 第一个字母小写
      - 结尾不加句号(.)

4、发行版提交(release)

在Github、码云等源码托管商,提供了release的概念,可以提交我们打包后的项目文件,在标签tag的基础上我们可以添加编译好的二进制文件等,如.deb、.exe等给特定的版本提供更多的信息,方便用户,也方便后期查找特定版本的程序。