1. 工作区、暂存区、仓库区

image.png

1.1 工作区

  • 对于 添加、修改、删除 文件的操作,都发生在工作区

1.2 暂存区

  • 暂存区指将工作区中的操作完成小阶段的存储,是版本库的一部分

1.3 仓库区

  • 仓库区表示个人开发的一个小阶段的完成
    • 仓库区中记录各版本是可以查看并回退的
    • 但是在暂存区的版本一旦提交就再也没有了

2. Git单人本地仓库操作

  • 2.0 创建分支/查看分支/切换分支
    • git branch 分支名 【eg: git branch lesson1】
    • git branch:查看所有分支
    • git checkout 分支名:切换到某个分支上
    • git merge 之前某个分支:把之前某个分支的代码拿到了这个新建的分支里
  • 2.0 创建空的 git 仓库:git init
  • 2.1 配置 git 提交的用户名,邮箱
    • 如果没有配置,默认使用的: home/.gitconfig 根目录下的用户信息
    • git config user.name zhangsan
    • git config user.email zhangsan@gamil.com
  • 2.2 查看文件状态git status【查看工作区文件状态】
    • 红色:表示新建文件,或者新修改了文件,目前位于工作区中
    • 绿色:表示文件在暂存区
    • git status -s 查看简化后的工作区文件状态
  • 2.3 将工作区代码添加到暂存区
    • git add . # 把工作区的所有内容提交到暂存区
    • git add xxx.py # 把工作区的 xxx.py 文件提交到暂存区
  • 2.4 将暂存区代码添加到仓库区【才有版本号】
    • git commit -m ‘注释’
  • 2.5 查看版本历史 【查看仓库区的版本历史】
    • git log # log查看详细信息
    • git reflog # reflog查看简要信息
    • git log —oneline # 查看简化后的信息
  • 2.6 一个命令直接把文件从工作区 -> 暂存区 -> 仓库区
    • git commit -am ‘注释’
  • 2.7 回退版本
    • git reset —hard HEAD
      • HEAD 表示当前最新版本
      • HEAD^ 表示当前最新版本的上一个版本
      • HEAD^^ 表示当前最新版本的前两个版本,依次类推
      • HEAD~1 表示当前最新版本的上一个版本
      • HEAD~2 表示当前最新版本的前两个版本,依次类推
    • git reset —hard 版本号
  • 2.8 撤销工作区,暂存区修改【仓库区代码不能撤销】
    • 【比如我们在文件里修改了东西,这时候git status,文件变红了,说明工作区文件已经发生变化】
    • 撤销工作区:git checkout 文件名
    • 撤销暂存区:
      • 现在推荐使用git restore:git restore —staged xxx 撤销该文件(从暂存区变回到工作区)
      • git reset HEAD 文件名(先把文件从暂存区 变回到 工作区)
      • git checkout 文件名 (然后在工作区撤销)
  • 2.9 版本对比
    • git diff HEAD HEAD^ — xxx.py
    • HEAD 表示当前版本,HEAD^表示上个版本,xxx.py表示要对比的文件,若不写则表示全部文件
  • 2.10 误删除文件 恢复
    • 第一种方式删除:rm 文件名 【直接 rm 文件 的操作删除的是工作区的文件】
      • 解决方案:直接撤销工作区的操作,即 git checkout 文件名
    • 第二种方式删除:git rm 文件名 【git rm 文件 的操作同时删除工作区和暂存区的文件】
      • 解决方案:git reset —hard HEAD^
  • 2.11 暂存区相关命令

    • 查看暂存区(staging area)有哪些文件:
      • git ls-files
    • git删除文件(运行后会删除working area和staging area的文件)
      • git rm xxx/ 或者 git rm xxx.js 同时删除工作区和暂存区的目录/文件
    • git删除文件(只删除staging area的文件)
      • git rm —cached -r xxx/ 或者 git rm —cached -r xxx.js 只删除暂存区的目录/文件
      • 场景:我有一个.DS_Store文件,在工作区里存在没问题,但是我不想把这个文件提交到版本区,那么我需要先把这个文件名添加到.gitignore里,但是如果已经提交过,版本区里有了这个文件,那么就使用git rm —cached -r .DS_Store,然后再git commit,就可以删除掉版本区里的.DS_Store了
    • 查看具体改了哪些代码【常用!!】
      • git diff 比较工作区和暂存区的差异
      • git diff —cached 或者 git diff —staged 比较暂存区版本区的差异
      • git diff master 比较工作区版本区的差异
  • 2.12 常用命令集合

    • 比较差异
      • git diff 比较工作区和暂存区的差异
      • git diff —cached 或者 git diff —staged 比较暂存区版本区的差异
      • git diff master 比较工作区版本区的差异
    • 重置、撤销、回滚
      • git reset HEAD 暂存区与版本区保持一致
      • git checkout 暂存区(暂存区没有找版本区)覆盖工作区的内容【其实就是撤销工作区的操作】
      • git reset —hard 恢复版本区指定版本的内容到工作区
        • 举例:git reset —hard 6e2c397 版本号通过 git log可以查看到,取前7位使用即可
    • 修改已提交的commit message
      • 如果是只修改最新一次提交的commit message的话
        • 直接:git commit —amend -m ‘新的message’
      • git rebase -i HEAD~3 修改最近的三次信息
      • 把想要修改commit message的那条记录前面的pick改成edit,然后esc + :wq保存退出
      • git commit —amend 进入vim界面,然后修改commit message,保存退出
      • git rebase —continue
    • 删除文件
      • git rm —cached -r xxx/ 只删除暂存区文件
      • git rm index.html 同时删除工作区暂存区文件
    • 删除分支
      • giit branch -d development 删除development分支(在主分支进行这个git命令操作)
    • 分支
      • git branch 查看分支
      • git branch dev 创建名为dev的分支
      • git checkout dev 切换到dev分支
      • git checkout -b dev 创建并切换到dev【等同于上面两个命令的合并】
      • git branch -d dev 删除dev分支 【先切换回主分支,再执行删除某个分支的操作】
    • 合并
      • git merge dev 合并dev分支到当前分支
    • 历史记录
      • git reflog 查看简要信息
      • git log 历史记录
      • git log —oneline 简洁版的历史记录
      • git log —online —graph 展示历史操作图
      • git log —graph
    • 拉取远程最新的代码
      • 方式一:git pull origin development 指定拉取远程的development分支代码
        • 这种方式是直接拉取远程的development分支然后和当前分支合并
      • 方式二:git fetch origin development 获取远程的development分支代码,不会自动合并本地代码
        • 拉取下拉的代码会在 origin/development分支里,还需要手动git merge origin/development,才会把远程拉取下来的分支代码合并到当前分支上
        • 这样分两步的优势是:你可以在merge前,查看下git diff origin/development xxx(某个分支) 看看有没有冲突,没啥问题的话再merge到当前分支上
      • 拉取远程分支并创建本地新分支,把远程拉的代码放入该本地分支中
        • git fetch origin master:dev
    • 当正在feature分支里开发新功能时,同事找你帮忙去bug分支修改一个错误;如果直接git checkout bug你会发现命令行里提示先提交当前feature分支的代码,但是feature分支的业务代码还没写完,还不想提交,那么怎么办呢?使用git stash
      • 在feature分支里先保存下当前改动后的代码 git stash, 可以使用git stash list查看保存记录
      • 然后git checkout bug,跳转到bug分支修bug,修完后返回feature分支继续开发新工作
      • 在feature分支里还原之前保存的代码,git stash apply 即可还原 切换到bug分支前的代码
      • 若git stash list 查看发现有多个保存的记录,那么可以使用git stash apply stash@{0} 指定还原具体哪个(stash@{0}, stash@{1}, …)
      • git stash的一些常用命令
        • git stash
        • git stash save “save message”:执行存储时添加备注,方便查找
        • git stash list:查看stash了哪些存储
        • git stash apply:应用某个存储,默认使用第一个存储,即stash@{0},如果使用其他存储,git stash apply stash@{num}
        • git stash drop stash@{num}:丢弃stash@{num}的存储,即从列表中删除这个存储
        • git stash clear:删除所有缓存的stash
    • 提交信息规范 type(必填) + scope(可选) + subject
      • feat:新功能(feature)
      • fix:修补bug
      • docs:文档(documentation)
      • style:代码格式、风格(不改变代码逻辑, 例如:空格缩进、增删分号)
      • refactor:重构(既不是新增功能,也不是修改bug的代码变动)
      • test:测试代码(test)
      • perf:性能优化的修改
      • chore:构建过程或辅助工具的变动(非src和test的修改)
      • build:构建系统/工具更改(改变**构建流程或者新增依赖库、工具等,例如webpack修改, npm**)
      • ci:持续集成配置/脚本更改
      • revert:代码回滚
      • merge:Merge branch
    • 当一次改动包括主要type特殊type时,统一采用主要type
      • 主要type
        • feat
        • fix
      • 特殊type
        • docs
        • style
        • build
        • refactor
        • revert
      • 暂不使用type
        • test
        • perf
        • ci
        • chore

3. 多人操作

  • git clone 地址:将远程仓库的代码 clone 到本地
  • git push:将本地仓库的代码推送到远程
  • git pull:将远程仓库的代码更新到本地

4. 冲突问题

  • 容易冲突的操作
    • 多个人同时操作了同一个文件(一般每个人负责独立模块)
    • 一个人一直写不提交
    • 修改之前不更新最新代码
    • 提交之前不更新最新代码
    • 擅自修改同事代码
  • 减少冲突的操作
    • 养成良好的操作习惯,先 pull 再修改,修改完后立即 commit 和 push
    • 一定要确保自己正在修改的文件是最新版本的
    • 各自开发各自的模块
    • 如果要修改公共文件,一定要先确认有没有人正在修改
    • 下班前一定要提交代码,上班第一件事拉取最新代码
    • 一定不要擅自修改同事的代码

5. 标签使用

  • 目的:当一个大的版本完成之后需要做好记录和备份,可以使用标签
  • 设置本地标签:git tag -d 标签名
  • 推送本地标签到远程:git push origin 标签名
  • 删除本地标签:git tag -d 标签名
  • 删除远程标签:git push origin —delete tag 标签名

6. 分支使用

  • 目的:如果碰到难题,需要单独建立一个分支去解决;如果新来了一个同事,可以建一个分支,让其在上面开发
  • 查看当前分支:git branch
  • 创建分支:git checkout -b 分支名
  • 切换分支:git checkout 分支名
  • 合并分支:git merge 分支名
    • 注意:需要在master中执行合并操作

7. 修改提交的内容

  • git commit —amend 做对应的修改