Git管理分支 Git补丁操作 Git处理冲突 Git管理分支机构 分支操作允许创建另一个开发线。我们可以使用此操作将开发过程分为两个不同的方向。例如,我们发布了6.0版本的产品,我们可能希望创建一个分支,以便7.0功能的开发可以与6.0错误修复分开。 创建分支 Tom使用git branch 命令创建一个新分支。我们可以从现有分支创建一个新分支。我们可以使用特定的提交或标记作为起点。如果未提供任何特定的提交ID,则将以HEAD为起点创建分支。 [jerry@CentOS src]$ git branch new_branch [jerry@CentOS src]$ git branch * master new_branch 创建一个新分支; Tom使用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 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 提交更改后,新分支将显示如下: 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@codingdict.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@codingdict.com> Date: Wed Sep 11 10:21:20 2013 +0530 Removed 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_support Updating 5776472..64192f9 Fast-forward src/string_operations.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) 合并操作后,主分支将显示如下: 现在,分支 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 Rebase分支机构 Git rebase命令是一个分支合并命令,但区别在于它修改了提交顺序。 Git merge命令尝试将来自其他分支的提交置于当前本地分支的HEAD之上。例如,你的本地分支提交A-> B-> C-> D并且合并分支提交A-> B-> X-> Y,然后git merge将当前本地分支转换为类似A-> B-> C-> D-> X->ÿ Git rebase命令试图找出当前本地分支和合并分支之间的共同祖先。然后,它通过修改当前本地分支中的提交顺序将提交推送到本地分支。例如,如果你的本地分支提交A-> B-> C-> D并且合并分支提交A-> B-> X-> Y,那么Git rebase会将当前本地分支转换为类似A- > B-> X-> Y-> C-> d。 当多个开发人员在单个远程存储库上工作时,您无法修改远程存储库中提交的顺序。在这种情况下,您可以使用rebase操作将本地提交置于远程存储库提交之上,并且可以推送这些更改。 Git补丁操作 Git处理冲突