介绍

git(读音/ɡɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。在进行提交操作时,git回报纯一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。但不仅仅是这样,该提交对象还包含作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。

git安装及配置

Linux

  1. sudo yum install git

Mac

// 需先安装homebrew 
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

brew install git

Window

直接从官网下载安装。

git配置

// 因为git是分布式版本控制系统,所以每一个及其都必须自报家门:你的名字和邮箱地址。
git config --global user.name "your name"
git config --global user.email "your email"

git存储

git分区

git存储分为四个部分:

  • workspace:工作空间(我们的开发代码目录)
  • index:暂存区(.git目录下的index文件)
  • repository:本地仓库(通过git clone将远程代码下载到本地,代码库的元数据信息在根目录下的.git目录下)
  • remote:远程仓库(比如github、gitlab等远程仓库)

image.png

  • 工作区 —git add —> 暂存区 —git commit —> 本地仓库 —git push —> 远程仓库
  • 远程仓库 —git fetch —> 拉取最新代码至本地仓库,并使用refs/remotes路径下对应分支文件,记录远程分支末端commit_idgit merge —> 工作区
  • 远程仓库 —git pull —> 拉取最新代码至本地仓库,并自动合并代码至工作区,且使用refs/remotes路径下对应分支文件,记录远程分支末端commit_id

    git fetch和git pull的区别

    git fetch

    git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。具体操作如下: ```shell // 本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支 git fetch origin master:temp

// 比较远程代码与本地代码的区别 git diff

// 将temp分支合并到本地master分支 git merge temp

// 如果不想保留分支,可以将其删除 git branch -d temp

<a name="19Kq5"></a>
### git pull
git pull是基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD与远程仓库的版本号,然后git fetch获得当前的远程分支的后续版本的数据,然后利用git merge将其与本地分支合并。

**git pull可以认为是git fetch和git merge两个步骤的合并。**
```shell
// 将远端的master分支拉取最新的内容
git fetch origin ,master
// 将拉取的最新内容与当前分支合并
git merge FETCH_HEAD

git pull用法:

// 将远程主机的某个分支,与本地的指定分支合并
git pull <远程主机名> <远程分支名>:<本地分支名>

git pull合并后可能会出现冲突,需要手动解决冲突。

error:Your local changes to the following files would files would be overwritten by merge:Please commit your changes or stash them before you merge.

解决冲突的方式:先将本地的代码暂存。

git stash  // 先将本地修改暂存起来
git stash list // 查看保存信息
git pull // 拉取内容
git stash pop // 还原暂存内容

git status

我们可以通过git status查看本地存储情况。

  • Changes to be committed:代表被add的文件,被加载到了暂存区。
  • Changes not staged for commit:代表在当前分支中被修改的文件,还没有被add,存储在工作区。

    git内部存储

    本地git项目里面的.git目录下的文件如下:
    image.png

  • COMMIT_EDITMSG:commit编辑;

  • FETCH_HEAD:是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本;
  • HEAD:代码库当前分支的指向;
  • ORIG_HEAD:针对某些危险操作,git通过记录HEAD指针的上次所在的位置ORIG_HEAD提供了回退的功能。当你发现某些操作失误了,比如错位的reset到一个很早很早的版本,可以使用git reset —hard ORIG_HEAD回退到上一次reset之前;
  • config:代码库基本的配置文件;
  • description:项目描述;
  • hooks:存储git钩子的目录,钩子只在特定时间发生时触发的脚本,比如提交之前和提交之后;
  • index:暂存区;
  • info:存储git信息的目录;
  • objects:存储git各种对象及备用的对象库;
  • refs:存储git各种引用的目录,包含分支、远程分支和标签。

    commit规范

    每次提交,Commit message都包含三个部分:header、body和footer。 ```shell (): #header

<a name="aoEyI"></a>
## commit type

- feat:新增feature
- fix:修复bug
- dosc:仅仅修改文档,比如README、CHANGELOG、CONTRIBUTE等等
- style:仅仅修改了空格、格式缩进、逗号等等,不改变代码逻辑
- refactor:代码重构,没有加新功能或修复bug
- perf:优化相关,比如提升性能、体验
- test:测试用例,包括单元测试、集成测试等
- chore:改变构建流程、或者增加依赖库、工具等
- revert:回滚到上一个版本
<a name="mCLxu"></a>
# git分支与版本发布规范

1. 基本原则:master为保护分支,不直接在master上进行代码修改和提交。
1. 开发日常需求或者项目时,从master分支checkout一个feature分支进行开发或者bugfix分支进行bug修复,功能测试完毕并且项目发布上线后,将feature分支合并到主干master,并且打Tag发布,最后删除开发分支。

<a name="2529ea56"></a>
# git常用命令

<a name="dde4be02"></a>
### 配置git

```shell
# 配置用户名
git config --global user.name "username"

# 配置邮箱
git config --global user.email "userEmail"

初始化

git init

添加文件并提交代码

# 添加文件
git add <filename>

# 添加全部文件
git add .

# 强制提交文件,可提交.gitinore中配置的文件
git add -f <filename>

# 提交代码
git commit -m "commit message"

查看当前仓库状态

git status

对比文件改动内容

git diff <filename>

查看git日志

git log

版本回退

# 版本回退到第N个版本前
git reset --hard HEAD~N

# 版本回退(切换)到指定版本
git reset --hard <commit id>

查看关联仓库链接信息

git remote -v

关联远程仓库

git remote add origin <url>

推送到远程库

git push

# 第一次推送
git push -u origin <branch name>

# 推送到其他分支
git push origin <branch name>

克隆代码

git clone <url>

# 克隆指定分支代码
git clone -b <branch name> <url>

创建分支

git branch <branch name>

切换分支

git checkout <branch name>

# 创建并切换分支
git checkout -b <branch name>

查看分支

git branch

# 查看远程分支
git branch -r

# 查看所有分支
git branch -a

合并分支

合并某分支到当前分支,若存在冲突会提示手动修改后在提交,git merge 默认为fast forward模式

# fast forward模式
git merge <other branch name>

# 禁用fast forward模式
git merge --no-ff -m "commit message" <other branch name>

查看分支合并图

git log --graph --oneline --abbrev-commit

删除分支

git branch -d <branch name>

# 强制删除
git branch -D <branch name>

保存工作空间

git stash

查看保存的工作空间

git stash list

从保存的工作空间恢复

git stash apply

# 若存在多个保存的工作空间 (n为序号,从0开始)
git stash apply stash@{n}

# 从保存的工作空间恢复并删除保存空间
git stash pop

# 若存在多个保存的工作空间 (n为序号,从0开始)
git stash pop stash@{n}

删除保存的工作空间

git stash drop

# 若存在多个保存的工作空间 (n为序号,从0开始)
git stash drop stash@{n}

将其他分支的提交应用到当前分支

git cherry-pick <commit id>

抓取代码

git pull

将本地分支与远程分支关联

git branch --set-upstream-to <local branch name> origin/<remote branch name>

建立标签

# 给当前分支建立标签
git tag <tag name>

# 给某个提交建立标签
git tag <tag name> <commit id>

# 给某个提交建立标签并添加注释
git tag <tag name> -m "description" <commit id>

查看标签

git tag

查看标签信息

git show <tag name>

删除本地标签

git tag -d <tag name>

删除远程标签

git push origin :<tag name>

推送标签至远程仓库

# 推送所有本地标签 
git push --tag

# 推送指定标签
git push origin <tag name>