上一篇git 基本原理对git的使用以及文件分布已经有了一个整体的了解。
本篇将对工作中常用的一些git 操作命令的操作进行总结归纳,方便今后查阅。

文章目录

  • 1. 分离头指针
  • 2. 通过HEAD 来进行不同提交的差异对比
  • 3. 删除不需要的分支
  • 4. 对当前分支最近一次提交的message 做变更
  • 5. 基于当前分支,修改老旧的commit信息
  • 6. 把连续多个commit 整合为一个commit
  • 7. 合并多个不连续的commit信息
  • 8. 比较 暂存区 和 HEAD 最新内容的差异
  • 9. 比较工作区 和 暂存区 最新内容的差异
  • 10. 将暂存区中的内容恢复到HEAD的内容
  • 11. 将工作区内容恢复到暂存区的内容
  • 12. 消除最近的几次commit
  • 13. 查看不同提交的指定文件的内容
  • 14. 如何正确删除git管理的文件
  • 15. 工作中加塞紧急任务,暂存工作区
  • 16. 如何指定不需要git管理的文件
  • 17. 如何将git 仓库备份到本地

1. 分离头指针

当我们想要切换分支的时候,无意中点了commit的对象id,然后在其分支上做了大量的变更。
这个时候当前分离头指针的状态就是没有分支的状态, 此时如果你切换到其他的分支继续进行开发的时候很有能导致之前在分离头指针的状态下做的大量的变更都被丢弃掉了。

过程如下:

  • 分离头指针

    Baron@MacBook-Progit_learning % git checkout bce2f242注意:正在切换到 'bce2f242'。您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换
    回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令
    中添加参数 -c 来实现(现在或稍后)。例如:git switch -c <新分支名>或者撤销此操作:git switch -通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议HEAD 目前位于 bce2f24 modify on temp branch
    
  • 不对其关联分支,在当前状态进行变更
    Baron@MacBook-Progit_learning % echo "222" > readme
    Baron@MacBook-Progit_learning % git add readme
    Baron@MacBook-Progit_learning % git commit -m"add readme file"
    [分离头指针 286afae] add readme file
    1 file changed, 1 insertion(+)
    create mode 100644 readme
    
  • 此时历史版本能够看到正常的变更记录
    Baron@MacBook-Progit_learning % git log
    commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD)
    Author: BaronStack <2689496754@qq.com>
    Date:   Fri Jul 3 19:38:46 2020 +0800add readme filecommit bce2f2428649f640d98d4fbb011084c53c87fa25 (temp)
    Author: BaronStack <2689496754@qq.com>
    Date:   Sat Jun 27 20:34:01 2020 +0800modify on temp branchcommit b360e56b39a5d605918816ea4dc07d61e93b12f8
    Author: BaronStack <2689496754@qq.com>
    Date:   Sat Jun 27 20:27:21 2020 +0800mod testfilecommit 30a71408576f421909d05cdd424703b8866dd943
    Author: BaronStack <2689496754@qq.com>
    Date:   Sat Jun 27 20:26:51 2020 +0800add test_file
    
  • 当我们切换分支之后,会发现因为头指针分离下没有绑定分支,之前的更改便无法找回
    Baron@MacBook-Pro git_learning % git checkout temp
    警告:您正丢下 1 个提交,未和任何分支关联:286afae add readme file如果您想要通过创建新分支保存它,这可能是一个好时候。
    如下操作:git branch <新分支名> 286afae切换到分支 'temp'
    
  • 但是根据git的提示信息,能够发现git会发出分离头指针状态切换时的警告,尽可能阻止我们犯错
    如果我们认为头指针下的变更很重要,接下来只需要按照提示信息就可以对分离头指针的状态进行分支添加。

    Baron@MacBook-Pro git_learning % git branch seprate 286afae
    Baron@MacBook-Pro git_learning % git branch -amasterseprate
    * temp
    Baron@MacBook-Pro git_learning % git checkout seprate
    切换到分支 'seprate'
    Baron@MacBook-Pro git_learning % git ls
    readme      test_file
    

    此时再切换回去的时候已经能够发现在分离头指针状态下的变更(创建的readme文件)已经能够看到了。

2. 通过HEAD 来进行不同提交的差异对比

先描述一下HEAD 指向的含义,每一次git log查看的时候都会发现最新的commit都会有一个HEAD来指向对应的分支或者就是一个单独的HEAD(分离头指针的情况)

#正常的分支
commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD -> seprate)#分离头指针的情况
commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD)

查看.git文件中的HEAD文件,可以看到具体的内容,ref指向一个文件

Baron@MacBook-Pro git_learning % cat .git/HEAD
ref: refs/heads/seprate

查看指向的文件内容,以及类型,可以发现最终的指向还是一个commit类型

Baron@MacBook-Pro git_learning % cat .git/refs/heads/seprate
286afae9cb98199213a546aa2d087a16cc63e391
Baron@MacBook-Pro git_learning % git cat-file -t 286afae9c
commit

所以我们想要对比不同变更的内容差异,即可通过如下方式

  • 对比不同的commit id,git diff 286afae9 bce2f2428

    Baron@MacBook-Pro git_learning % git diff 286afae9 bce2f2428
    diff --git a/readme b/readme
    deleted file mode 100644
    index c200906..0000000
    --- a/readme
    +++ /dev/null
    @@ -1 +0,0 @@
    -222
    
  • 对比HEAD和其父亲的变更, 直接通过 git diff HEAD HEAD~1 或者git diff HEAD HEAD^1

    Baron@MacBook-Pro git_learning % git diff HEAD HEAD^1
    diff --git a/readme b/readme
    deleted file mode 100644
    index c200906..0000000
    --- a/readme
    +++ /dev/null
    @@ -1 +0,0 @@
    -222
    
  • 对比HEAD 和其父亲的父亲 的变更,直接通过git diff HEAD HEAD~2 或者git diff HEAD HEAD^^

    Baron@MacBook-Pro git_learning % git diff HEAD HEAD^^
    diff --git a/readme b/readme
    deleted file mode 100644
    index c200906..0000000
    --- a/readme
    +++ /dev/null
    @@ -1 +0,0 @@
    -222
    diff --git a/test_file b/test_file
    index d8124e2..58c9bdf 100644
    --- a/test_file
    +++ b/test_file
    @@ -1,2 +1 @@111
    -22
    

3. 删除不需要的分支

  • git branch -d branch_name 该情况适用于删除的分支没有新的变更才行,有变更的话会报错
  • git branch -D branch_name 使用-d删除不掉的时候可以使用-D 来删除

大体过程如下

Baron@MacBook-Pro git_learning % git branch -av66389211 286afae add readme filemaster   ade6638 add readme file
* seprate  286afae add readme filetemp     bce2f24 modify on temp branch
Baron@MacBook-Pro git_learning % git branch -d 66389211
已删除分支 66389211(曾为 286afae)。
Baron@MacBook-Pro git_learning % git branch -d temp
已删除分支 temp(曾为 bce2f24)。
Baron@MacBook-Pro git_learning % git branch -d seprate #当前工作目录处于被删除的分支之上,需要更改工作目录
error: 无法删除检出于 '/Users/zhanghuigui/Desktop/work/work_file/mind-map/git_learning' 的分支 'seprate'。
Baron@MacBook-Pro git_learning % git checkout master
切换到分支 'master'
Baron@MacBook-Pro git_learning % git branch -d seprate
error: 分支 'seprate' 没有完全合并。
如果您确认要删除它,执行 'git branch -D seprate'。
Baron@MacBook-Pro git_learning % git branch -D seprate
已删除分支 seprate(曾为 286afae)。
Baron@MacBook-Pro git_learning % git branch -av #删除完成,仅剩下一个分支
* master ade6638 add readme file

4. 对当前分支最近一次提交的message 做变更

git commit --amend 使用vim编辑修改即可

修改之后

5. 基于当前分支,修改老旧的commit信息

git rebase -i commitid 这里的commit id需要填写我们要修改的旧的commit的父亲commit id
保存之后会进入如下页面

修改完成后,git log查看,即能够看到修改的结果已经生效

6. 把连续多个commit 整合为一个commit

git rebase -i commitid 这里的commit id 仍然是所有commit的父亲commit id
我们想要合并如下三个commit信息

则使用其父亲commit的id信息 git rebase -i 9e5a0d1

保存后跳转到message信息的编辑页面

最终已经完成了指定message信息的合并

7. 合并多个不连续的commit信息

gitk --all可视化查看当前commit信息

仍然使用git rebase -i commitid对commit记录进行合并,合并的方式和之前连续的方式一样,只不过修改的时候修改对应的pick为s即可

8. 比较 暂存区 和 HEAD 最新内容的差异

git diff --cached 比较暂存取和HEAD 最新内容的差异

Baron@MacBook-Pro git_learning % echo "444" >> test_file
Baron@MacBook-Pro git_learning % git add test_file #添加到暂存区
Baron@MacBook-Pro git_learning % git diff --cached #将暂存区内容和HEAD进行比较
diff --git a/test_file b/test_file
index 58c9bdf..b8dd46c 100644
--- a/test_file
+++ b/test_file
@@ -1 +1,2 @@111
+444

之后确认暂存区的更改是我们想要的更改,即可进行commit

9. 比较工作区 和 暂存区 最新内容的差异

git diff 默认比较工作区和暂存区的内容
git diff -- test_file 仅仅比较具体文件的工作区和暂存区文件的差异

Baron@MacBook-Pro git_learning % git diff -- test_file
diff --git a/test_file b/test_file
index b8dd46c..f5fb332 100644
--- a/test_file
+++ b/test_file
@@ -1,2 +1,3 @@
-111
+222444
+999999

10. 将暂存区中的内容恢复到HEAD的内容

工作中有时候我们会想要将暂存区中的内容恢复到HEAD的程度,此时有可能工作区中的某一些方案更好,我们就像将暂存取中的变更全部撤销掉,恢复到和HEAD一样的,可以通过命令

  • git reset HEAD 恢复所有暂存区的内容到HEAD
  • git reset HEAD -- test_file 恢复具体的文件内容到HEAD
Baron@MacBook-Pro git_learning % git reset HEAD
重置后取消暂存的变更:
M   test_file
Baron@MacBook-Pro git_learning % git diff --cached #此时可以发现工作区和HEAD已经没有差异了
Baron@MacBook-Pro git_learning %

11. 将工作区内容恢复到暂存区的内容

发现工作区的变更还不如暂存区,此时需要将工作区的内容恢复到暂存区的内容。
较为旧的git版本使用的是git checkout -- filename,为了防止命令执行的歧义,最新的git版本已经变更为git restore filename
执行之前工作区和暂存区的信息差异

执行之后已经恢复成一样的内容了

Baron@MacBook-Pro git_learning % git restore test_file
Baron@MacBook-Pro git_learning % git diff test_file
Baron@MacBook-Pro git_learning %

12. 消除最近的几次commit

这里是指我们工作中有几个commit所有相关的信息都不想要了,这个时候即可变更HEAD头指针的位置

git reset --hard commitid

PS:这条命令非常危险,如果能够确认 真的不需要当前commit之前所有的信息之后即可执行该操作,否则执行命令之后丢弃的变更就找不回来了

如下,我们想要丢弃 蓝色方框内commit之前所有commit变更内容

已经完成变更之后的log信息

13. 查看不同提交的指定文件的内容

git diff commitid commitid --- file
这里只需要指定不同的commit id即可完成不同commit内容的差异比较。

14. 如何正确删除git管理的文件

总共两种方法:

  • 先从工作区删除,再从暂存区删除
    rm file ; git rm file
  • 直接从工作区删除
    git rm file

15. 工作中加塞紧急任务,暂存工作区

当我们工作中突然有了需要在HEAD指向的内容中增加一些功能, 但是我们已经在工作区中了做了大量的变更,此时为了保存我们工作区中的内容,先完成紧急任务,需要使用如下功能来完成。

  • git stash 暂存工作区,同时将工作区内容恢复到HEAD所指的内容
  • git stash list 查看当前有多少个暂存的工作区,栈形式的存储结构
  • git stash apply从当前保存的暂存区列表中取出列表头部暂存区内容
  • git stash pop从当前保存的暂存区列表中取出列表头,并删除列表头

16. 如何指定不需要git管理的文件

我们在实际开发过程中可能只想要让git管理我们需要的源码文件,而像二进制文件,或者.o,.d文件等中间文件都不需要纳入git的版本管理之中,这个时候我们就需要维护一个只管理我们想要的文件。
.gitignore文件就是git 中做这样的事情,我们将我们不想管理的文件按照指定的格式添加到这个文件之中即可。

PS:这里需要注意的是gitignore文件只对不在暂存区中的文件起作用,如果在添加.gitignore之前文件已经存在于暂存区,则此时在.gitignore去除该文件,是不会生效的,且此时的文件名必须叫做.gitignore才能够被git识别。

.gitignore文件格式如下:

*.*jnilib* #支持通配符来匹配文件
*.d-e #所有的.d文件
*.o-* #所有的.o文件
*.swp #所有的.swp文件
*~
*.vcxproj
*.vcxproj.filters
*.sln
*.cmake
.watchmanconfig
CMakeCache.txt
CMakeFiles/
build/

测试如下:

Baron@MacBook-Pro git_learning % cat .gitignore #此时忽略test文件,以及test目录下的所有文件
# test file
testBaron@MacBook-Pro git_learning % ls -al
total 24
drwxr-xr-x   6   staff  192  7  5 12:56 .
drwxr-xr-x  10   staff  320  7  4 12:30 ..
drwxr-xr-x  15   staff  480  7  5 12:57 .git
-rw-r--r--   1   staff   17  7  5 12:56 .gitignore
-rw-r--r--   1   staff    8  7  5 12:06 readme
-rw-r--r--   1   staff    9  7  5 12:40 test_file
Baron@MacBook-Pro git_learning % echo '111' >test #创建一个test文件
Baron@MacBook-Pro git_learning % ls -l
total 24
-rw-r--r--  1   staff  8  7  5 12:06 readme
-rw-r--r--  1   staff  4  7  5 12:59 test
-rw-r--r--  1   staff  9  7  5 12:40 test_file
Baron@MacBook-Pro git_learning % git status
位于分支 master
无文件要提交,干净的工作区

17. 如何将git 仓库备份到本地

git备份时可以用到的传输协议如下,大体分为两种:哑协议和智能协议。
其中哑协议是看不到进度的,智能协议能够看到传输进度,且智能协议性能优于哑协议。

如下使用本地协议进行备份, 其中git clone --bare是指直接备份一个纯仓库到本地。
以下为分别使用两种本地协议进行备份。

git remote add zhineng zhinneg.repo.git 为本地配置远端的git源
当我们在本地做了变更之后,可以将本地的变更同步到远端
git push 即可
或者在远端的指定分之使用git fetch将本地的内容拉回到远端

g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!相关推荐

  1. 微信跳一跳高分系列二:adb shell 中的常用命令

    input 命令 > adb [-s device] shell input [<source>] <command> [<arg>...]The sourc ...

  2. 工作中 linux 常用命令:vi、cp、mv、rm、kill、curl、tail

    centos7 关闭防火墙: 1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: sys ...

  3. Linux学习系列二:Linux中的常用命令

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  4. Server使用过程中的常用命令记录

    记录在使用unix中的常用命令, 以及各个基础组件的常用命令 Please input in head: k8s中nodeport端口范围修改 vim /etc/kubernetes/manifest ...

  5. Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。...

    Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到版权问题. 1.显示日期的 ...

  6. g-git 相关命令 及其 基本原理探索 (一)

    文章目录 git 最小配置作用域 git 创建本地仓库 git log 查看版本演进 .git 目录 refs目录 objects git 三种对象类型详解 (commit ,tree,blob) 因 ...

  7. Git之深入解析工作流程、常用命令与Reset模式分析

    一.Git 工作流程 ① 工作区域 四个区: Workspace:工作区 Index / Stage:暂存区(和 git stash 命令暂存的地方不一样) Repository:仓库区(或本地仓库) ...

  8. git add 所有修改文件_Git 技术干货!工作中quot;Gitquot;的使用实践和常用命令合集!

    作者:洋仔聊编程 出自:InfoQ 写作平台 原文:xie.infoq.cn/article/1ce91dc60431b1b8845729d41 工作中git是一项必不可少的技能,在项目的开发进程中起 ...

  9. 图解 Git 工作原理和常用命令使用教程

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 marklodato.github.io/visual-git-guide/in ...

最新文章

  1. 面向量产的3D目标与车道线检测方法
  2. Thymeleaf中设置每个页面引入公共css样式
  3. python实现线性回归预测_机器学习实战笔记(Python实现)-08-线性回归
  4. 一个简单的linux线程池
  5. 预训练模型对实体的表示能力差?一个简单有效的解法来了!(开源)
  6. linux 双网卡 debian,Debian 双网卡bond
  7. VSCode详细安装教程
  8. 网页下载CAB文件总结
  9. [入门向]标准测试用例模板
  10. mysql alter before_MySQL之alter语句用法总结
  11. 对于J2EE体系架构的理解
  12. 三层架构(网络冗余学习)
  13. java分页用到的控件,laypage分页控件使用方法
  14. svchost.exe不停下载
  15. 上海 -》 张家界 旅行 计划10.1
  16. 【仿真设计】仿真技术在智能制造中的作用;智能制造难点在模型,焦点在仿真;汽车行业CAE研究
  17. 微信小程序招聘管理系统+后台管理系统
  18. 24点计算器Python脚本
  19. java程序员必读书目推荐
  20. Oracle DBA手记4 数据安全警示录

热门文章

  1. Asp.net控件开发学习笔记(三)-控件开发基础
  2. (一次性搞定)ORB_SLAM2地图保存与加载
  3. java ibatis 锁表_oracle查看被锁的表和解锁
  4. Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!
  5. python中不同进制的整数之间可以直接运算_Python 进制转换、位运算
  6. mysql 事务 注意 优化_MySQL日常SQL优化注意事项
  7. android json转db,Android Room:将json结果转换为db对象的有效方法
  8. python中get和set使用_Python对象属性的set和get方法
  9. android window 大小,android popupWindow 中宽度莫名很大,求帮助?
  10. linux pcre-devel,ubuntu - 我应该为'pcre-devel'安装什么软件包? - Ubuntu问答