1.刚创建好的空仓库的分支是空的,即使是master分支也是不存在的。master分支是不能通过git branch 来创建的,只有在完成第一次提交才会自动创建,有git自动完成master分子的创建,也就是只有第一次提交创建好master分支后,才能再创建别的分支。因为git本质上就是基于图论原理的,图的第一个起点是系统在第一次提交的时候自动创建的,别的创建的所有的都是其他的分支都是第一个master分支后的“分支”。master作为主分支,在所有的git项目都是固定。所有的git项目都有master主分支,分分支则是不确定的。
harvey@harvey-Virtual-Machine:~/demo3$ git init ../demo4 #创建一个新的空仓库
Initialized empty Git repository in /home/harvey/demo4/.git/
harvey@harvey-Virtual-Machine:~/demo3$ cd ../demo4
harvey@harvey-Virtual-Machine:~/demo4$ echo "fsf">tes #创建新文件t
harvey@harvey-Virtual-Machine:~/demo4$ git add ./ #添加到缓存区
harvey@harvey-Virtual-Machine:~/demo4$ git branch#打印branch 列表发现为空,即使master分支也不存在
harvey@harvey-Virtual-Machine:~/demo4$ git branch master#手动创建master分支失败
fatal: Not a valid object name: 'master'.
harvey@harvey-Virtual-Machine:~/demo4$ git branch 分支#手动创建"分支"分支失败
fatal: Not a valid object name: 'master'.
harvey@harvey-Virtual-Machine:~/demo4$ git commit ./#第一次提交commit(隐式的创建master分支)
[master (root-commit) eca4197] sfsf:wq
1 file changed, 1 insertion(+)
create mode 100644 test
harvey@harvey-Virtual-Machine:~/demo4$ git branch#打印master分支发现分支创建成功
* master
harvey@harvey-Virtual-Machine:~/demo4$ git branch 分支#再次创建“分支”分支
harvey@harvey-Virtual-Machine:~/demo4$ git branch#再打印branch发现列表有数据了
* master
分支
2.没有完成第一次提交也就是没有创建master分支的时候,是不能checkout master的因为没有master分支存在。这个时候,只能使用的是checkout . 命令,因为checkout .的意思就是把缓存区的数据覆盖工作空间.在没有创建提交的时候,可以用点代表全部的缓冲区文件,也可以用git checkout –<file>检出单独的文件。可以认为缓冲区stage就是也个目录,我们的checkout就是从stage这个目录把数据拷贝到当前工作的目录。而commit就是把stage这个文件夹再做单独的备份,备份从原理上也是在master这个主文件下,如果还是单个的子文件夹就是单独分支,如果在master后创建了新的分支就如同创建了新的文件夹。git其实也正是一个文件系统。
harvey@harvey-Virtual-Machine:~$ rm -r -f demo4
harvey@harvey-Virtual-Machine:~$ git init demo4
Initialized empty Git repository in /home/harvey/demo4/.git/
harvey@harvey-Virtual-Machine:~$ cd demo4
harvey@harvey-Virtual-Machine:~/demo4$ echo "tttt">test
harvey@harvey-Virtual-Machine:~/demo4$ git add ./
harvey@harvey-Virtual-Machine:~/demo4$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: test
#
harvey@harvey-Virtual-Machine:~/demo4$ rm test #清空工作空间,这时候工作空间是空的
harvey@harvey-Virtual-Machine:~/demo4$ git checkout master#checkou master失败
error: pathspec 'master' did not match any file(s) known to git.
harvey@harvey-Virtual-Machine:~/demo4$ git checkout . #checkout . 用工作空间的数据
harvey@harvey-Virtual-Machine:~/demo4$ ls#发现从缓存位置取出了缓存的数据
test
3.基于我们认为stage是和工作空间相同的工作目录,历史提交也是工作空间,也就是文件夹。那么我们就可以用diff命令来比较的时候,本质上也是不叫的文件夹。
harvey@harvey-Virtual-Machine:~$ rm -r -f demo4
harvey@harvey-Virtual-Machine:~$ git init demo4
Initialized empty Git repository in /home/harvey/demo4/.git/
harvey@harvey-Virtual-Machine:~$ cd demo4
harvey@harvey-Virtual-Machine:~/demo4$ mkdir a/a/
mkdir: 无法创建目录"a/a/": 没有那个文件或目录
harvey@harvey-Virtual-Machine:~/demo4$ mkdir a/a/ -p
harvey@harvey-Virtual-Machine:~/demo4$ echo "test1">a.txt #创建第一级别的文本文件
harvey@harvey-Virtual-Machine:~/demo4$ echo "test1">a/a/a.txt#创建文件夹下的文本文件
harvey@harvey-Virtual-Machine:~/demo4$ git add ./
harvey@harvey-Virtual-Machine:~/demo4$ git diff #提交在比较,因为此时两个文件夹是同步了的,所以diff没有输出内容,也就是两个文件夹没有差别
harvey@harvey-Virtual-Machine:~/demo4$ echo "ttttt">>a.txt #更改文件
harvey@harvey-Virtual-Machine:~/demo4$ echo "ttttt">>a/a/a.txt #更改文件
harvey@harvey-Virtual-Machine:~/demo4$ git diff #发现输出的内容是比较的两个文件的差异,所以是比较的是文件夹
diff --git a/a.txt b/a.txt
index a5bce3f..9f42087 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1,2 @@
test1
+ttttt
diff --git a/a/a/a.txt b/a/a/a.txt
index a5bce3f..9f42087 100644
--- a/a/a/a.txt
+++ b/a/a/a.txt
@@ -1 +1,2 @@
test1
+ttttt #发现git diff的文件比较顺序是 ”diff stage 工作空间“
harvey@harvey-Virtual-Machine:~/demo4$ git status -s #发现第一个A表示HEAD是空的,M表示stage和工作空间比较内容变化了,具体的变化内容只能通过diff来查看。也就是status显示的是摘要
AM a.txt
AM a/a/a.txt