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
一个新的分支被创建;汤姆用git branch命令列出了可用的分支。Git在当前签出的分支前显示一个星号。
创建分支操作的图示如下 —
分支间的切换
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分支命令将显示新的分支名称。
[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
提交修改后,新的分支将显示如下 —
汤姆很好奇杰瑞在他的私有分支里做什么,他查看了 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函数,他想在主分支中实现同样的功能。他决定将自己的分支与主分支合并,而不是重新实现,而是采用 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(-)
After the merge operation, the master branch will appear as follows −
现在, wchar_support 分支已经与主分支合并了。我们可以通过查看提交消息或查看对 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
重置分支
Git rebase 命令是一个分支合并命令,但区别在于它修改了提交的顺序。
Git 合并命令试图将其他分支的提交放在当前本地分支的 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 操作,把你的本地提交放在远程仓库的提交之上,你可以推送这些修改。