git深入学习笔记

这篇具有很好参考价值的文章主要介绍了git深入学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

git文件夹探秘

  1. 当初始化仓库的时候,会创建一个.git文件夹,其中包含以下内容:
  • hooks 文件夹 (包含客户端服务端的钩子脚本,如pre-push,pre-merge)
  • info 文件夹 (包含一个全局性排除文件)
  • object 文件夹 (存储所有数据内容)
  • refs 文件夹 (存储指向分支的提交对象的指针)
  • config 文件 (包含项目特有的配置选项)
  • description 文件 (用来显示对仓库的描述信息)
  • HEAD 文件 (指示目前被检出的分支)

底层命令

git对象

git的核心部分就是一个键值对数据库,可以向里面写任意类型的数据,它会返回一个键值,可以通过键值去检索内容。

  • 写内容,返回对应键值 命令如下
echo 'test content' | git hash-object -w --stdin  ##运行此命令后objects文件夹里会多出一个目录(目录名为hash的前两位),里面有一个以一串hash(40个字符)命名的文件
$ find ./.git/objects -type f
./.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4

-w 选项提示 hash-object命令存储数据对象;若不指定此选项,则仅返回对应的键值
–stdin 表示从标准输入读取内容;若不指定此选项,则需在命令尾部给出待存储文件的路径

git hash-object -w 文件路径   ##存文件
git hash-object 文件路径   ##返回对应文件的键值
  • 根据键值查看数据
git cat-file -p 哈希值

-t 显示数据的类型 键值对在git中是blob类型
-p 指示该命令自动判断类型,并为我们显示格式有好的内容

  • 对文件进行简单的版本控制
echo "test.txt v1" > test.txt
git hash-object -w ./test.txt

返回如下

warning: LF will be replaced by CRLF in ./test.txt.
The file will have its original line endings in your working directory   ##不用管
560a3d89bf36ea10794402f6664740c284d4ae3b

根据560a3d89bf36ea10794402f6664740c284d4ae3b查看类型依旧是blob,说明不管是存文件或者文本在git里,都是一个blob对象

说明:
1.当去修改test.txt里的内容的时候,查看objects里面的内容,依旧是之前的状态,需要再次执行git hash-object -w ./test.txt,才会存进去
2.文件名并没有保存,仅仅是保存了文件的内容
3.当前的操作都是对本地数据库进行操作,不涉及暂存区
4.每一个对象只能代表一个文件,不能代表项目的快照
5.这里的操作都是在本地数据库进行操作,不涉及暂存区

树对象

数对象允许我们将多个对象组织在一起,并且可以保存文件名,一个树对象包含一条或多条记录

  • 构建树对象
    1、利用update-index命令为test.txt文件的首个版本创建一个暂存区,并通过write-tree生成树对象
echo "test.txt v1" > test.txt
git hash-object -w ./test.txt
# 返回结果:560a3d89bf36ea10794402f6664740c284d4ae3b
git update-index --add --cacheinfo 100644 560a3d89bf36ea10794402f6664740c284d4ae3b test.txt    #没有往版本库里面放数据,只是在暂存区生成一条记录
# 100644 -> 普通文件
# 100755 -> 可执行文件
# 120000 -> 符号链接
# write-tree 将暂存区做一个快照,生成一个数对象放到版本库当中
# --add: 首次添加暂存区需要加上-add
# --cacheinfo 将要添加的文件位于git数据库中,要加上--cacheinfo
# ls-files -s 查看当前暂存区的内容
git write-tree  # 生成树对象,放到版本库

通过git cat-file -t 查看哈希06e21bb0105e2de6c846725a9a7172f57dd1af96对应的类型,结果为tree
同时通过git ls-files -s查看暂存区内容还在,可以说明在将树对象写到数据库的时候也不会将暂存区的内容清空

2、新增new.txt 将new.txt和test.txt文件的第二个版本放入暂存区,并通过write-tree命令生成树对象

 echo "new v1" > new.txt
 git hash-object -w new.txt
 # 返回结果: eae614245cc5faa121ed130b4eba7f9afbcc7cd9
 find .git/objects/ -type f
 # 返回结果: .git/objects/ea/e614245cc5faa121ed130b4eba7f9afbcc7cd9
 vim test.txt # 更改文件内容
 git hash-object -w test.txt  # 改了test.txt,为其重新生成树对象
 # 返回结果: c31fb1e89d8b6b3ef34cdb5a2f999d6e29b822ba
 find .git/objects/ -type f   # 查看会发现生成了一个新的hash
git update-index --add --cacheinfo 100644 c31fb1e89d8b6b3ef34cdb5a2f999d6e29b822ba test.txt    #之前存在于暂存区的test.txt这条记录会被覆盖
git ls-file -s
# 返回结果: 100644 c31fb1e89d8b6b3ef34cdb5a2f999d6e29b822ba 0       test.txt (hash被覆盖了)
git update-index --add --cacheinfo 100644 eae614245cc5faa121ed130b4eba7f9afbcc7cd9 new.txt
git ls-files -s
# 返回结果: 100644 eae614245cc5faa121ed130b4eba7f9afbcc7cd9 0       new.txt
# 100644 c31fb1e89d8b6b3ef34cdb5a2f999d6e29b822ba 0       test.txt
git write-tree # 生成树对象
# 返回结果: 9d74ec4055e0f1edc1921d749c250380ca7b5ebd

通过find .git/objects/ -type f 查看仓库会发现树对象添加了进去

3、将第一个树对象加入第二个数对象,使其成为新的树对象

git read-tree --prefix=bak 06e21bb0105e2de6c846725a9a7172f57dd1af96
git ls-files -s
# 返回结果:100644 560a3d89bf36ea10794402f6664740c284d4ae3b 0       bak/test.txt
 git write-tree
 # 返回结果:17d1ee3eac87d38448e7ff2cc92e88ed4e9aa094

问题:根据树对象不知道是谁保存了这些快照,在什么时候存的,以及为什么保存这些快照。

git cat-file -p 17d1ee3eac87d38448e7ff2cc92e88ed4e9aa094 # 查看树对象
# 返回结果:040000 tree 06e21bb0105e2de6c846725a9a7172f57dd1af96    bak
# 100644 blob eae614245cc5faa121ed130b4eba7f9afbcc7cd9    new.txt
# 100644 blob c31fb1e89d8b6b3ef34cdb5a2f999d6e29b822ba    test.txt

提交对象

可以通过commit-tree创建一个提交对象,并需要指定一个SHA-1值,以及该提交的父提交对象
1、创建提交对象

echo 'first commit' | git commit-tree 06e21bb0105e2de6c846725a9a7172f57dd1af96
git cat-file -t 43d3e591ca6f1e07c718b5eb855f2fa2379e12f4
# 返回结果:commit
git cat-file -p 43d3e591ca6f1e07c718b5eb855f2fa2379e12f4
# 返回结果:tree 06e21bb0105e2de6c846725a9a7172f57dd1af96
# author xxx <xxx@qq.com> 1704503195 +0800
# committer xxx <xxx@qq.com> 1704503195 +0800
echo 'sencond commit' | git commit-tree 9d74ec4055 -p 43d3e591ca6f1e07c718b5eb855f2fa2379e12f4
# 返回结果: 63df84c5b896a06ba827e17a7184b67a6bc20cad
git cat-file -p 63df84c5b896a06ba827e17a7184b67a6bc20cad
# 返回结果: tree 9d74ec4055e0f1edc1921d749c250380ca7b5ebd
# parent 43d3e591ca6f1e07c718b5eb855f2fa2379e12f4
# author 胡玉龙 <647855054@qq.com> 1704503619 +0800
# committer 胡玉龙 <647855054@qq.com> 1704503619 +0800

高层命令

本地操作

1、git add ./ # 将工作目录的修改生成git对象放到版本库,然后放到暂存区
包含以下底层命令:
git hash-object -w 文件名(修改了多少个工作目录中的文件 此命令就要被执行多少次)
git update-index

2、git commit -m ‘注释内容’
包含以下底层命令:
git write-tree
git commit-tree

git init 
find .git/objects/ -type f  # 无内容
echo "老付头顶青青草原" > laofu.txt
git add ./  # 将工作目录的修改生成git对象放到版本库,然后放到暂存区
git ls-files -s  # 查看暂存区内容
# 返回结果:100644 a8cac0ea749dc0521e979f498493d8a359a788f1 0       laofu.txt
find .git/objects/ -type f   # 查看版本库                                            
# 返回结果:.git/objects/a8/cac0ea749dc0521e979f498493d8a359a788f1
git cat-file -p a8cac0ea749dc0521e979f498493d8a359a788f1
# 返回结果:老付头顶青青草原
git cat-file -t a8cac0ea749dc0521e979f498493d8a359a788f1
# 返回结果:blob
git commit -m "这是项目的第一个版本 包含了一个laofu文件 实现了青青草原"
find .git/objects/ -type f
# 返回结果:.git/objects/92/7d83f7b7e6ba0eae2fe56f61879017b3876f8a
# .git/objects/a8/cac0ea749dc0521e979f498493d8a359a788f1
# .git/objects/c0/e49f255b9e7c97748a6c6a8ec6ce20d971b19b

3、git diff 查看未暂存的修改
git diff --cached 或–staged(1.6.1以上) 查看未提交的暂存

4、git commit -a -m “msg” 将所有已经跟踪过的文件暂存起来一并提交,跳过git add步骤

5、git rm 文件名
删除工作目录中对应的文件,再将修改添加到暂存区。
可以替换如下操作:
在工作区删除已提交的文件,然后git add ./

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

7、git 原文件名 新文件名 将工作目录中中的文件进行重命名,再将修改添加到暂存区

8、git log --online --decorate --graph --all 查看项目分叉历史

9、git config --global alias.lgo “log --oneline --decorate --graph --all” 为上述命令配别名

分支操作

git checkout -b 分支名 新建分支并切换上去
git bcanch 分支名 commitHash 在指定的提交对象上创建新的分支
git branch -d 分支名 删除分支(空的分支/已经被合并的分支)
git branch -D 分支名 强制删除分支

注意:分支切换会改变工作目录中的文件,如果是切换到一个旧的分支,当前的工作目录会恢复到该分支最后一次提交时的样子,如果git不能完成这个任务,它将禁止切换分支

分支实战
git init
echo "a.txt v1" > a.txt
git add a.txt
git commit -a -m "1 commit for a.txt v1"
git lgo
#返回结果:fc0f944 (HEAD -> master) 1 commit for a.txt v1
vim a.txt  # 添加a.txt v2
git commit -a -m "2 commit for a.txt v2"
#返回结果:* fae4921 (HEAD -> master) 2 commit for a.txt v2
#        * fc0f944 1 commit for a.txt v1
git checkout -b test  # 创建test分支并切换过去
git lgo
# 返回结果:* fae4921 (HEAD -> test, master) 2 commit for a.txt v2
#         * fc0f944 1 commit for a.txt v1

此时工作目录只有一个a.txt

echo "b.txt v1" > b.txt
git add ./
git commit -m "3 commit for b.txt v1"
git lgo
# 返回结果:* 9b47191 (HEAD -> test) 3 commit for b.txt v1
#         * fae4921 (master) 2 commit for a.txt v2
#         * fc0f944 1 commit for a.txt v1

此时工作目录有a.txt和b.txt两个文件,查看暂存区内容如下:

git ls-files -s 
100644 38c7912943d1b1f3b89c966f977100f88372f993 0       a.txt
100644 0a170006b042f0456d14dd4800c007c4b5f8ea1d 0       b.txt

git checkout master 切换分支后查看暂存区内容发生了改变:

git ls-files -s
100644 38c7912943d1b1f3b89c966f977100f88372f993 0       a.txt

说明:切换分支会改变head,暂存区,工作目录

最佳实践:每次切换分支前,通过git status查看当前分支一定得是干净的(处于已提交状态)

错误举例:在test这个新分支上增加新的功能(比如新建c.txt),但是没有添加,也没有暂存,相当于没有给git管理,如果这时从test分支切换到master分支,文件就会被保留,这是git的安全机制

git chectout test
echo "c.txt v1" > c.txt   
#  c.txt 未暂存
git checkout master   # 会发现c.txt依旧存在,会污染主分支  工作目录显示a.txt和b.txt

坑(初始化的时候):在切换分支时,如果当前分支上有未暂存的修改(第一次)或有未提交的暂存(第一次),分支可以切换成功,但是这种操作可能会污染其它分支

git checkout test
git add ./
git ls-files -s
# 返回结果:100644 38c7912943d1b1f3b89c966f977100f88372f993 0       a.txt
#         100644 0a170006b042f0456d14dd4800c007c4b5f8ea1d 0       b.txt
#         100644 512ff49d382961b3157260f6e6688013904caf5c 0       c.txt
$ git checkout master
# 返回结果:Switched to branch 'master'
#         A       c.txt
git ls-files -s
# 返回结果:100644 38c7912943d1b1f3b89c966f977100f88372f993 0       a.txt
#         100644 512ff49d382961b3157260f6e6688013904caf5c 0       c.txt

这时如果切到test分支然后提交再回master就没问题

git checkout test
git lgo
# 返回结果: * 9b47191 (HEAD -> test) 3 commit for b.txt v1
#          * fae4921 (master) 2 commit for a.txt v2
#          * fc0f944 1 commit for a.txt v1
git commit -m "4 commit for c.txt v1"
git status
#返回结果: On branch test
#         nothing to commit, working tree clean
$ git checkout master  # 这时会发现工作目录只有a.txt

如果是提交过的,再切换,git会报错不让切换,必须提交完再切换(当切换到test分支修改c.txt中的内容后,没有添加到暂存区,然后切换到master分支会报错):

git checkout test
vim c.txt # 增加c.txt v2
$ git status
#返回结果:On branch test
#        Changes not staged for commit:
#          (use "git add <file>..." to update what will be committed)
#          (use "git restore <file>..." to discard changes in working directory)
#                modified:   c.txt
git checkout master
# 返回结果:error: Your local changes to the following files would be overwritten by    checkout:
#              c.txt
#        Please commit your changes or stash them before you switch branches.
#        Aborting
实际案例

工作流:
1、开发某个网站
2、为实现某个新的需求,创建一个分支
3、在这个分支上开展工作
正在此时,你突然接到一个电话说有一个很严重的问题需要紧急修补,最后将改动添加到线上分支
4、切换回最初工作的分支上,继续工作

假设你正在项目上工作,并有一些提交

git commit -a -m "5 commit for c.txt v2"
git lgo 
# * 7ce26eb (HEAD -> test) 5 commit for c.txt v2
# * 61d8a81 4 commit for c.txt v1
# * 9b47191 3 commit for b.txt v1
# * fae4921 (master) 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1
git checkout master
git branch -D test
git lgo
# * fae4921 (HEAD -> master) 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1

创建新分支,去解决bug

git checkout -b "#53"
git checkout -b iss53
echo "iss53 50%" > iss53.txt
git add ./
git commit -m "6 commit iss53 50%"
git lgo
# * b7525c8 (HEAD -> iss53) 6 commit iss53 50%
# * fae4921 (master) 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1
git reflog
# b7525c8 (HEAD -> iss53) HEAD@{0}: commit: 6 commit iss53 50%
# fae4921 (master) HEAD@{1}: checkout: moving from master to iss53
# fae4921 (master) HEAD@{2}: checkout: moving from #53 to master
# fae4921 (master) HEAD@{3}: checkout: moving from master to #53
# fae4921 (master) HEAD@{4}: checkout: moving from test to master
# 7ce26eb HEAD@{5}: commit: 5 commit for c.txt v2
# 61d8a81 HEAD@{6}: checkout: moving from master to test
# fae4921 (master) HEAD@{7}: checkout: moving from test to master
# 61d8a81 HEAD@{8}: commit: 4 commit for c.txt v1
# 9b47191 HEAD@{9}: checkout: moving from master to test
# fae4921 (master) HEAD@{10}: checkout: moving from test to master
# 9b47191 HEAD@{11}: checkout: moving from master to test
# fae4921 (master) HEAD@{12}: checkout: moving from test to master
# 9b47191 HEAD@{13}: checkout: moving from master to test
# fae4921 (master) HEAD@{14}: checkout: moving from test to master
# 9b47191 HEAD@{15}: commit: 3 commit for b.txt v1
# fae4921 (master) HEAD@{16}: checkout: moving from master to test
# fae4921 (master) HEAD@{17}: commit: 2 commit for a.txt v2
# fc0f944 HEAD@{18}: commit (initial): 1 commit for a.txt v1
git checkout master
git lgo
# * b7525c8 (iss53) 6 commit iss53 50%
# * fae4921 (HEAD -> master) 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1
git checkout -b hotbug
git lgo
# * b7525c8 (iss53) 6 commit iss53 50%
# * fae4921 (HEAD -> hotbug, master) 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1
vim a.txt  # 添加a.txt v3模拟修复了bug
git add ./
git commit -m "7 commit for a.txt v3 to fix hotbug"
git lgo
# * 15ae85f (HEAD -> hotbug) 7 commit for a.txt v3 to fix hotbug
# | * b7525c8 (iss53) 6 commit iss53 50%
# |/
# * fae4921 (master) 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1

切换到主分支

git checkout master
git merge hotbug
# Updating fae4921..15ae85f
# Fast-forward   快进合并不会产生冲突
#  a.txt | 1 +
#  1 file changed, 1 insertion(+)

解释:fast-forward 由于当前master分支所指向的提交是你当前提交的直接上游,所以git只是简单的将指针向前移动。换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么在合并的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧,这就叫做快进。

当修改了a.txt和iss53.txt中的内容:

git branch -d hotbug
git checkout iss5
vim iss53 # 添加iss53 100%
git commit -a -m "8 commit for iss53.txt 100%"
git lgo
# * 1ee6edf (HEAD -> iss53) 8 commit for iss53.txt 100%
# * b7525c8 6 commit iss53 50%
# | * 15ae85f (master) 7 commit for a.txt v3 to fix hotbug
# |/
# * fae4921 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1
vim a.txt # 添加a.txt v3 for issue53
git commit -a -m "9 commit for iss53.txt to patch a.txt v3 to real 100%"
git lgo
# * d6474b1 (HEAD -> iss53) 9 commit for iss53.txt to patch a.txt v3 to real 100%
# * 1ee6edf 8 commit for iss53.txt 100%
# * b7525c8 6 commit iss53 50%
# | * 15ae85f (master) 7 commit for a.txt v3 to fix hotbug
# |/
# * fae4921 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1

切换到主分支,进行合并,会产生冲突:

git checkout master
git merge iss53
# Auto-merging a.txt
# CONFLICT (content): Merge conflict in a.txt
# Automatic merge failed; fix conflicts and then commit the result.
vim a.txt
# a.txt v1
# a.txt v2
# <<<<<<< HEAD
# a.txt v3
# =======
# a.txt v3 for issue53
# >>>>>>> iss53
git add ./
git commit -m "10 commit for fix ct"
git branch -d iss53
git lgo
# *   38b5b43 (HEAD -> master) 10 commit for fix ct
# |\
# | * d6474b1 9 commit for iss53.txt to patch a.txt v3 to real 100%
# | * 1ee6edf 8 commit for iss53.txt 100%
# | * b7525c8 6 commit iss53 50%
# * | 15ae85f 7 commit for a.txt v3 to fix hotbug
# |/
# * fae4921 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1

分支原理

HEAD引用:当运行类似于git branch这样的命令时,git会通过head文件(HEAD文件是一个符号引用,指向目前所在的分支)取得当前所在分支最新提交对应的SHA-1值,并将其加入你想要创建的任何新分支中。
换句话说分支就是一个没有后缀名的文件,里面存着一个hash

git存储

使用场景:有时在项目的某个模块上开发了一段时间后,想要切换到另一个分支做点别的事情,但我不想为这做了一半的工作创建一次提交

git stash命令:将未完成的修改保存到一个栈上,后面可以应用这些改动(git stash apply)
git stash list 查看存储
git stash apply stash@{2} 应用指定的储存
git stash pop 来应用储存然后立即从栈上移除
git stash drop 加上将要移除的储存的名字来移除它

vim damu.txt # 修改damu.txt  加上damu.txt v2
git checkout master   # 没提交切换分支直接报错
# error: Your local changes to the following files would be overwritten by checkout:
#         damu.txt
# Please commit your changes or stash them before you switch branches.
# Aborting
git stash list  # 无结果
git stash
# warning: LF will be replaced by CRLF in damu.txt.
# The file will have its original line endings in your working directory
# Saved working directory and index state WIP on damu: d7fbfa8 11 commit for damu.txt v1
git stash list
# stash@{0}: WIP on damu: d7fbfa8 11 commit for damu.txt v1
git log --oneline  # git默认做的提交是看不到的  git lgo可以看到
# d7fbfa8 (HEAD -> damu) 11 commit for damu.txt v1
# 38b5b43 (master) 10 commit for fix ct
# d6474b1 9 commit for iss53.txt to patch a.txt v3 to real 100%
# 1ee6edf 8 commit for iss53.txt 100%
# 15ae85f 7 commit for a.txt v3
# b7525c8 6 commit iss53 50%
# fae4921 2 commit for a.txt v2
# fc0f944 1 commit for a.txt v1
git checkout master # 这时可以切换成功
# Switched to branch 'master'
git checkout damu
git stash apply  # 只是应用,并不删除
# On branch damu
# Changes not staged for commit:
#  (use "git add <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#         modified:   damu.txt
git stash drop stash@{0}  # 应用并删除   git stash pop 也行(更直接)
# Dropped stash@{0} (36492f674de6879a3ae5537af1425b3424924f14)

后悔药

  • 工作区 撤回自己在工作目录中的修改 git checkout --filename
  • 暂存区 撤回自己的暂存 git reset HEAD filename
  • 版本库 撤回自己的提交 (1:内容写错就重新提交 2:修改注释)

假如要将damu.txt中的damu.txt v2撤销

cat damu.txt
# damu.txt v1
# damu.txt v2
git status
# On branch damu
# Changes not staged for commit:
#  (use "git add <file>..." to update what will be committed)
#  (use "git restore <file>..." to discard changes in working directory)
#        modified:   damu.txt
git checkout -- damu.txt
cat damu.txt
# damu.txt v1

vim damu.txt # 新增damu.txt v2
git add ./
git ls-files -s
# 100644 d87f264f36149d2ab8e3a8e9dbdf49ee4aaa3ba8 0       a.txt
# 100644 f8a4ded58e93c576a7a9efd9ed4e37aaff62c46a 0       damu.txt
# 100644 b84547efb8db9f66c397f834ec2ccf6039ac09ec 0       iss53.txt
git cat-file -p f8a4ded58e93c576a7a9efd9ed4e37aaff62c46a
# damu.txt v1
# damu.txt v2
git status
# On branch damu
# Changes to be committed:
#   (use "git restore --staged <file>..." to unstage)
#         modified:   damu.txt
git reset HEAD damu.txt
# Unstaged changes after reset:
# M       damu.txt
git ls-files -s
# 100644 d87f264f36149d2ab8e3a8e9dbdf49ee4aaa3ba8 0       a.txt
# 100644 167097be1530463ccbd208ad909c5ef9fc4fd892 0       damu.txt
# 100644 b84547efb8db9f66c397f834ec2ccf6039ac09ec 0       iss53.txt
git cat-file -p 167097be1530463ccbd208ad909c5ef9fc4fd892
# damu.txt v1
git status
# On branch damu
# Changes not staged for commit:
#  (use "git add <file>..." to update what will be committed)
#  (use "git restore <file>..." to discard changes in working directory)
#        modified:   damu.txt
git checkout -- damu.txt
git status
# On branch damu
# nothing to commit, working tree clean
cat damu.txt
# damu.txt v1

vim damu.txt #新增错误内容
git add ./
git commit -m "12 commit for damu.txt v2"
cat damu.txt
# damu.txt v1
# sadfasfaa
git reflog # 显示了完整的操作记录
vim damu.txt # 改为正确内容
git add ./
git commit -m "13 commit for real damu.txt v2"
vim damu.txt # 添加damu.txt v3
git commit -a -m "13 commit for damu.txt v2" # 本来应该是第14次提交,但写成了13次提交
git lgo
# 81f4023 (HEAD -> damu) 13 commit for damu.txt v2
# * bfd41ad 13 commit for real damu.txt v2
# * 7f5ffef 12 commit for damu.txt v2
# * d7fbfa8 11 commit for damu.txt v1
# *   38b5b43 (master) 10 commit for fix ct
# |\
# | * d6474b1 9 commit for iss53.txt to patch a.txt v3 to real 100%
# | * 1ee6edf 8 commit for iss53.txt 100%
# | * b7525c8 6 commit iss53 50%
# * | 15ae85f 7 commit for a.txt v3 to fix hotbug
# |/
# * fae4921 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1
git commit --amend  # 修改注释
git lgo
# 81f4023 (HEAD -> damu) 14 commit for damu.txt v3
# * bfd41ad 13 commit for real damu.txt v2
# * 7f5ffef 12 commit for damu.txt v2
# * d7fbfa8 11 commit for damu.txt v1
# *   38b5b43 (master) 10 commit for fix ct
# |\
# | * d6474b1 9 commit for iss53.txt to patch a.txt v3 to real 100%
# | * 1ee6edf 8 commit for iss53.txt 100%
# | * b7525c8 6 commit iss53 50%
# * | 15ae85f 7 commit for a.txt v3 to fix hotbug
# |/
# * fae4921 2 commit for a.txt v2
# * fc0f944 1 commit for a.txt v1

vim damu.txt  # 添加了damu.txt 漏了v4
git add ./  # 添加到暂存区之后记起来没有加上v4
vim damu.txt  # 再次编辑 加上v3
git status
# On branch damu
# Changes to be committed:
#   (use "git restore --staged <file>..." to unstage)
#         modified:   damu.txt

# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#        modified:   damu.txt

#如果这时候commit只能把第一次改的提交
git commit -m "fasdfasf"
git status # 这时候发现里面还有内容
# On branch damu
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#         modified:   damu.txt
git add ./  
git commit --amend # "15 commit for damu.txt v4"  

reset 三部曲

git reset --soft HEAD~ 移动HEAD指向的分支
本质上是撤销了上一次git commit命令,当在运行git commit时,git会创建一个新的提交,并移动HEAD所指向的分支使其指向该提交文章来源地址https://www.toymoban.com/news/detail-811375.html

到了这里,关于git深入学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS深入学习笔记 - 第一章.构造函数原型与原型链

    1.1 概述 在典型的  OOP 语言中(如Java),都存在类的概念, 类就是对象的模板,对象就是类的实例 ,但在ES6之前,JS并没有引入类的概念。 在 ES6之前 ,对象不是基于类创建的,而是一种称为 构建函数 的特殊函数来定义对象和它们的特征。 有三种创建对象的方式: 对象字面

    2024年02月08日
    浏览(30)
  • JS深入学习笔记 - 第三章.变量作用域与内存

    1.原始值和引用值 ECMScript变量包含两种不同类型是数据:原始值和引用值。 原始值:最简单的数据。有6中原始值:Undefined、Null、Boolean、Number、String和Symbol。原始值是按值访问。 引用值:由多个值构成的对象。三大引用类型:1.object 2.Array类型 3.Function类型。引用值是保存在

    2024年02月08日
    浏览(39)
  • 《Git学习笔记:IDEA整合Git》

    通过Git命令可以完成Git相关操作 ,为了简化操作过程,我们可以 在IDEA中配置Git ,配置好后就可以 在IDEA中通过图形化的方式来操作Git 。 在IDEA开发工具中可以集成Git: 集成后在IDEA中可以看到Git相关图标 :   在IDEA中使用Git,本质上还是使用的本地安装的Git软件 ,所以需要

    2024年01月20日
    浏览(36)
  • 《深入理解计算机系统(CSAPP)》第8章 异常控制流 - 学习笔记

    写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理总结,希望读者理解。 《深入理解计算机

    2024年02月08日
    浏览(52)
  • Git学习笔记:3 git tag命令

    git tag 是 Git 中用于管理和操作标签(tag)的命令。标签在Git中主要用于标记特定的提交,通常用来标识重要的版本发布点,如v1.0.0、v2.1.5等。 创建一个轻量标签(不包含额外信息): 创建一个带有注释的annotated标签(推荐使用,因为它可以存储更多元数据和PGP签名): 列出

    2024年01月25日
    浏览(34)
  • Git命令学习及Git 与 GitHub 的绑定实现学习笔记

    目录 一.Git常用命令及创建本地仓库步骤  二.利用 SSH 完成 Git 与 GitHub 的绑定 三.本地没有git仓库,拉取github仓库代码到本地并push代码到远程仓库步骤 四.本地有仓库,拉取github仓库代码到本地并push代码到远程仓库步骤 一.Git常用命令及创建本地仓库步骤 1.首先使用cd命令进入

    2024年02月04日
    浏览(39)
  • 区块链学习笔记(6(1),深入理解Linux运维的核心知识点

    (3)检查创世块文件 (4)  检查通道文件(fabric2.2及以前会用到) 创建节点的方式有两种: (1)在创建任何节点之前,必须在本机上自定义其配置文件。对于peer节点,该文件称为 core.yaml ,而orderer节点的配置文件称为 orderer.yaml; (2)使用一个docker容器,将docker节点跑在一个

    2024年04月29日
    浏览(39)
  • Git学习笔记(第3章):Git常用命令

    目录 3.1 设置用户签名 3.2 初始化本地库 3.3 查看本地库状态 3.4 添加暂存区 3.5 提交本地库 3.6 历史版本 3.7 修改文件 3.8 版本穿梭 小结 命令 作用 git config --global user.name 用户名 设置用户签名 git config --global user.email 邮箱 设置用户签名 git init 初始化本地库 git status 查看本地库状

    2024年01月20日
    浏览(45)
  • Git && Docker 学习笔记

    注意:该文章摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除! 目录 列举工作中常用的几个git命令? 提交时发生冲突,你能解释冲突是如何产生的吗?你是如何解决的? git的4个区域及转换 如果代码出现bug,你们是如何解决的? git rebase的作用? 列举工作中常用的

    2024年01月23日
    浏览(29)
  • 学习笔记(四):git

    又来了!主要还是自己太菜了,什么都需要记录一下。本次内容主要是git和gitea的安装使用。 1、下载官网:Git - Downloads (git-scm.com)  2、找到已下载的安装包文件,点击安装    3、安装就默认下一步即可,在安装目录选择中可根据个人偏好修改,以下是安装完成的几个标志  

    2024年02月03日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包