一、入门

1.1 工作区, 暂存区

​ 在Git中有工作区和暂存区的概念. 工作区指的是文件所在的当前目录, 暂存区则是Git暂存文件变更的一个逻辑区域. 当对文件执行增删改操作时, 操作的是工作区的内容, 需要执行git add命令将文件的变更添加到暂存区之后才能提交到Git管理的版本库中. 在使用git status命令的时候经常会看到Changes not staged for commit这样的提示, 紧跟该提示的就是还没有add到暂存区变更文件, 它们的改动还在工作区中放着. 另外还有Untracked files这样的提示, 它指的是还未add到暂存区的新增文件(在工作区新增了文件, 但是还没add到暂存区).

​ 还有一个重要的点是: 当工作区中某个文件的变更被add到暂存区之后, 再次对这个文件进行修改, 接着执行commit提交版本. 这时add到暂存区之后进行的工作区的修改是不会被提交到版本管理中的, 因为再次更改后没有将这些更改add到暂存区.

1.2 工作流

1.3 分支

二、基础命令

2.1 配置操作

  • 全局设置提交者的姓名(若Git进行了如下配置, 后续每次commit操作都会默认使用这个用户名):

    1
    git config --global user.name "Jeb.Wang"
  • 全局设置提交者的邮箱(若Git进行了如下配置, 后续每次commit操作都会默认使用这个邮箱):

    1
    git config --global user.email "3287566354@qq.com"
  • 查看配置

    1
    2
    3
    4
    5
    # 查看全局配置
    git config --global --list

    # 查看当前仓库配置
    git config --list

2.2 基本操作

2.2.1 仓库操作

以下操作都需要在Git仓库的根目录下执行.

  • 初始化仓库:

    1
    git init
  • 查看仓库当前分支的状态:

    1
    git status
  • 查看仓库版本日志(提交顺序是从近到远排序的):

    1
    git log
  • 查看仓库版本日志(和git log的区别在于: 当使用git reset操作回退版本后, git log无法查看到回退之后的版本信息, 但是git reflog可以):

    1
    git reflog

2.2.2 基本操作

  • 查看工作区内文件的变化(变更未存在于暂存区的时候, 对比的是版本库中的改动, 否则对比的是暂存区中的改动):

    1
    git diff filename
  • 将工作区变更add到暂存区:

    1
    2
    3
    4
    5
    # 添加指定文件的变更
    git add filename

    # 添加所有文件的变更
    git add .
  • 将暂存区的文件提交为新版本:

    1
    git commit -m 'message'
  • 移除Git版本库内文件(也可以使用常规操作: 先rm文件, 然后add该变更到暂存区, 最后执行commit):

    1
    2
    3
    4
    5
    # 先从版本库移除
    git rm filename

    # 提交
    git commit -m 'message'
  • 回退当前分支版本: 有两种回退版本的方式, 第一种是使用HEAD的方式, 第二种是使用commit id. 版本回退后使用git log是没有办法看到被回退的版本号的了. 如有3个版本, 从近到远分别为: v3, v2, v1. 当使用git log的时候会按照v3, v2, v1的顺序排下来, 但是如果这时候回退到v1, 再使用git log是看不到v3和v2的了.

    1
    2
    3
    4
    5
    6
    7
    # HEAD^表示上一个版本.
    # 如果要回退到上上个版本则是HEAD^^
    # 上100个版本则是HEAD~100
    git reset --hard HEAD^

    # 33af3e表示commit id, 使用git log可以看到.
    git reset --hard 33af3e

2.2.3 撤销变更

  • 撤销工作区变更(如果变更已经添加到暂存区, 那么已添加的部分变更使用该命令是无法撤销的):

    1
    2
    3
    4
    # 撤销单个文件修改
    git checkout -- filename
    # 或
    git checkout filename
  • 撤销暂存区的变更(从暂存区中移除变更, 变更重新回到工作区):

    1
    git reset HEAD filename

综上, 如果想要撤销一个文件的变更, 但这个文件已经有变更被add到了暂存区中, 首先要做的是用git reset命令将文件的变更从暂存区中移除, 接下来使用git checkout --命令移除文件在工作区的变更.

2.4 分支操作

  • 创建分支:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 创建并切换分支
    git checkout -b branchName


    # 先手动创建分支, 创建完后再手动切换
    # 创建分支
    git branch branchName
    # 切换分支
    git checkout branchName
  • 删除分支:

    1
    git branch -d branchName
  • 合并分支:

    1
    git merge branchName
  • 查看所有分支:

    1
    git branch

2.5 标签操作

  • 创建标签:

    1
    2
    3
    4
    5
    6
    # 切换到需要打标签的分支, 然后执行
    git tag tagName


    # 给指定的commit打标签
    git tag tagName commitId
  • 删除标签:

    1
    git tag -d tagName
  • 查看所有分支的所有标签:

    1
    git tag

三、远程仓库

3.1 远程仓库

  • 将远程仓库克隆到本地:

    1
    git clone address

3.2 远程分支

  • 将代码从远程分支拉到本地:

    1
    2
    3
    4
    5
    6
    # 会将代码自动merge到当前分支
    git pull origin branchName

    # 将代码拉下来, 然后放到本地仓库的一个origin/branchName的分支上, 需要手动merge
    git fetch origin branchName
    git merge origin/branchName
  • 将代码推送到远程分支(如果不存在这个远程分支, 那么会创建它):

    1
    git push origin branchName
  • 删除远程分支:

    1
    2
    3
    4
    # 先删除本地分支
    git branch -r -d origin/branchName
    #推送到远程
    git push origin :branchName
  • 查看所有远程分支:

    1
    git branch -r

3.3 远程标签

  • 推送tag到远程仓库:

    1
    2
    3
    4
    5
    # 推送指定tag
    git push origin tagName

    # 一次性推送所有未推送到远程仓库的tag
    git push origin --tags
  • 删除远程tag

    1
    2
    3
    4
    # 先从本地删除
    git tag -d tagName
    # 从远程删除
    git push origin :regs/tags/tagName

四、最佳实践