Allen's blog Allen's blog
首页
面经
算法 (opens new window)
分类

Allen

前端CV工程师
首页
面经
算法 (opens new window)
分类
  • shadowsocks代理架构

  • 博客搭建

  • 数据结构与算法

  • Git

    • Git常用命令快速查找
    • 初始(全局)配置
    • 代码回撤与回滚
    • 远程仓库
    • 分支管理
      • 概述
      • 创建与合并分支
        • 分支小结
      • 冲突
        • 冲突小结
    • Git忽略文件语法
  • 其他技术
  • Git
Allen
2023-02-16
目录

分支管理

# 概述

分支在实际中有什么用呢? 假设您准备开发一个新功能,但是需要两周才能完成,第一周您写了 50% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 现在有了分支,就不用怕了。您创建了一个属于您自己的分支,别人看不到,还继续在原来的分支上正常工作,而您在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。 其他版本控制系统如 SVN 等都有分支管理,但是用过之后您会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。 但 Git 的分支是与众不同的,无论创建、切换和删除分支,Git 在 1 秒钟之内就能完成! 无论您的版本库是 1 个文件还是 1 万个文件。

# 创建与合并分支

HEAD 指针 --> 分支指针(master/dev) --> 提交

git checkout 命令加上 -b 参数表示创建并切换,相当于以下两条命令:

git branch dev
# nothing
git checkout dev
Switched to branch 'dev'
1
2
3
4

然后,用 git branch 命令查看当前分支:

git branch
* dev
  master
1
2
3

git branch 命令会列出所有分支,当前分支前面会标一个 * 号。 git checkout master就可以切换回 master 分支 我们把 dev 分支的工作成果合并到 master 分支上:

git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)
1
2
3
4
5

git merge 命令用于合并指定分支到当前分支。 注意到上面的 Fast-forward 信息,Git 告诉我们,这次合并是 “快进模式”,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。当然,也不是每次合并都能 Fast-forward。合并完成后,就可以放心地删除 dev 分支了:

git branch -d dev
Deleted branch dev (was b17d20e).
1
2

删除后,查看 branch,就只剩下 master 分支了:

git branch
* master
1
2

因为创建、合并和删除分支非常快,所以 Git 鼓励您使用分支完成某个任务,合并后再删掉分支,这和直接在 master 分支上工作效果是一样的,但过程更安全。

# 分支小结

  • 查看分支: git branch
  • 创建分支: git branch <name>
  • 切换分支: git checkout <name>
  • 创建+切换分支: git checkout -b <name>
  • 合并某分支到当前分支: git merge <name>
  • 删除分支: git branch -d <name>

# 冲突

master 分支和 feature1 分支各自都分别有新的提交,Git 无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:

git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
1
2
3
4

果然冲突了! Git 告诉我们,readme.txt 文件存在冲突,必须手动解决冲突后再提交。git status 也可以告诉我们冲突的文件:

git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

我们可以直接查看 readme.txt 的内容:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
1
2
3
4
5
6
7
8
9

Git 用 <<<<<<<,=======,>>>>>>> 标记出不同分支的内容,我们修改如下后保存:

Creating a new branch is quick and simple.
1

再提交:

git add readme.txt
# nothing
git commit -m "conflict fixed"
[master cf810e4] conflict fixed
1
2
3
4

用带参数的 git log 也可以看到分支的合并情况:

git log --graph --pretty=oneline --abbrev-commit
*   cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file
1
2
3
4
5
6
7
8
9
10
11
12
13
14

最后,删除 feature1 分支:

git branch -d feature1
Deleted branch feature1 (was 14096d0).
1
2

# 冲突小结

  • 当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交。
  • 用 git log --graph 命令可以看到分支合并图。
上次更新: 2023/12/16, 09:22:46
远程仓库
Git忽略文件语法

← 远程仓库 Git忽略文件语法→

最近更新
01
rollup使用配置文件rollup.config.ts打包
12-08
02
package.json导出类型
12-08
03
关键问题方案
11-17
更多文章>
Theme by Vdoing | Copyright © 2023-2023 Allen | Github
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式