美文网首页Git
git 操作 - 2

git 操作 - 2

作者: _挑灯看剑_ | 来源:发表于2016-10-24 17:07 被阅读0次

    对于git的三个区的解释:

    工作区 版本库(暂存区和分支)
    工作区:

    1.png
    版本库:(暂存区 + 分支)
    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分支:

    3.png
    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分支上继续处理。

    相关文章

      网友评论

        本文标题:git 操作 - 2

        本文链接:https://www.haomeiwen.com/subject/nfpluttx.html