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 Tutorial](https://www.w3ccoo.com/git/images/before_branch_create.png)
![git Tutorial](https://www.w3ccoo.com/git/images/after_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 上,他想删除该分支。 于是他切换分支,删除分支如下图。
[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 <−−− 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
提交修改后,新的分支会如下所示 −
![git Tutorial](https://www.w3ccoo.com/git/images/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 函数,并且他希望在 master 分支中具有相同的功能。 他没有重新实现,而是决定采用 Jerry 的代码,将他的分支与 master 分支合并。
[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 Tutorial](https://www.w3ccoo.com/git/images/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
变基分支
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 操作将本地提交置于远程存储库提交之上,然后您可以推送这些更改。