Git 操作和命令

329 阅读6分钟

先上一个鄙人画的美人~

1 git 基础操作流程

git init :创建工作目录,对工作目录进行修改

git add ./ :进入暂存区,创建一个就进入一次暂存区(index)

即:

git hash-object -w 文件名(修改了多少个工作目录中的文件,此命令就要被执行多少次)
git update-index ...

git commit -m "注释内容"

即:

git write tree
git commit-tree

工作目录中状态: 未跟踪、已跟踪;

已跟踪包含三种状态:已暂存(绿色)、已修改(红色)、已提交(正常)

git ls-files -s 查看暂存区

2 git高层命令 CRUD

get init 初始化仓库

git status 查看文件状态

git diff 查看哪些更新还未暂存

git diff --staged 查看哪些更新还未修改

git log --oneline 查看提交的历史记录

git add ./ 将修改添加到暂存区,跟踪到一个新文件

git rm 文件名 删除工作目录中的文件,再将修改添加到暂存区

git mv 原文件名 新文件名 重命名,再将修改添加到暂存区,再将修改添加到暂存区

git commit

git commit -a

git commit -m "注释内容" 将暂存区提交到版本库

git commit -a -m "注释内容" 跳过暂存区提交到版本库

3 git 分支操作(killer skill)

git分支本质是一个提交对象,分支会被HEAD使用(HEAD一个时刻只会指向一个分支)。它指向最新操作的指针。

git branch 分支名创建分支

git branch 分支名 commitHash 版本传送(时光机)

git checkout 分支名切换分支

git checkout -b 分支名 创建并切换分支,

git branch -d 分支名(要先切会主分支)普通删除分支

git branch -D 分支名(要先切会主分支)强制删除分支

合并分支

git mergin 分支名

  • 快速合并(不会产生冲突)

  • 典型合并(有机会产生冲突)

  • 解决冲突:打开冲突文件 > 进行修改 > add > commit 截屏2021-08-20 14.21.15.png

git branch 查看分支

git branch --merged查看合并到当前分支的分支列表 (一旦出现在这个列表中就应该删除)

git branch --no-merged查看没有合并到当前分支的分支列表 (一旦出现在这个列表中就应该观察一下是否需要合并)

切换分支的注意点

最佳实践:每次切换分支前,git status ,一定要干干净净的。

:每次切换分支前,有(初始化的)未暂存的修改 or 有(初始化的)未提交的暂存,分支可以切换,但可能会污染其他分支。

切换分支要动三个地方: HEAD, 暂存区, 工作目录

分支模式

git分支本质是 指向提交对象的可变指针(head)

主分支不要动

长期分支(develop),特性分支(topic) 写完一个功能,合并一个

4 git 存储

git stash 工作还未完成,保存到栈顶(后进先出) git stash list 查看储存

git stash apply 应用栈顶

git stash drop 删除栈顶

git stash pop 应用并删除栈顶

5 git 后悔药

  • 工作区 撤回工作目录中的修改 git checkout --文件名
  • 暂存区 撤回自己的暂存 git reset HEAD 文件名
  • 版本库 撤回自己的提交,改注释 git commit --amend

6 reset 三部曲(撤回的原理)

    1. git reset --soft commitHash

用commitHash重置HEAD,但文件内容不变(带着分支一起动)

撤销上一次 git commit 命令,类似与git commit --amend

    1. git reset [--mixed] commitHash 用commitHash重置HEAD,和暂存区
    1. git - commitHash

用commitHash重置HEAD,暂存区,和工作目录

类似git checkout,

路径reset

git reset [--mixed] commitHash filename

reset 将跳过第一步,用commitHash中filename的内容 重置 暂存区

  • 第一步是重置HEAD内容,HEAD的本质是指向一个分支,分支的本质是一个提交对象

  • 提交对象是指向一个树对象,树对象又可能指向多个git对象;一个git对象代表一个文件

  • HEAD可以代表一系列文件的状态!!!

checkout 深入了解

git checkout 分支名git reset --hard commithash

  • 共同点

    都需要重置: HEAD 、暂存区 、工作目录

  • 区别 -1 checkout只动HEAD ,reset --hard动HEAD并且带着分支一起走

-2 checkout 对工作目录是安全的,reset --hard是强制覆盖工作目录

checkout + 路径

git checkout commitHash 文件名 重置暂存区和工作目录

git checkout -- 文件名 重置工作目录

6 git配别名- 快捷命令

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

截屏2021-08-20 12.17.04.png

git config --global alias.st status
git config --global alias.cm "commit -m"
git config --global alias.cma "commit -a -m"
git config --global alias.ad "add ./"
git config --global alias.dfs "diff --staged"
git config --global alias.ch "checkout"
git config --global alias.cb "checkout -b"
git config --global alias.b branch

7 Eslint + git + hushy

截屏2021-08-23 10.01.38.png

  • 新建文件夹Eslintdemo
  • npm init -y 初始化
  • npm i eslint -D or npm i eslist --save -dev安装Eslint
  • 使用ESlint:生成配置文件 npx eslist --init; 检查js文件 npx eslint 目录名
  • 更改package.json,加eslint规则
{
  "name": "Eslintdemo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "lint": "eslint ./src",//加eslint规则
    "lint:create": "eslint --init"//加eslint规则
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "eslint": "^7.32.0",
    "eslint-config-standard": "^16.0.3",
    "eslint-plugin-import": "^2.24.1",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^5.1.0"
   
  }
}
  • 新建src文件,加index.js index.js >>
console.log('a')
  • git init初始化git
  • npm i husky --save-dev加husky,husky为esllint设置钩子程序,
  • 修改package.json
{
  "name": "Eslintdemo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "lint": "eslint ./src",
    "lint:create": "eslint --init"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "eslint": "^7.32.0",
    "eslint-config-standard": "^16.0.3",
    "eslint-plugin-import": "^2.24.1",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^5.1.0",
    "husky": "^7.0.1"
  },
  "hushy": {
    "hooks": {
      "pre-commit": "npm run lint"
      //在git commit 之前一定要通过npm run lint检查一下
      //只有npm run lint 不报错时,commit才能运行,本质是钩子函数
    }
  }
}
  • git status查看git状态
  • git ./add 添加
  • 新建文件 .gitignore,让eslint检查时忽略node_modules里的文件
/node_modules
  • git commit -m '1 commit' 提交
  • git status

8 远程仓库repository|

远程跟踪分支

远程分支

团队协作(基本操作)

  • 1 项目经理初始化远程仓库 一定要初始化一个空的仓库,在github上操作
  • 2 项目经理创建本地仓库
    • git remote 别名 仓库地址(https)
    • git init
    • 将源码复制进来
    • 修改用户名,邮箱
    • git add
    • git commit
  • 3 项目经理推送本地仓库到远程仓库
    • 清理window凭据(mac木有??)
    • git push 别名 分支 (输入用户名 和 token,推完会附带生成远程跟踪分支)
  • 4 项目邀请成员 & 成员接受邀请
    • 在github 上操作
  • 5 成员克隆远程仓库
    • git clone 仓库地址(在本地生成。git文件, 默认为远程仓库配了别名 orgin)
  • 6 成员做出贡献
    • 修改源码文件
    • git add
    • git commit
    • git push 分支 (输入用户名 和 token,推完会附带生成远程跟踪分支)
  • 7 项目经理更新修改(可以直接用git pull)
    • git fench 别名 (修改同步到远程跟踪分支上)
    • git merge 远程跟踪分支