工作区内修改文件与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提交时所在的分支是哪一个,关联关系这时就建立了,工作区的修改,添加暂存区和提交,都关联到是那一个分支上进行的。

posted @ 2013-10-30 16:11  顽强的绿萝  阅读(1597)  评论(1编辑  收藏  举报