理解Git——Branch(分支)

来源:互联网 发布:大屏幕控制软件 供应商 编辑:程序博客网 时间:2024/04/30 14:30

1、分支的目的

    假设你在写一篇论文。你已经写出了第一个版本,并提交审稿。后来,你获取了新的数据,你正在把你的数据添加到论文中。在这个过程中,审稿人让你改变你的论文的格式。很明显,你不能把你正在更改的版本修改格式后提交给他们。你只想在以前版本基础之上对格式进行修改之后发给他们。

    这就是分支背后的思想,Git使这件事情变得非常容易。

    注意术语:“branch”和"head"在Git中几乎是同义词,每一个分支都对应一个head,并且每个head代表一个分支。有些时候,"branch"用来指一个head以及在这个head之前的所有commits,而”head“用来指最近一次commit。

2、创建分支

    要创建一个分支,例如你的仓库是这样的:

    (A)--(B)--(C)

                      |

                master

                     |

                HEAD 

    要跳回commit(B)并且从那里开始新的工作,你首先应该知道怎样引用这个commit,你可以使用git log来获取commit (B) 的SHA1名字,或者你使用HEAD^来获取他。

    现在,我们使用git branch命令:

    git branch [new-head-name]  [reference-to-(B)]

    或者,例如:

    git branch fix-headers HEAD^

    这个命令将会使用指定的名字创建一个新的head,并且使那个head指向指定的commit object。如果那个commit object被省略,则表示指向HEAD。

    现在,我们的commit树是这个样子:

    (A)--(B)----------(C)

             |                  |

     fix-headers    master

                                |

                              HEAD

3、在不同分支之间切换

    要在一个head上开始新的工作,你应该设置fix-headers为当前的head,这是通过git checkout 命令实现的:

    git checkout [head-name]

    这个命令做了以下事情:

    (1)使HEAD指向由[head-name]指向的head。

    (2)重写目录下面的所有文件。

    注意:如果在切换分支时有没有commit 的更改,Git的行为会很古怪。所以在切换分支时,一定要commit所有更改。

    在切换到fix-headers head之后,你又进行了修改和commit,最后仓库可能是这个样子:

            +--------------------(D)

          |                                |

 (A)--(B)--(C)                     |

                  |                       |

            master         fix-headers

                                         |

                                      HEAD

    你现在应该明白什么叫做分支了。commit 树长处了一个分支。

4、相关命令

    (1) git branch:没有参数会列出现有的heads,当前head之前有*

    (2) git diff [head1]..[head2]:列出head1 和head2之间的区别

    (3) git diff [head1]...[head2](中间三个点):列出head1和head2以及他们所有的祖先之间的区别。

    (4) git log [head1]..[head2]:列出head2和head1和head2的公共祖先之间的更改日志。

5、通常的分支使用模式

    master分支总是处于一个可发行状态,其他的分支包含未完成的工作,新特性等等。