开发学院

您的位置:首页>教程>正文

教程正文

Git 管理分支

Git 管理分支

  分支操作允许创建另一条开发路线。我们可以使用这种方式将开发过程分成两个不同的方向。例如,我们发布了一个6.0版本的产品,我们可能想要创建一个分支,这样7.0功能的开发可以与6.0 bug修复分开。

创建分支

  我们可以从现有的分支创建一个新的分支,例如,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在当前签出分支之前显示星号标记。

  创建分支操作的过程如下图所示:

before_branch_create.png

在分之间进行切换

  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,他想把这个分支删掉。因此,他切换到其他分支并删除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).
Now, Git will show only two branches.

[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分支命令将显示新的分支名称。

[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   <??? Observer branch_name

  上述操作产生如下输出:

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

  提交更改后,新分支将显示如下:

commit_in_branch.png

  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@tutorialspoint.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@tutorialspoint.com>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

  通过查看提交消息,Tom意识到Jerry为宽字符实现了strlen功能,他希望在主分支中实现同样的功能。他决定通过合并他的分支和主分支来获取杰里的代码,而不是重新实现。

[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(-)

  合并操作后,主分支将显示如下:

merge_branch.png

  现在,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);
}

  测试后,他将代码更改推送到主分支。

[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

Rebase分支

  Git rebase命令是一个分支合并命令,与merge不同的是它修改了提交的顺序。

  Git merge命令试图将来自其他分支的提交放在当前本地分支的头上。举个例子, 你的本地分支顺序为 A>B>C>D ,待合并的分支为 A>B>X>Y, 那么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操作将本地提交放在远程存储库提交之上,并且您可以推动这些更改。