Git合并相关命令细节
合并相关命令
这里的合并指的是自动合并,是采用三路合并算法完成的。提前是存在第三方。
只有两个版本是无法自动合并的,因为无法知道以哪个版本为准。
所以合并时存在三方:
- 本地版本
- 远端版本
- 公共版本
这里列的命令都能进行自动合并时,只是细节上不同。
- merge
- push
- pull
- rebase
- revert
- stash
- apply
其中merge, push, pull, rebase是类似的,都是对两个分支合并,从分支溯源到公共结点,再进行三路合并
自动合并时,公共版本节点不直观的是revert, stash, apply下面章节进行描述。
revert
revert有点不一样,如果在顶端执行
git revert B
相当于以B为祖先节点,将向A与D两个方向的分支合并.
stash
这里主要描述其产生的补丁文件的index,这个是其能进行自动合并的基础。
git stash 与git diff产生的补丁是一样的
先从diff开始
对工作目录文件进行修改后,执行
git diff
diff --git a/Test.txt b/Test.txt
index 1b80f94..829de97 100644
--- a/Test.txt
+++ b/Test.txt
@@ -1,5 +1,6 @@
Some text.
Some text.
Some text.
+Some comment.
Some text.
-Some text.
+Another comment.
index 后面的两个hash (1b80f94,829de97) 其实对应的是前后两个文件 , 最后的"100644"是文件属性,不用理。
使用指令将这两个文件显示出来:
git show 1b80f94
Some text.
Some text.
Some text.
Some text.
Some text.
git show 829de97
fatal: ambiguous argument '829de97': unknown revision or path not in the working tree.
这个应该是git没有收录当前文件造成的。此时,执行
git stash
然后再将其显示出来,执行:
git stash show的含义是显示最顶部的stash。-p即–patch,意思是以补丁的形式显示。
与git diff的结果是一样的,此时再执行
git show 829de97
完全就是之前工作目录未收录的样子。
反过来,可以对工作目录的版本进行hash求值,判断是否与index的一样:
结果是一样的。
apply
涉及合并是因为它能应用补丁,而且可以反向应用(-R)。
只要补丁中包含的index在仓库中,意味着有祖先版本与目标版本,就没有合并不了的补丁,无非就是手工处理冲突。
对乱码的说明
这两个汉字,其实是UTF-8 BOM与字母’S’的编码被当成简体中文显示造成的。以下是维基对UTF-8 BOM的描述:
UTF-8
The UTF-8 representation of the BOM is the (hexadecimal) byte sequence 0xEF,0xBB,0xBF.
下面是工具对这两个汉字的解码与再编码结果:
相关命令
计算文件的hash值:
git hash-object <file>
显示hash的文件内容
git show <hash>
…(img-b0ZXVEnt-1610445224957)]
相关命令
计算文件的hash值:
git hash-object <file>
显示hash的文件内容
git show <hash>