工作区内修改文件与git分支的关联
下面结合实例进行分析,假设目前已存在一个代码仓库,里面有两个分支master和test ,两个分支的状态是一样的,都已经提交了一个文件11.txt,文件内容如下:
11111111111
hhaa
现在我们切到master分支,在11.txt文件尾部增加一行字符
do the best
然后用git status查看git仓库状态,如下所示
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: 11.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
表示需要将工作区修改的文件11.txt添加到暂存区并提交。
这时先不做这些操作,直接切换到test分支,然后查看状态,发现打印信息与上面的相同。而我并没有在test分支上对11.txt文件做修改,这是什么原因呢?
如果这种情况下,在test分支或是master上执行git add 11.txt命令操作,添加到暂存区,然后执行git status查看状态,发现两个分支的状态依然是相同的
都打印的是
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: 11.txt
#
切换回master分支,
git commit -m " ”
在master分支上将11.txt文件提交。在master分支和test分支上都执行git status查看状态,打印如下
# On branch test
nothing to commit (working directory clean)
说明工作区内是干净的,没有未提交的文件。
这时通过git log或是gitk查看,发现master分支下多了一条提交,而切换到test上面去看时,发现test上面是没有新增提交的。
反之,如果是在test分支上执行git commit的操作,那么test分支上将会新增这条提交,而master上面没有。
请注意,上面的这些操作,我们都是在两个分支上11.txt文件的内容相同的情况下进行的,进行完上面的操作之后,master分支上11.txt文件已经比test分支上的文件要超前了,
此时如果切换到master分支,然后在文件尾部再增加新内容:
11111111111
hhaa
do the best
good
在本地保存之后,未git add ,也未提交,就试图切换分支到test上面,
git checkout test
error: You have local changes to '11.txt'; cannot switch branches.
如果git add 11.txt之后,还未提交,就切换分支呢,
git checkout test
error: Entry '11.txt' would be overwritten by merge. Cannot merge.
说明git 分支与本地工作区以及暂存区修改的文件是以全局管理的。如果不同分支上最后的一条11.txt文件的提交内容不一致,我们在本地工作区修改,并添加到暂存去,以及提交,都是在这个分支上完成,提交之前是无法切换到其他分支的。当不同分支上最后的一条11.txt文件的提交内容相同时,git仓库同样可以识别到,这时不管切换到哪个分支上做工作区内的修改和添加到暂存区,git仓库并未直接将这两个操作与哪一个分支建立关联,当我们最后执行git commit提交时所在的分支是哪一个,关联关系这时就建立了,工作区的修改,添加暂存区和提交,都关联到是那一个分支上进行的。