分支操作允许创建另一个开发线.我们可以使用此操作将开发过程分成两个不同的方向.例如,我们发布了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
A创建新分支; Tom使用git branch命令列出可用的分支. Git在当前签出分支之前显示星号.
创建分支操作的图形表示如下所示 :
在分支之间切换
Jerry使用git checkout命令在分支之间切换.
[jerry@CentOS src]$ git checkout new_branchSwitched to branch 'new_branch'[jerry@CentOS src]$ git branchmaster* new_branch
创建和切换分支的快捷方式
在上面的示例中,我们分别使用了两个命令来创建和切换分支. Git使用checkout命令提供 -b 选项;此操作创建一个新分支并立即切换到新分支.
[jerry@CentOS src]$ git checkout -b test_branchSwitched to a new branch 'test_branch'[jerry@CentOS src]$ git branchmasternew_branch* test_branch
删除分支
通过使用git branch命令提供-D选项可以删除分支.但在删除现有分支之前,请切换到另一个分支.
Jerry当前正在 test_branch ,他想删除该分支.所以他切换分支并删除分支,如下所示.
[jerry@CentOS src]$ git branchmasternew_branch* test_branch[jerry@CentOS src]$ git checkout masterSwitched to branch 'master'[jerry@CentOS src]$ git branch -D test_branchDeleted branch test_branch (was 5776472).
现在,Git只会显示两个分支.
[jerry@CentOS src]$ git branch* masternew_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
Merge Two Branches
Jerry实现了一个函数来返回宽字符串的字符串长度.新代码将显示如下 :
[jerry@CentOS src]$ git branchmaster* 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.cindex 8ab7f42..8fb4b00 100644--- a/src/string_operations.c+++ b/src/string_operations.c@@ -1,4 +1,14 @@#include+#include ++size_t w_strlen(const wchar_t *s)+{ + const wchar_t *p = s; + + while (*p) + ++p; + return (p - s); +}
经过测试,他提交并将更改推送到新分支.
[jerry@CentOS src]$ git status -sM 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_tstring'[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string1 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
提交更改后,新分支将显示如下 :
Tom很好奇Jerry在他的私人分支中所做的事情,他从 wchar_support 检查日志分支.
[tom@CentOS src]$ pwd/home/tom/top_repo/project/src[tom@CentOS src]$ git log origin/wchar_support -2
上述命令将产生以下结果.
commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3Author: Jerry MouseDate: Wed Sep 11 16:10:06 2013 +0530Added w_strlen function to return string lenght of wchar_t stringcommit 577647211ed44fe2ae479427a0668a4f12ed71a1Author: Tom Cat Date: Wed Sep 11 10:21:20 2013 +0530Removed executable binary
通过查看提交消息,Tom意识到Jerry为宽字符实现了strlen函数,他想在master分支中使用相同的功能.他没有重新实现,而是决定通过将他的分支与主分支合并来获取Jerry的代码.
[tom@CentOS project]$ git branch* master[tom@CentOS project]$ pwd/home/tom/top_repo/project[tom@CentOS project]$ git merge origin/wchar_supportUpdating 5776472..64192f9Fast-forwardsrc/string_operations.c | 10 ++++++++++1 files changed, 10 insertions(+), 0 deletions(-)
合并操作后,master分支将如下所示:
现在,分支wchar_support已与master分支合并。 我们可以通过查看提交消息或查看对string_operation.c文件所做的修改来验证它。
[tom@CentOS project]$ cd src/[tom@CentOS src]$ git log -1commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3Author: Jerry MouseDate: Wed Sep 11 16:10:06 2013 +0530Added w_strlen function to return string lenght of wchar_t string[tom@CentOS src]$ head -12 string_operations.c
上面的命令将产生以下结果。
#include#include 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 masterTotal 0 (delta 0), reused 0 (delta 0)To gituser@git.server.com:project.git5776472..64192f9 master −> master
Rebase Branches
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操作将本地提交置于远程存储库提交之上,并且可以推送这些更改。