分支

Listen, a tree is growing

分支介绍

分支及其作用

当我们开发主线时,如果要添加新的功能,我们一般不会直接在主线上改动,而是创建分支并修改分支,以免影响主线开发。所以分支的作用就是创建副本,使我们能够在副本上添加功能,而不影响主线。git采用指针的方式管理分支,速度非常快。

相关操作

查看分支

1
git branch -a           #列举出所有分支以及当前分支

分支创建

1
git checkout -b dev /origin/dev

这个命令做了下面两件事:

  • 创建一个名为dev的基于远程/origin/dev的本地分支
  • 将当前分支切换为dev

分支切换

如果要切换到一个已经存在的分支,可以使用如下命令:

1
git checkout dev   # 将分支切换为dev

有些时候,我们需要切换到历史版本,也可以使用checkout,我们可以利用git log查看历史提交记录,然后使用git checkout xxxxxxxxxxxxxx的方式切换到指定版本号对应的分支,其中xxxxxxxxxxxxxx是版本号。例如:

1
2
3
4
git log
commit 72df7ffjasdddf8fdfdf9ccc

git checkout 72df7ffjasdddf8fdfdf9ccc

当然,切换分支后,本地的修改会被保留,使用git stash可以删除这些修改(慎用!)

分支合并

假设我们的当前分支为master,那么如果我们要将分支dev合并至master,可以执行下面的命令

1
git merge dev

分支删除

删除本地和远程的分支,可以使用如下代码:

1
2
3
4
5
6
git branch -D branch_name       # 删除本地分支

git push origin --delete new # 删除远程分支
FETCH_HEAD master origin/master
HEAD ORIG_HEAD origin/new
#删除后远程的分支就没有了

冲突解决

使用分支开发过程中一个很大的问题就是解决冲突,当多个开发者试图编辑相同文件的同一行时,就可能发生冲突。Git对冲突的解决方式是:保留多个分支中的冲突的内容,然后人工进行冲突处理后再允许合并。冲突只影响合并过程。

例子

在下面的分支中,两个分支各自有增有减,因此需要手动合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<<<<<<< HEAD  (Current change)
// 当前分支的修改
// Handle spurious interrupts
// The hardware sometimes raises these because of noise on the
// IRQ line or other reasons. We don't care.
if (tf->tf_trapno == IRQ_OFFSET + IRQ_SPURIOUS) {
cprintf("Spurious interrupt on irq 7\n");
print_trapframe(tf);
return;
}
=======
// 合并入的分支的修改
// Handle the trap according to the trap num
switch (tf->tf_trapno)
{
// Handle the breakpoint fault (vector 3)
case T_BRKPT:
breakpoint_handler(tf);
break;
// Handle the page fault (vector 14)
case T_PGFLT:
page_fault_handler(tf);
>>>>>>> lab3 (并入的分支)

上半部分为当前分支中的内容,而下半部分为合并入的分支的内容

常见的引起冲突的情况

字符集错误

不同的编辑器使用的字符集可能不一样,例如在windows环境下的换行在linux下会显示为行尾的^M字符。所以如果需要多个人对同一个文件进行修改,尽可能使用相同的开发环境。针对行尾的^M处理方式如下:

  1. 在linux的vim下命令格式输入::e ++ff=unix,显示结尾的^M

  2. 输入:%s/\r//g删除

解决方式

解决方式一般就是手工修改代码,让冲突的部分不再冲突即可。

0%