面向工资编程,面向面试学习!

Git 分支

分支操作可以实现将修改记录的整体流程分叉保存,分叉后的分支不受其他分支的影响,所以在同一个仓库里的不同分支上可以同时进行多个修改,分叉的分支可以合并。例如,我们开发软件时,可能有多人同时为同一个软件开发新功能和修改bug,我们可以创建new_feaure分支开发新功能,创建fix_bug分支来修改bug,使得两种操作同时进行,代码互不影响,任务完成后再将分支合并到master主分支。

我们在 git_tutorial 项目中实战下下面这些分支管理命令:

新建分支

我们可以使用 git branch <branchname> [<start-point>] 命令创建一个新分支。branchname为要创建的分支名称;start-point为起点,新的分支HEAD将指向此提交,start-point可以是分支名称,提交ID或标签名。如果省略此选项,则将使用当前的HEAD。

省略起点创建分支

git branch create_branch_nostart
git branch -v
  create_branch_nostart a5c4e04 Update and rename README to README.md
* master    a5c4e04 Update and rename README to README.md

上面的命令在本地创建了create_branch_nostart分支,git branch -v可以查看分支最后一次提交id和提交备注。master前面的*号表示当前在master分支。

以分支为起点创建分支

git branch create_branch_start_branch master
git branch -v
  create_branch_nostart a5c4e04 Update and rename README to README.md
  create_branch_start_branch  a5c4e04 Update and rename README to README.md
* master    a5c4e04 Update and rename README to README.md

以标签为起点创建分支

git tag -a v1.0 -m "version 1.0"
git tag
v1.0
git branch create_branch_start_tag v1.0
git branch -v
  create_branch_nostart      a5c4e04 Update and rename README to README.md
  create_branch_start_branch a5c4e04 Update and rename README to README.md
  create_branch_start_tag    a5c4e04 Update and rename README to README.md
* master                     a5c4e04 Update and rename README to README.md

查看分支

git branch 列出本地分支列表 git branch -a 查看所有远程分支和跟踪分支 git branch -v 查看各个分支最后一个提交信息 git branch -vv 查看各个分支最后一个提交信和跟踪分支 git branch --merged 查看哪些分支已经合并入当前分支 git branch --no-merged 查看哪些分支还没合并入当前分支 Git会在当前签出分支之前显示一个星号。

切换分支

使用 git checkout 命令在分支之间切换。

git checkout create_branch_nostart
Switched to branch 'create_branch_nostart'

创建和切换分支的快捷方式

在上面的例子中,分别使用两个命令创建和切换分支。 Git为 checkout 命令提供-b 选项; 此操作将创建一个新的分支,并立即切换到新分支。

git checkout -b create_and_checkout_branch
Switched to a new branch 'create_and_checkout_branch'
 git branch -v
* create_and_checkout_branch a5c4e04 Update and rename README to README.md
  create_branch_nostart      a5c4e04 Update and rename README to README.md
  create_branch_start_branch a5c4e04 Update and rename README to README.md
  create_branch_start_tag    a5c4e04 Update and rename README to README.md
  master                     a5c4e04 Update and rename README to README.md

提交分支到远程

使用 git push --set-upstream <repository> <branchname> 命令将本地<branchname>分支推送到远程<repository>仓库中,并且将本地分支和远程分支建立关联,在本地创建相应的跟踪分支,简写为 git push -u <repository> <branchname>。-u选项会指定一个默认主机,这样后面就可以不加任何参数在分支上使用git push。

将上面创建的分支推送到远程服务器

git push -u origin create_branch_nostart create_branch_start_branch  create_branch_start_tag create_and_checkout_branch

删除分支

当一个分支被废弃时,我们需要删除分支,彻底删除一个分支需要三个步骤:

  1. 删除本地分支
  2. 删除远程分支
  3. 删除本地追踪分支,比如追踪远程master的追踪分支是origin/master

删除本地分支

使用 git branch --delete <branchname> 命令删除分支,简写为 git branch -d <branchname> ,使用中我们发现还有 git branch -D <branchname> 的写法,他们有什么区别呢?

-d是--delete的缩写,在使用--delete删除分支时,该分支必须完全和它的上游分支merge完成,如果没有上游分支,必须要和HEAD完全merge。
-D是--delete --force的缩写,这样写可以在不检查分支merge状态的情况下强制删除分支。
--force简写-f,作用是将当前branch重置到初始点(startpoint),如果不使用--force的话,git分支无法修改一个已经存在的分支。

删除远程分支

使用 git push origin --delete branch 命令删除远程分支,该指令也会删除追踪分支,使用 git push origin :<branchname>删除远程分支,该命令不会删除追踪分支

删除追踪分支

使用 git branch --delete --remotes <remote>/<branchname> 命令删除追踪分支,简写为 git branch --d --r <remote>/<branchname> 或者 git branch --dr <remote>/<branchname>,该操作并没有真正删除远程分支,而是删除的本地分支和远程分支的关联关系,即追踪分支。

通过 git push origin --delete branch 命令会删除远程分支和追踪分支,不需要单独删除追踪分支,但是如果通过网页对远程分支进行删除,追踪分支是不会被删除的。

在git版本1.6.6之后,可以通过 git fetch origin --prune 或它的简写 git fetch origin -p 来删除所有被废弃的追踪分支

重命名分支

使用 git branch -m [<old-branch>] <new-branch> 命令移动/重命名分支及其引用日志,如果分支名重复会终止运行,并给出提示,git branch -M [<old-branch>] <new-branch> 命令强制移动/重命名分支,即使分支名重复。

合并分支

使用 git merge <branchname> 命令合并分支,我们在create_branch_nostart分支上面添加git_branch.html文件,内容如下:

然后提交到 create_branch_nostart分支上。

git add git_branch.html
git commit -m "add git_branch.html"
[create_branch_nostart 58e7646] add git_branch.html
 1 file changed, 14 insertions(+)
 create mode 100644 git_branch.html

接下来我们切换到master分支,使用git merge命令把create_branch_nostart分支的内容合并到master分支。

git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
git merge create_branch_nostart
Updating a5c4e04..58e7646
Fast-forward
 git_branch.html | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 git_branch.html

处理冲突

当两个分支修改了同名文件后再合并分支时会发生冲突,此时需要解决冲突后再合并,我们实践下这种情况。在create_branch_start_branch分支中添加git_branch.html文件,内容如下:

然后提交到 create_branch_start_branch 分支上。

git add git_branch.html
git commit -m "add git_branch.html"
[create_branch_start_branch 21f87e7] add git_branch.html
 1 file changed, 29 insertions(+)
 create mode 100644 git_branch.html

然后切换到master分支,把create_branch_start_branch分支中的内容合并到master分支。

git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
git merge create_branch_start_branch
CONFLICT (add/add): Merge conflict in git_branch.html
Auto-merging git_branch.html
Automatic merge failed; fix conflicts and then commit the result.

根据提示我们发现 git_branch.html 文件出现冲突了,文件内容如下

<<<<<<< HEAD 和 =======之间的内容是HEAD分支的内容,即master分支的内容,======= 和 >>>>>>> create_branch_start_branch 之间的内容是create_branch_start_branch分支的内容。我们把git_branch.html 文件修改为如下:

然后提交到本地master分支中,最后推送到远程master分支。

git add git_branch.html
git commit -m "fix merge"
[master 5828bd0] fix merge
git push origin master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 3.16 KiB | 1.05 MiB/s, done.
Total 7 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 1 local object.
remote: This repository moved. Please use the new location:
remote:   git@github.com:panku-pro/git_tutorial_cn.git
To my.github.com:foxchenxi/git_tutorial_cn.git
   a5c4e04..5828bd0  master -> master