• Java第四十六天,Git系列,Git中级


    一、Git 基础命令

    1. 查看远程分支地址

    git remote -v

    2. 更新远程所有分支

    git remote update origin --prune

    3. 查看所有历史版本信息

    git reflog

    4. 更新上一次 commit 信息

    1. # 如果需要在原有的 commit 中新增提交文件,则需要执行以下命令,否则不需要执行
    2. git add [待提交文件]
    3. # 更新 commit 注释信息
    4. git commit --amend

    5. 删除本地分支

    1. # 普通删除
    2. git branch -d [本地分支名]
    3. # 强制删除
    4. git branch -D [本地分支名]

    6. 删除远程分支

    git push origin --delete [远程分支名]

    7. 删除本地分支

    1. # 普通删除
    2. git branch -d <本地分支名>
    3. # 强制删除
    4. git branch -D <本地分支名>

    8. 配置 gitk 客户端 utf-8 编码(防止中文乱码)

    git config --global gui.encoding utf-8

    9. 查看当前的 git 用户

    1. git config user.name
    2. git config user.email

    10. 设置当前的 git 用户

    1. git config --global user.name ""
    2. git config --global user.email ""

    11. 将旧分支上指定的文件复制到新分支上

    1. git switch <新分支>
    2. git checkout <旧分支> -- <指定文件的路径>

    二、git stash 命令

    1 用途

    将当前未提交的修改暂存,去别的分支修改代码

    2 步骤

    1. # 将当前分支未提交的代码暂存
    2. git stash
    3. git stash save "注释信息"
    4. # 切换的别的分支
    5. git switch/checkout [其他分支名]
    6. # 在别的分支修改代码
    7. # 回到自己的分支
    8. git switch/checkout [自己的分支名]
    9. # 将之前暂存的代码恢复
    10. git stash apply
    11. # 将恢复的暂存从队列中删除
    12. git stash drop

    3 常用命令

    1. # 查询所有的 stash 记录
    2. git stash list
    3. # 将最近的一次暂存恢复,并且从队列中删除
    4. git stash pop = git stash apply + git stash drop
    5. # 将指定序号 x 的 stash 恢复
    6. git stash apply stash@{x}
    7. # 将指定序号 x 的 stash 删除
    8. git stash drop stash@{x}
    9. # 清空所有的 stash 记录
    10. git stash clear
    11. # 查看堆栈中最新保存的 stash 和当前版本的目录差异
    12. git stash show
    13. # 查看堆栈中最新保存的 stash 和当前版本的详细差异
    14. git stash show -p
    15. # 查看指定的 stash x 版本和当前版本的目录的差异
    16. git stash show stash@{x}
    17. # 查看指定的 stash x 版本和当前版本的详细差异
    18. git stash show stash@{x} -p

    4 细节描述

    git stash 命令会把以下修改存储到一个新的堆栈中(堆栈中的内容(stash)可以被所有的分支访问)

    • 暂存区的修改
    • 工作区中已经存在的文件的修改

    git stash 命令不会存储下列文件

    • 工作区中新增的文件(untracked files)
    • 被版本库忽略的文件(.gitignore 中定义的忽略文件)

    5 基础概念

    工作区:项目所在目录(除 .git 文件夹外的其余目录和文件)

    暂存区:也称索引(index),英文叫做 stash 或 index,一般存在于 .git 目录下的 index 文件;当执行 git commit 操作时,暂存区的目录树会写到版本库中,所以也可以理解为 git commit 提交的是暂存区中的内容

    git stash -u

    git stash -u 命令会存储以下文件

    • 工作区中新增的文件(untracked files)

    git stash -a

    git stash -a 命令会存储以下两种文件

    • 工作区中新增的文件(untracked files)
    • 被版本库忽略的文件(.gitignore 中定义的忽略文件)

    三、git reset 命令

    1 使用背景

    在开发过程中,有时候可能在执行完 git commit 之后发现代码有问题,需要撤销提交,或回滚回之前的任意版本,这时候就需要使用 git reset 命令了

    2 命令详解

    1. git reset [参数] [commit id / head]
    2. 参数:
    3. --mixed 重置 HEAD,INDEX;保留 工作区;默认参数
    4. --soft 重置 HEAD;保留 INDEX,工作区;让仓库恢复到 git commit 之前的状态
    5. --hard 重置 HEAD,INDEX,工作区

    3. 关键词详解

    工作区:项目所在目录,即 .git 目录的同级目录(不包括 .git 目录);也可以理解为项目根目录下除 .git 目录的所有目录及文件

    INDEX:也称暂存区,英文叫做 stage 或 index;一般存在于 .git 目录下的 index 文件;当执行 git commit  操作时,暂存区的目录树会被写到版本库中,所以也可以理解为 git commit 提交的是暂存区中的内容

    HEAD:HEAD就是 ./git/HEAD 文件,它存储着当前工作目录所处的某次 commit;HEAD 是对 commit 的引用,默认是上一次的 commit(提交的 commit,切换仓库,回滚版本,切换 tag 会改变 HEAD)

    版本库:项目根目录下的 .git 目录就是版本库

    四、git revert 命令

    • reset 命令是回溯到指定的d commit 版本,指定的 commit 版本之后的操作会被删除,并且不会产生新的 commit 记录,如果要推送到远程服务器,需要用 -f 强制推送;
    • revert 是在当前 head 的基础上,反向修改成目标 commit 版本,将修改结果作为一个新的 commit 提交,版本会递增,不会影响之前提交的内容

    1 常用命令

    1. # 回退到目标 commit id 时的状态
    2. git revert [commit id]
    3. # 回退到 head 指针指向的提交
    4. git revert HEAD
    5. # 回退到 HEAD 指针 n 次之前的提交
    6. git revert HEAD~n
    7. # 不产生新的提交
    8. git revert -n
    9. # 当回滚记录是由多个分支 merge 产生时,需要指定回滚的父节点
    10. git revert -m [指定回滚的父节点]

    五、git restore 命令

    • git restore --staged [文件路径]        撤销在暂存区提交的文件,将文件状态改为不受版本库控制
    • git restore [文件路径]        使在工作区但不在暂存区的文件撤销更改(内容恢复到没修改之前的状态);如果文件还在暂存区,该命令无效,需要使用 git restore --staged 命令将文件从暂存区移至工作区
    • git rm -r --cached [. | 文件 | 目录]        清除 git 缓存区的缓存数据,不改动工作区的文件内容;但是本操作(删除操作;即工作区不删除,但是版本库会删除,并且停止版本控制)会随着 commit,push, merge request 被带到本地版本库、远程版本库

    六、git diff 命令

    • git diff        比较的是工作区和暂存区的差异;即尚未缓存的改动
    • git diff --cached        比较的是暂存区和最新本地版本库的差异;即已被缓存的改动;也可写作 git diff --staged
    • git diff --HEAD        比较的是工作区和最新本地版本库中 HEAD 指针指向的 分支/commit id/tag/... 的差异

    七、git commit 命令

    • git commit -a        相当于 git add + git commit
    • git commit --amend        撤销上一次提交,并将暂存区文件重新提交,编辑器会弹出上一次提交的信息,可以修改你想要提交的注释信息
    • git commit --amend -m        撤销上一次提交,同时 -m 指定修改的提交信息
    • git add [文件] + git commit --amend        不仅修改提交信息,并且更改提交文件

    八、git 查找、阅读任意分支、版本的文件

    1 显示任意分支下的指定目录

    git show [分支名]:[目录路径]

    2 阅读任意分支下的指定文件

    git show [分支名]:[目录路径]

    git show [40 位对象名]

    3 检索、查找包含指定内容文件所在分支及其具体路径

    1. git grep [options] "关键字" [分支名 | commit id | tag | | ]
    2. 分支、commit id、tag、及其完整路径
    3. 路径
    4. # options 可选参数
    5. --cached 搜索暂存区中的文件,而不是搜索已经在版本库并被跟踪的文件
    6. --no-index 搜索当前目录中不被 git 版本控制的文件
    7. --exclude-standard 不支持搜索忽略文件,仅在 --untracked 存在时生效
    8. --full-name 显示目标文件的完整路径
    9. --heading 按文件分行显示匹配内容
    10. --break 在不同的文件之间加空白行来隔开
    11. -i
    12. --ignore-case 忽略大小写
    13. -w
    14. --word-regexp 只匹配字符边界
    15. -E
    16. --extended-regexp 匹配正则表达式
    17. -F
    18. --fixed-string 使用固定字符串模式,禁用正则表达式
    19. -v
    20. --invert-match 取反,显示不匹配的行
    21. -q
    22. --quit 不输出匹配的行
    23. -n 显示行数
    24. -c 列出匹配的文件,并统计有多少个匹配
    25. -h
    26. -H 每个匹配结果均显示文件名
    27. --and 与
    28. --or 或
    29. --not 非

    4 阅读指定文件

    对象名

    在 git 中任何一个文件的任何版本,都有一个对象名,即一个文件有几个版本,就有几个对象名;每一个对象名都是对象做 SHA1 哈希计算得来的

    对象

    每个对象包括三个部分:

    类型 ==> blob(用来存储文件数据,通常是一个文件)、tree(用来管理  tree 或 blob)、commit、tag

    大小

    内容

    1 常用命令

    • git ls-files-s [目录]        显示指定目录下所有对象的 sha1 哈希对象名
    • git hash-object [文件]        显示指定文件的 sha1 哈希对象名
    • git cat-file -t [对象名]        显示对象的类型
    • git cat-file -s [对象名]        显示对象的大小
    • git cat-file -p [对象名]        显示对象的内容

    九、git rebase 命令

    可以这样说:git base 是 git 中最精华、最难、最危险的命令,没有之一,用一句话总结就是——危险与收益共存!!!

    想要理解 git rebase 是用来做什么的,可以百度、谷歌搜索一下 git merge 和 git rebase 的区别;简单来说 git rebase 也是起到 合并 的作用;只不过它的这个合并不仅可以合并不同分支、不同 commit id 的代码,还可以合并 commit id 本身,而且自由度之高,超乎你的想象

    1 基本概念

    变基:改变当前分支的基础版本(父版本);即将提交到某一分支上所有的修改都移至另一分支上

    2 用途

    • 合并提交 (合并commit)
    • 合并分支(不出现分叉合并)

    3 注意事项

    • 在自己的特有分支上,使用 git rebase 合并方式更好,可以使提交记录整洁干净
    • 在公共分支上,使用 git merge 方式合并,安全并且容易跟踪修改
    • 如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基
    • 变基最强大、最危险的地方在于——它能改变原 commit 的 hash id,而一旦对历史提交做出更改,那么从开始的那个变基节点直到最后的节点,所有的节点都会发生改变,这对于线上环境来说,是不可控的的本地修改进行变基
    • 不要对已经合并到主分支的本地修改进行变基
    • 只对尚未推送或分享给别人的本地修改执行变基操作历史提交
    • 从不对已经推送到别处的历史提交进行变基操作
    • 在 rebase 的过程中,也会出现冲突的情况,这时 git 会停止 rebase 并让你解决冲突,在解决完冲突之后,可以使用 git rebase --continue 命令继续进行 rebase 合并操作
    • 在任何时候,可以使用 git rebase --abort 命令来终止 rebase 的动作,并且分支会回到 rebase 开始之前的状态

    4 命令详解

    4.1 分支合并

    1. # 拉取最新主干分支代码
    2. git fetch master
    3. # 切换到自己的分支
    4. git switch/checkout branch
    5. # 将主干分支的最新代码同步到自己的分支上,并将本地分支新增的 commit 放到最新的主干分支的最后面
    6. git rebase master

    4.2 合并提交

    1. git rebase -i [开始 commit id] [结束 commit id]
    2. # 1. 开始 commit id 和 结束 commit id 属于前开后闭区间,即 (开始 commit id, 结束 commit id];意思是开始 commit id 需要取 待合并 commit id 集合中最早的 commit id 的前一个 commit id
    3. # 2. 结束 commit id 通常被省略(禁用),因为该命令默认表示选取 开始 commit id 到最后的一个 commit id,如果结束 commit id 写错,会导致结束 commit 之后的所有 commit 全部被删除,即 (结束 commit id, 最后的 commit id] 被删除
    4. git rebase -i [开始 commit id]
    git rebase 可选参数
    参数简写含义
    pickp保留该 commit
    rewordr保留该 commit,但需要修改该 commit 的注释
    edite保留该 commit,但需要停下来修改提交文件(不仅仅要修改提交注释)
    squashs将该 commit 合并到前一个 commit
    fixupf将该 commit 合并到前一个 commit,但不要保留提交的注释信息
    execx执行 shell 命令
    dropd丢弃该 commit

    十、git log 对比提交历史

    一、A、B 为分支

    git log A..B        找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 B分支最新commit点 的提交记录全部列出

    git log A...B       找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 A分支最新commit点 以及 c点 到 B分支最新commit点 的提交记录以提交时间为顺序全部列出

    git log A..        若当前分支是 B,则等价于 git log A..B

    git log ..A        若当前分支是 B,则等价于 git log B..A

    二、a、b 为commit点

    1. 若 a,b 本来就是同一子分支的两个 commit 点,不是因为 merge 而合并到同一个分支

    git log a..b  等价于 git log a...b,会将 a 到 b 之间的所有 commit 点列出

    2. 若 a,b 本来不是同一子分支的两个 commit 点,是因为 merge 而合并到同一个分支

    1️⃣ 找到 a commit点 合并前所属子分支 A分支,并将 a commit 点作为 A分支 的最后一个 commit点,即逻辑上删除 A分支 a commit点 之后的其余所有 commit 点

    2️⃣ 找到 b commit点 合并前所属子分支 B分支,并将 b commit 点作为 B分支 的最后一个 commit点,即逻辑上删除 B分支 b commit点 之后的其余所有 commit 点

    git log a..b        找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 B分支最新commit点 的提交记录全部列出

    git log a...b       找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 A分支最新commit点 以及 c点 到 B分支最新commit点 的提交记录以提交时间为顺序全部列出

    3️⃣ 若出现待补全的情况,即 a.. 或 ..a,则将当前分支(a 所属分支 A,b 所属分支 B;一般为A、B合并后的总分支 A'(A合并B)或B‘(B合并A) 记为 C)C自动填补至空缺位:

    git log a..          等价于 git log A..C

    git log ..a          等价于 git log C..A

    注意:

    1. 凡是出现空缺位的,无论另一方是 commit 点 还是 分支名,空缺位自动由当前合并后的分支名填补

    2. C 分支包含的 a、b commit点 顺序根据 commit 时间排序

    3. 3️⃣ 所出现的情况为最终为 合并前的 A或B 分支 与 合并后的 C分支 的比较

    十一、为分支添加注释

    1. # 添加注释
    2. git config branch.<分支名>.description "注释"
    3. git branch --edit-description <分支名>
    4. # 查看注释
    5. git config branch.<分支名>.description

    十二、自定义 git 命令

    1. 简单命令

    1. 配置命令

    在 git 安装目录下的 /etc/gitconfig 配置文件中添加如下代码

    1. # 自定义脚本标签
    2. [alias]
    3. # 格式 1
    4. # <命令名> = !sh -c '[命令]'
    5. # 该写法中,-c 是标准的 linux shell 命令,表示将目标字符串转化成一个完整的命令来执行;因此 [命令] 中需要包含 git 关键字
    6. # 格式 2
    7. # <命令名> = [命令]
    8. # 该写法中,会把 [命令] 拼接到控制台的 git,所以不需要 git 关键字
    9. # 举例子,为分支名(输入参数)添加注释
    10. adddesc1 = !sh -c 'git branch --edit-description'
    11. adddesc2 = branch --edit-description

    2. 运行命令

    1. git [命令命]
    2. git adddesc1
    3. git adddesc2

    2. 脚本命令

    1. 配置命令

    1️⃣ 在 git 安装目录下的 usr/bin 目录下新建自己的命令脚本 test.sh (可随意命名)

    2️⃣ 用 linux shell 语法编辑 test.sh

    1. #! /bin/bash
    2. # ...(脚本代码)

    3️⃣ 在 git 安装目录下的 /etc/gitconfig 配置文件中添加如下代码

    1. # 自定义脚本标签
    2. [alias]
    3. <命令命> = !sh <脚本名>
    4. mycmd = !sh test.sh

    2. 运行命令

    git mycmd

  • 相关阅读:
    Haproxy负载均衡群集
    PCIe Gen6的误码率如何计算
    SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3)
    Redis设计与实现(2)链表和链表节点
    tiup update
    C语言重点突破(2)指针(二)
    SpringMVC(五):获取请求参数
    kafka rabbitmq 详细对比
    最小生成树专题1 最小生成树-Prim算法
    S7-1200/1500程序设计规范指南之二:定义
  • 原文地址:https://blog.csdn.net/ITlanyue/article/details/126611271