Git 笔记

530 阅读8分钟

前言

  • 我们做项目的时候,经常会遇到一些讨厌的产品经理,让我们来来回回的改需求,这个时候项目占用电脑的内存越来越多,有时改着改着还得让我们回到之前某个版本,真的是烦死了。。。
  • 咋子办?版本控制工具帮我忙
  • 这个只为我的笔记和 cv 的工具,<>里的内容为变量(可变)

git 简介

git 是什么

  • git是一个免费并且开源的分布式版本控制系统

什么是版本控制系统

  • 保留文件所有的修改历史记录,可以方便地撤销之前对文件的修改操作
  • 例如我们的编辑器,可以使用 ctrl+z 撤销操作一样,git 也可以保留过去的操作,不过编辑器是自动保存,不可控的,而我们的 git 需要进行手动保存

git 安装

提交对象

  • git 保存的并不是文件的变化或者差异,而是一系列的不同时刻的文件快照
  • 提交操作时 git 会保存一个提交对象,该对象中包含一个指向暂存内容快照的指针、作者姓名、邮箱、父对象指针以及提交输入信息
  • 首次提交的对象没有父对象
  • 普通的提交有一个父对象
  • 多个分支合并的有多个父对象

分支

  • git 的分支本质上仅仅是指向提交对象的可变指针
  • git 默认分支名:master,它会在每一次的提交中自动前移
  • git 的分支 master 并不是一个特殊分支,它和其他的分支完全没有区别,之所以每个分支都是有 master 是 git init 命令默认创建,而大部分人又懒得去更改
  • HEAD 是一个特殊指针,该指针指向当前所在分支
  • HEAD是唯一的

初始化 git

  • 初始化创建仓库
  • 他会创建出一个隐藏的.git文件夹,所有的操作历史将存入这里

git init

查看

查看当前仓库所在目录的文件状态

  1. git status
  2. git status -s || git status --short:简化文件状态打印内容
  • ??:为追踪文件
  • A .:已添加到暂存区
  • . M:被修改但是为放入暂存区
  • MM:修改后放入暂存区,又再次被修改
  • M .:被修改后放入暂存区
  • . D:被删除的
  • R .:重命名的

打印日志

  1. git log
  2. git log -p:查看详细信息(包括diff)
  3. git log -n:查看最近的n条信息
  4. git log --stat:列出所有被修改的文件,以及简略的统计信息
  5. git log --pretty:设置打印内容的格式
    • =oneline:哈希和描述
    • =short:哈希、作者、描述
    • =full:哈希、作者、提交者、描述
    • -fuller:哈希、作者、日期、提交者、提交日期、描述
    • =format:'opt':定制要显示的记录格式(可选多个,空格隔开)
      • %H:提交对象(commit)的完整哈希字串

      • %h:提交对象的简短哈希字串

      • %T:树对象(tree)的完整哈希字串

      • %t:树对象的简短哈希字串

      • %P:父对象(parent)的完整哈希字串

      • %p:父对象的简短哈希字串

      • %an 作者(author)的名字

      • %ae:作者的电子邮箱地址

      • %ad:作者修订日期(可以用 --data= 选项定制格式)

      • %ar:作者修订日期,按多久以前的方式显示

      • %cn:提交者(committer)的名字

      • %ce:提交者的电子邮箱地址

      • %cd:提交日期

      • %cr:提交日期,按多久以前的方式显示

      • %s:提交说明

  6. git log --oneline --decorate:查看分支指向 + 哈希
  7. git log --oneline --decorate --all --graph:包含了 所有分支的提交,以树形图形式展现

查看历史提交记录

  • git reflog

追踪文件、放入暂存区

  • git 的工作流程:

    1. 在工作目录中修改文件

    2. 暂存文件

    3. 找暂存区文件,提交更新

    • 也就是 我们修改了文件 => 通过 add 将文件放入暂存区 => 通过 commit 将暂存区的文件进行提交,所以我们每次提交都需要 add
  1. git add:使文件加入追踪/放入暂存区
  2. git add <filename>:添加 filename
  3. git add <filename1> <filename2> ...:添加 filename1、filename2...
  4. git add .:添加全部文件

提交

  • vim 模式
    • i:插入(插入描述)
    • esc:退出状态
    • ZZ:保存并推出 vim 模式
  • vim 模式解决中文乱码问题(cmder):
    • Win + Alt + P 或者 右键顶部 进入设置(setting)
    • environment 中添加 set LANG=zh_CN.UTF-8
  1. git commit:提交->进入 vim 模式
  2. git commit -m '描述':合并提交和描述,不进入 vim 模式
  3. git commit -a -m '描述':从工作目录提交到暂存区后,直接提交(需要先追踪文件)
  4. git commit --amend
    • 上次提交之后没进行其他操作的情况下,修改提交信息
    • 修正最近的一次提交与本次提交合并
  • git diff:查看当前文件的修改(对比工作区与暂存区)
  • git diff --<> || git diff --staged:查看暂存区和提交的差异

配置项相关

  1. git config
  2. git config -l:查看配置项
  3. git config --global user.name '<userName>':设置用户名
  4. git config --global user.name '<userName>':设置 e-mail
  5. git config --global core.quotepath false:解决中文乱码

删除

  1. git rm <file>:删除git区域中记录的文件,并且不保留在工作目录中
  2. git rm --cache file:删除Git仓库中的,保留工作目录中的文件
  3. git rm -f(force) file:强制删除(git 防止误操作,修改未提交的文件不能直接 rm,如有需要,强制删除)

移动/重命名文件

  • git mv <file_from> <file_to>
  • 相当于
    • mv file_from file_to / 直接在工作区修改名字
      • git rm file_from
      • git add file_to

分支

  • master
    • develop
      • topic

创建、删除分支

  • 创建出来的分支,并不会改变我们当前所在的位置
  • HEAD所指分支无法删除
  1. git branch <branch_name>:创建分支
  2. git branch -d <branch_name>:删除分支
  3. git branch -D <branch_name>:强制删除分支(从未合并的分支)

切换分支

  • 签出指定commit,只会改变HEAD指向,并不会影响分支指向
  • 将HEAD指向切换的分支
  • 将工作目录恢复成当前分支的快照
  1. git checkout <branch_name>:切换分支到 branch_name 上
  2. git checkout -b <branch_name>:简写 = 创建 + 切换

合并分支

  • 将目标分支的内容合并到当前分支
    • 当master和branch没有形成分叉,依旧是处于一条路径线,当HEAD落后于所要合并的分支,将会形成快速前移
  • git merge <branch_name>
    • --no-ff:禁止快速前移(可以commit记录描述为合并操作)
    • --abort:取消合并分支(当合并冲突时)

变基

  • 和merge同样都是进行合并操作的
  • 将一个分支的内容都移至另一个分支上
  • 工作流程
    • 首先找到两个分支的共同祖先
    • 然后对比当前分支与祖先的历次提交,进行提取相应修改,并保存为临时文件,将当前分支指向目标基底,最后将之前存为临时文件的修改依序应用
    • 注意变基后的内容与原来的不是一个(Hash不同)
  • git rebase <branch_name>

撤销修改

  • git reset HEAD
  • 可以用来撤销commit,但实质行为上并不是撤销操作,而是移动HEAD并且带上所指向的分支,重置HEAD及分支
  • 即在HEAD之后的提交,因为当前不在任何分支上,就不会出现在工作目录中,起到撤销效果
  • reset 会带上 mastercheckout 不会
  • 取消暂存
  1. git reset "HEAD^":取消上一次提交(^有n个,就是取消上n条)
  2. git reset HEAD~n:取消上n次提交
  3. git reset HEAD Hash:回到指定哈希的状态
  4. --hard:重置工作目录,丢失暂存(尽量避免使用)
  5. --soft:保留工作目录,与原分支差异将放到暂存区
  6. --mixed (默认):保留工作目录,并且清空暂存区
  7. git checkout -- <file_name>:撤销已暂存文件的修改(未重新暂存)
  8. git checkout <Hash>:查看之前的内容(只改变 HEAD,不改变 master)

储存

  • 存储暂存区及工作目录修改文件
  • 存储:当在一个分支中向暂存区添加内容,切换到另一个分支时,提交commit会带上另一分支中的暂存内容。
  1. git stash
  2. git stash list:打印所有存储内容
  3. git stash apply [stashName]:将存储内容重新应用(默认不保留已暂存内容)
  4. git stash apply --index:将原暂存依旧以暂存进行取出
  5. git stash -u:在上面的基础上带上未追踪文件
  6. git stash drop:移除存储

tag标签

  • 添加带有说明的标签
  1. git tag v1.0:设置标签(默认在最新的commit提交上)
  2. git tag:查看标签
  3. git tag v0.1 <Hash>:给指定commit添加标签
  4. git tag -a v0.1 -m "描述信息" <Hash>:添加带有说明的标签
  5. git show v1.0:查看标签详细信息
  6. git tag -d v1.0:删除标签

忽略文件

  • .gitignore 文件
    • #:该行都会被忽略
    • **:表示匹配任意中间目录
    • *:匹配零个或多个任意字符
    • !:忽略指定文件意外的文件或目录
    • [abc]:匹配任意一个在方括号内的字符
    • [0-9]:在这个范围的都可以匹配
    • ?:只匹配一个任意字符

远程操作 GitHub

  1. git remote add origin <HTTPS/SSH>:添加远程仓库地址
  2. git remote remove origin:删除远程仓库地址
  3. git push -u origin <master>:提交远程仓库
  4. git clone:克隆项目到本地
  5. git pull <远程主机名> <远程分支名>:<本地分支名>:拉取(合并冲突)
  6. git fetch origin <master>:<temp>:拉取远程仓库分支到临时分支
  7. git checkout -b <branch> origin/<branch>:克隆分支(创建/重置branch到引用的点origin/branch
  8. git push origin :<branch>:删除远程仓库分支
  9. git push origin v1.0:推送标签到远程仓库
    • git push origin --tags
  10. git push origin :refs/tags/v1.0:删除远程仓库的标签
  11. ssh-keygen -t rsa -C "GitHubName":生成ssh密钥
    • 在github上找到settings,设置SSH
    • 将生成的文件填到对应的位置(生成的信息给到仓库的管理者)

别名

  • 有时候觉得常用的命令字母多了点,例如:git checkout
  • git config --global alias.<co> <checkout>