对于git的三个区的解释:
工作区 版本库(暂存区和分支)
工作区:
版本库:(暂存区 + 分支)
2.png
git的整个过程是这样:
1、不论在哪个分支上,我们添加文件 touch 12.txt,所有的分支是都可以看见的,不论在哪一个分支上,git status,都会提示有文件 12.txt 没有写入到版本库。
2、执行 git add . 此时,git将新添加的文件写入到暂存区,而且所有的分支都是可以看见的,在任何一个分支上执行,git status,都会有提示有文件没有提交到相应的分支。
3、git commit -m “message",执行该命令时,首先要选择,要在哪一个分支上提交。
git checkout <branch_name>,切换到相应的分支上,然后进行提交。即
git checkout dev_w_branch
git commit -m “add file to dev_w_branch”
此时,由于git checkout dev_w_branch 分支上,因此HEAD 指针指向 dev_w_branch分支上,将文件提交了该分支上。而在其他的分支下是看不见的。只有在这个命令操作完毕之后,各个分支才会有属于自己的文件。
master分支:
dev分支:
4.png
dev_w_branch 分支:
5.png
我们将文件commit到了dev_w_branch 分支下,因此将12.txt只有在dev_w_branch 分支下才能看到。
git分支回退
6.png使用git log命令查看commit 的历史记录:
这里只要知道 commit id,都可以将HEAD 指针进行移动,因此可以进行回退历史,可以将HEAD指针向前后移动,即:git reset --hard <commit_id>。其实切换分支,git checkout dev ,是就是相当于将HEAD 指针移动到dev分支的最后一次提交上。
git stash使用
场景:目前正在 dev分支上进行开发,编写一个java文件,Login.java,但是这个文件并没有开发完成,因此并没有进行提交到dev分支上,目前你进行的操作是:
touch Login.java
**** code on Login.java
git add . (这个过程,所有的分支都可以看见,Login.java的修改还处于暂存区或者工作区,并不属于某一个分支)
而现在突然要更改一个bug,因此需要另开一个分支,更改bug,暂定分支的名字为bug_branch。
7.png
在dev分支上,不想提交没有做完的工作,但是又必须马上去另起分支修改bug。这时候,没有办法使用dev分支的HEAD指针回退,因为这个节点没有进行commit,在log中无法找到相应的commit id。因此 git stash就发挥作用了。
如果对没有完成的工作不进行提交,转手去另起分支,修改bug,当bug修改好之后,要提交bug_branch分支上的操作,这时就有问题了,刚才在dev分支上没有提交的工作,对于所有的分支都是可以看见的,因为他没有commit,目前还处在暂存区,因此,bug_branch 分支提交的时候,也会将dev分支上刚才没有做完的工作进行一并提交。
正确的做法是:
首先保护现场,将dev分支上的没有做完的工作保存起来(但不是提交),那么当前的dev分支还是只想dev分支上的最后一次提交commit,因此该分支依旧是干净的(git status)。然后转手在去另起bug_branch 分支,修改文件,进行提交,合并,然后删除 bug_branch 分支。
接下来,就该处理刚才在dev分支没有处理的工作,刚才使用 git stash保存起来了,现在要恢复,git stash pop命令,就将刚才没有提交的工作恢复,然后checkout到dev分支上继续处理。
网友评论