g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!
上一篇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会发出分离头指针状态切换时的警告,尽可能阻止我们犯错
如果我们认为头指针下的变更很重要,接下来只需要按照提示信息就可以对分离头指针的状态进行分支添加。
此时再切换回去的时候已经能够发现在分离头指针状态下的变更(创建的readme文件)已经能够看到了。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
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
恢复所有暂存区的内容到HEADgit 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
将本地的内容拉回到远端
相关文章:

Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换
题目描述:编写一个函数实现Linux文件寻址的算法,即读取文件当前位置到物理存储位置的转换函数,需要给出运行的测试数据,可以假设和模拟需要的数据和结构。即编写一个函数unsigned long ltop(unsigned long logblkNum). 计算逻辑块…

datatable和dataset的区别
DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表。插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库,DataTable是一个内存中的数据表,DataSet里可以存储多个DataTabledatatable是dataset中的一个表另…

如何避免重构带来的危险
http://blog.jobbole.com/30049/ 重构代码很危险,它会给测试工作增加巨大的负担。除非你的程序需要重构,一定不要轻易重构代码。我这里所说的并不是把一个for循环改成while循环,或把一个StringBuffer改成StringBuilder,我说的是大…

ip通信(第二周)
计算机网络分为局域网(LAN)、城域网(MAN)和广域网(WAN)。拓扑结构分为星型网,树形网,分布式网络,总线型网络,环型网络和复合型网络。认识了几个常见的国际标准…

《DDIA》读书笔记
数据存储系统的经典书籍: 从数据系统的特性开始,先讲单机存储引擎 再到 分布式存储系统,最后到一些数据流的处理方式,作者深入浅出,译者更是精雕细琢,本书需要细品。 将持续阅读整理,先从理论走…

linux网卡设置adsl上网,Linux下设置ADSL自动拨号上网
前段时间下载了红帽的linux,版本为redhat 9.0,整整刻了三张CD。最初是为了体验一下linux下QQ聊天软件的功能,最后因内核太低(官方推荐内核在2.6以上,我下载的版本是2.4)而告终。最大的收获是了解了linux下文件系统及linux下软件与…

安卓天天酷跑脚本刷高分图文教程
http://news.gamedog.cn/a/20130923/241742.html

SpringBoot 中 JPA 的使用
前言 第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。下面我们就用一个例子来讲述以下 JPA 使用的基本操作。 新建项目,增加依赖 在 Intellij IDEA 里面新建一个…

《DDIA》读书笔记(一):可靠性、可扩展性、可维护性
这一节描述了密集型应用的基本思考方式。 可靠性。意味着系统发生故障,也能保持正常的运行。故障会集中在三个方面,硬件故障(通常是随机和不相关的)、软件故障(通常是系统性的bug,较难发现,较难处理),人为故障(不可避免得时不时出…

TCP协议-TCP连接管理
TCP协议是 TCP/IP 协议族中一个非常重要的协议。它是一种面向连接、提供可靠服务、面向字节流的传输层通信协议。TCP(Transmission Control Protocol,传输控制协议)。

[Unity WWW] 跨域访问解决方法
什么是跨域访问 域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配…

linux环境安全测评实验报告,linux第一次实验报告
iframe载入页面过程显示动画效果http://www.xfeixiang.com/Bug/Detail/A2FD7EFFA8CA72F1加密算法使用(三):用用BASE64采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到 package testEncrypt; import java.security.Key; import java.secu ...jav…

2019-03-20 Python爬取需要登录的有验证码的网站
当你向验证码发起请求的时候,就有session了,记录下这次session因为每当你请求一次验证码 或者 请求一次登录首页,验证码都在变动验证码的链接可能不是固定的,可能需要GET/POST请求,获取那部分变动的信息 session requests.sessio…

Mac上 如何快速玩起rocksdb
想要自己随时随地写一写rocksdb的代码,并且快速测试,但是公司的物理机登陆过于麻烦,想要验证功能的话其实在自己的电脑就完全可以了。 安装 brew install rocksdb,默认二进制文件安装在/usr/local/bin在~/.bashrc或者自己正在使用…

OC学习篇之---对象的拷贝
在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来介绍一下OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语…

linux脚本自定义赋值,JMeter——运用BeanShell给自定义的变量动态赋值
这个计划中定义了以下组件:用户自定义变量:里面定义了2个变量,一个是us(注意,未对它初始化),一个变量名是:test ,值为:123456一个BeanShell Sampler:${test}表示传入BeanShell Sampl…

VS2010与Qt设置出现红线提示
任何类库导入都有可能出现红线,主要原因是“包含目录没有设置”点击“项目”-> (你的项目)属性->配置属性->VC目录->包含目录 把你的目录写入(我的是:H:\Qt\4.8.5\include)点击确定~ 完成。转载…

java-方法。(新手)
//导入包。import java.util.Arrays;import java.util.Calendar;import java.util.Date;//创建的一个类。public class zylx1 { //公共静态的主方法。 public static void main(String[] args){ //调用方法。 lx8(); } //创建方法。//使日历向后偏移…

《Bigtable:a distributed storage system for struct data》笔记
Bigtable 可以说是log-structed以及page-oriented 两种存储引擎的整合体,我们性能优越的单机存储引擎leveldb和rocksdb就是基于google的bigtable存储系统实现的。 论文地址Bigtable: A Distributed Storage System for Structured Data bigtable是基于分布式的存储…

linux 查看线程详细信息,Linux 下查看线程信息
1. 使用 pstree -p PIDps aux | grep firefox | grep -v grepcharles 26058 0.0 0.0 4908 1152 ? S 19:17 0:00 /bin/sh /usr/lib/firefox-3.5.4/run-mozilla.sh /usr/lib/firefox-3.5.4/firefoxcharles 26073 7.6 3.4 284264 70164 ? Sl 19:1…

Bootstrap学习的点点滴滴
1)网站:http://www.bootcss.com/http://v3.bootcss.com/getting-started/#downloadhttps://github.com/twbs/bootstraphttp://getbootstrap.com杭州移动用的是2.3版本,手册地址: http://docs.bootcss.com/bootstrap-2.3.2/docs/ja…

Angry Grammar Nazi
Angry Grammar Nazi 1、给出的几个要处理的字符串没有重复性(子串),不必考虑某个单词是算在哪个种类中; 2、给出的几个要处理的字符串(除了“lol”)都是单词或短语,可以直接搜索 3、给出的处理长…

Linux——查看
查看当前系统版本: lsb_release -a #没有装:yum install lsb 查看当前运行端口: netstat -atunlp #没有装:yum install net-tools -a :all,表示列出所有的连接,服务监听,Socket…

Rocksdb 事务(一): 隔离性的实现
文章目录前言1. 隔离性2. Rocksdb实现的隔离级别2.1 常见的四种隔离级别2.2 Rocksdb 支持的隔离级别及基本实现2.2.1 ReadComitted 隔离级别的测试2.2.2 ReadCommitted的实现2.2.3 RepeatableRead的实现2.2.4 事务并发处理3. 一些总结前言 Rocksdb 作为单机存储引擎࿰…

linux镜像修改密码,OpenStack 镜像修改密码方案
现在各大linux厂商,其实已经有专门给openStack提供的镜像,不过国内的朋友,不太习惯老外做镜像的方式,经常问密码是多少。本博客提供几种修改密码方案,仅供参考。前言对OpenStack云主机来说,有以下几种方式登…

专题8-Linux系统调用
1.从用户空间到内核空间的时候需要进行系统调用 2.系统调用通过swi指令实现,这个时候会有一个参数,存放到r7寄存器,用来指定要调用的内核态函数。 3.一般内核态的实际函数可以再任意的.c文件实现,但是必须在call.S里面加上相应的函…

企业架构研究总结(39)——TOGAF架构能力框架之架构委员会和架构合规性
3. 架构委员会 正如前面所说,一个用来对架构治理策略的实现进行监督的跨组织的架构委员会是架构治理策略成功的主要要素之一。架构委员会应该能够代表所有主要干系人的需求,并且通常还需要对整个架构的审查及维护活动负有高级行政职责。通常来讲…

linux c编程之fcntl
fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 其中,操作类型由cmd决定。cmd可取如下值: F_DUPFD:复制文件描述符F_DUPFD_CLOEXEC:复制文件描述符&…

Rocksdb iterator和snapshot 接口
Rocksdb提供迭代器来来访问整个db中的数据,就像STL中的迭代器功能一样,用来访问容器中的具体的数据。 访问形式以及访问接口有如下几种: 遍历所有的key-value//打开db,并初始化一个迭代器指针 rocksdb::Iterator* it db->Ne…

原生js自动完成 [转]
本来想用jquery的autocomplete的,可是需求有些变化,打算改源码,进了源码发现,改起来要的时间太长了,毕竟不是自己写的,改起来慢,在网上开始大肆搜罗资料,终于找到了类似的 本文转自http://www.cnblogs.com/jaiho/archive/2011/02/28/js_autocomplete.html 完成有以下功能&#…