Git的不同分支中对不同状态的文件的存在情况实际测试
1.创建一个新的文件夹"branchTest"
2.用git init命令把这个文件夹初始化为Repository仓库
3.在文件夹"branchTest"中新建一个文件"1.txt"
4.当前默认的唯一主分支为master,我们使用git add git commit命令把"1.txt"提交为“第一次提交”
5.用git branch dev命令创建一个分支dev。创建好分支后,使用命令git branch查看当前仓库中有哪些分支
果然,目前有两个分支了
5.我们新建一个文件untracked.txt,在GitBash中用git status命令查看当前状态,果然GitBash提醒我们Git有一个未被跟踪的文件untracked.txt
6.我们用git checkout dev命令把当前的主分支master切换到分支dev,发现未被跟踪的untracked.txt居然还存在!我们在当前的dev分支里面,使用git status命令,发现GitBash依然提醒我们Git有一个未被跟踪的文件untracked.txt!意思就是:虽然untracked.txt文件是在主分支master中创建的,但是untracked.txt未被跟踪,那么无论切换为哪个分支,untracked.txt都会存在于任何分支中,并且untracked.txt在任何分支中都是untracked未被跟踪状态!
结论1:一个新建的文件,如果从未被GIt跟踪(状态一直都是untracked),那么无论这个文件在哪个分支被创建or被修改多少次,Git的所有分支中都会存在这个文件的踪影,并且这个文件在任何分支中都是untracked未被跟踪状态!(有一个原理我们得知道:一个从未被git add的文件,即未被跟踪过的文件,我们可以在里面写很多文本,修改很多次,但是因为它从未被跟踪过,Git对它的识别始终都是untracked。而一个被跟踪过的文件,一旦被修改,Git对它的识别会变成modified)
7.我们使用git checkout master命令切换回主分支master,再新建一个文件"added.txt",再并把这个文件add到master主分支。
并使用git status查看added.txt在主分支master中的状态
我们可以看到added.txt在master主分支中是Changes to be committed状态,甚至可以看到前几个步骤中被遗留的untracked.txt文件依然为未被跟踪untracked状态。
8.我们使用git checkout dev命令把当前的主分支master切换到分支dev,发现被跟踪但从未被提交的added.txt居然还存在!意思就是:虽然added.txt文件是在主分支master中创建的,即使它被git add跟踪了,但是added.txt从未被git commit提交过,那么无论切换为哪个分支,added.txt都会存在于任何分支中,并且added.txt在任何分支中都是Changes to be committed等待提交状态!(如果咱们现在又修改added.txt文件,那么added.txt状态也会从Changes to be committed状态变为modified状态)
我们再次使用git status查看added.txt在分支dev中的状态,发现added.txt在分支dev中的状态 与 added.txt在主分支master中的状态 中的状态一模一样!
结论2:虽然added.txt文件是在主分支master中创建的,即使它被git add跟踪了,但是added.txt从未被git commit提交过,那么无论切换为哪个分支,added.txt都会存在于任何分支中,并且added.txt在任何分支中都是Changes to be committed等待提交状态!(如果咱们现在又修改added.txt文件,那么added.txt状态也会从Changes to be committed状态变为modified状态)
9.我们使用git checkout master命令切换回主分支master,再新建一个文件"committed.txt",再并把这个文件add并commit到master主分支。
10.committed.txt文件在主分支master被commit提交后,我们使用git status查看当前主分支master中的状态,发现只剩下了上面步骤1中的untracked.txt文件了。
我们再使用git checkout dev命令把当前的主分支master切换到分支dev,发现被提交过的committed.txt文件和上面步骤7中的added.txt在分支dev中都已经找不到了!
我们使用git status查看当前分支dev中的状态,发现跟主分支master中的状态一样,只剩下了上面步骤1中的untracked.txt文件了。
结论3:一个文件在任意分支被git add 后,在某一分支"分支1"中被commit提交,那么这个文件就单独属于"分支1"了,意思也就是:我们再切换到不是“分支1”的任何其他分支(如:“分支2”,"分支3"等)中,我们都不会再可以找到这个文件的踪影。这个文件已经单独属于"分支1"了。
11.我们使用git checkout master命令切换回主分支master,并修改committed.txt文件,博主我向里面写入了一段文本"I changed it in master branch"
12.我们使用git status查看当前主分支master中committed.txt文件的状态:因为committed.txt文件被修改了,所以状态切换为modified。
13.我们使用git checkout dev命令把当前的主分支master切换到分支dev,GitBash提醒我们:如果我们直接切换分支,我们刚修改的committed.txt文件将会被重置。所以GitBash恳请我们要么commit提交这个committed.txt文件,要么git stash储藏本次对committed.txt的修改,然后再切换分支。
于是,博主我使用了git stash命令,储藏本次对committed.txt的修改。
14.我们打开一下committed.txt文件,发现committed.txt文件变空了,变空了的原理是git stash命令把committed.txt重置到最后一次版本库中的committed.txt的内容,而我们"内容本来就是空的"的"第一次commit提交的committed.txt"就是"最后一次版本库中的committed.txt的内容",所以committed.txt被重置为空的了。
15.我们在当前主分支master中使用git status命令,发现主分支中只检测到Untracked.txt,因为博主我在步骤14中对committed.txt使用了git stash命令把committed.txt储藏了起来,同时committed.txt被git stash命令重置到最后一次版本库中的committed.txt的内容,那么目前committed.txt是空的,之前版本库的committed.txt也是空的,所以它们的内容都是空的,即都是一样的。所以git status不再提示committed.txt文件被modified了。
16.我们再使用git checkout dev命令把当前的主分支master切换到分支dev,发现dev分支中依然没有committed.txt和added.txt文件的身影。我们在当前分支dev中使用git status命令,发现dev分支也只能检测到Untracked.txt,毕竟分支dev中连committed.txt文件都没有,所以dev分支也不可能会检测到committed.txt文件。
结论4:一个文件在任意分支被git add 后,在某一分支"分支1"中被commit提交,那么这个文件就单独属于"分支1"了,同时,这个在"分支1"被提交的文件无论被怎样的修改(modifiled),无论处于modified,changes to be committed,committed等任何状态,当我们切换到不是“分支1”的任何其他分支(如:“分支2”,"分支3"等)中,我们都不会再可以找到这个文件的任何踪影。
简单来说:一个文件在"分支1"中被commit提交,那么这个文件已经单独属于"分支1"了,即便这个文件被如何修改或处于任何状态,这个文件只与"分支1"有关系,其他任何分支都找不到"committed.txt"的任何蛛丝马迹。