git 管理分支

  • 管理分支

    操作分支可以创造另一条开发线。我们可以使用此操作将开发过程分为两个不同的方向。例如,我们发布了6.0版本的产品,我们可能想创建一个分支,以便可以将7.0功能的开发与6.0错误修复分开。
  • 创建分支

    Tom使用git branch <branch name>命令创建一个新分支。我们可以从现有分支创建一个新分支。我们可以使用特定的提交或标记作为起点。如果未提供任何特定的提交ID,则将以HEAD作为起点创建分支。
    
    [jerry@CentOS src]$ git branch new_branch
    
    [jerry@CentOS src]$ git branch
    * master
    new_branch
    
    创建一个新分支;Tom使用git branch命令列出可用的分支。Git在当前检出分支之前显示一个星号。创建分支操作的图示如下所示-
    git branch
  • 在分支之间切换

    Jerry使用git checkout命令在分支之间切换。
    
    [jerry@CentOS src]$ git checkout new_branch
    Switched to branch 'new_branch'
    [jerry@CentOS src]$ git branch
    master
    * new_branch
    
    创建和切换分支的快捷方式
    在上面的示例中,我们使用了两个命令分别创建和切换分支。Git 在checkout命令中提供了-b选项;此操作将创建一个新分支,并立即切换到新分支。
    
    [jerry@CentOS src]$ git checkout -b test_branch
    Switched to a new branch 'test_branch'
    
    [jerry@CentOS src]$ git branch
    master
    new_branch
    * test_branch
    
  • 删除分支

    可以通过在git branch命令中提供–D选项来删除分支。但是在删除现有分支之前,请切换到另一个分支。Jerry目前在test_branch上,他想删除该分支。因此,他如下所示切换分支并删除分支。
    
    [jerry@CentOS src]$ git branch
    master
    new_branch
    * test_branch
    
    [jerry@CentOS src]$ git checkout master
    Switched to branch 'master'
    
    [jerry@CentOS src]$ git branch -D test_branch
    Deleted branch test_branch (was 5776472).
    
    现在,Git将仅显示两个分支。
    
    [jerry@CentOS src]$ git branch
    * master
    new_branch
    
  • 重命名分支

    Jerry决定在其字符串操作项目中增加对宽字符的支持。他已经创建了一个新分支,但是该分支的名称不合适。因此,他通过使用–m选项,后跟旧的分支名称和新的分支名称来更改分支名称。
    
    [jerry@CentOS src]$ git branch
    * master
    new_branch
    
    [jerry@CentOS src]$ git branch -m new_branch wchar_support
    
    现在,git branch命令将显示新的分支名称。
    
    [jerry@CentOS src]$ git branch
    * master
    wchar_support
    
  • 合并两个分支

    Jerry实现了一个返回宽字符串的字符串长度的函数。新的代码将显示如下-
    
    [jerry@CentOS src]$ git branch
    master
    * wchar_support
    
    [jerry@CentOS src]$ pwd
    /home/jerry/jerry_repo/project/src
    
    [jerry@CentOS src]$ git diff
    
    上面的命令产生以下结果-
    
    t a/src/string_operations.c b/src/string_operations.c
    index 8ab7f42..8fb4b00 100644
    --- a/src/string_operations.c
    +++ b/src/string_operations.c
    @@ -1,4 +1,14 @@
    #include <stdio.h>
    +#include <wchar.h>
    +
    +size_t w_strlen(const wchar_t *s)
    +
    {
       +
       const wchar_t *p = s;
       +
       +
       while (*p)
       + ++p;
       + return (p - s);
       +
    }
    
    测试后,他提交并将更改推送到新分支。
    
    [jerry@CentOS src]$ git status -s
    M string_operations.c
    ?? string_operations
    
    [jerry@CentOS src]$ git add string_operations.c
    
    [jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
    string'
    
    [wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
    1 files changed, 10 insertions(+), 0 deletions(-)
    
    请注意,Jerry将这些更改推送到新分支,这就是为什么他使用分支名称wchar_support而不是master分支的原因。
    
    [jerry@CentOS src]$ git push origin wchar_support  
    
    上面的命令将产生以下结果。
    
    Counting objects: 7, done.
    Compressing objects: 100% (4/4), done.
    Writing objects: 100% (4/4), 507 bytes, done.
    Total 4 (delta 1), reused 0 (delta 0)
    To gituser@git.server.com:project.git
    * [new branch]
    wchar_support -> wchar_support
    
    提交更改后,新分支将如下所示:
    git branch
    Tom对Jerry在他的私有分支中正在做什么感到好奇,他检查wchar_support分支中的日志。
    
    [tom@CentOS src]$ pwd
    /home/tom/top_repo/project/src
    
    [tom@CentOS src]$ git log origin/wchar_support -2
    
    上面的命令将产生以下结果。
    
    commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
    Author: Jerry Mouse <jerry@cainiaoya.com>
    Date: Wed Sep 11 16:10:06 2013 +0530
    
    Added w_strlen function to return string lenght of wchar_t string
    
    
    commit 577647211ed44fe2ae479427a0668a4f12ed71a1
    Author: Tom Cat <tom@cainiaoya.com>
    Date: Wed Sep 11 10:21:20 2013 +0530
    
    Removed executable binary
    
    通过查看提交消息,Tom意识到Jerry为宽字符实现了strlen函数,并且他希望在master分支中具有相同的功能。他决定不重新实现,而是决定通过git merge命令将其分支与master分支合并来采用Jerry的代码。
    
    [tom@CentOS project]$ git branch
    * master
    
    [tom@CentOS project]$ pwd
    /home/tom/top_repo/project
    
    [tom@CentOS project]$ git merge origin/wchar_support
    Updating 5776472..64192f9
    Fast-forward
    src/string_operations.c | 10 ++++++++++
    1 files changed, 10 insertions(+), 0 deletions(-)
    
    合并操作后,master分支将显示如下-
    git branch
    现在,分支wchar_support已与master分支合并。我们可以通过查看提交消息或查看对string_operation.c文件所做的修改来验证它。
    
    [tom@CentOS project]$ cd src/
    
    [tom@CentOS src]$ git log -1
    
    commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
    Author: Jerry Mouse 
    Date: Wed Sep 11 16:10:06 2013 +0530
    
    Added w_strlen function to return string lenght of wchar_t string
    
    [tom@CentOS src]$ head -12 string_operations.c
    
    上面的命令将产生以下结果。
    
    #include <stdio.h>
    #include <wchar.h>
    size_t w_strlen(const wchar_t *s)
    {
       const wchar_t *p = s;
    
       while (*p)
          ++p;
    
       return (p - s);
    }
    
    测试之后,他将代码更改推送到master分支。
    
    [tom@CentOS src]$ git push origin master
    Total 0 (delta 0), reused 0 (delta 0)
    To gituser@git.server.com:project.git
    5776472..64192f9 master −> master
    
  • 重新设置分支

    git rebase命令是一个分支合并命令,但是不同之处在于它修改了提交的顺序。git merge命令尝试将来自其他分支的提交放在当前本地分支的HEAD之上。例如,您的本地分支提交了A->B->C->D,而合并分支提交了A->B->X->Y,那么git merge将当前本地分支转换为类似A->B->C->D->X->Y
    git rebase命令尝试找出当前本地分支和合并分支之间的公共祖先。然后,通过修改当前本地分支中的提交顺序,将提交推送到本地分支。例如,如果您的本地分支提交了A->B->C->D,而合并分支提交了A->B->X->Y,则git rebase会将当前本地分支转换为类似A->B-> X->Y->C->D。
    当多个开发人员在单个远程存储库上工作时,您将无法修改远程存储库中提交的顺序。在这种情况下,您可以使用rebase操作将本地提交置于远程存储库提交之上,并且可以推送这些更改。