11.1 在Git中的分支
使用Git进行分支(branches)操作 是版本管理中很关键的一部分,它允许在一个repository中同时进行多条开发线。分支功能让Git成为了一个很强大的工具,无论是协作、实验还是管理项目的不同版本。
可以把Git里的分支想成文件夹,git会把你的项目复刻到这些文件夹里。你的项目有一个主文件夹 在你的 本地repository——master,git可以创建这个文件夹的复制,这样你就可以在这些复制上进行实验而不弄坏原来的、正常运行的代码。这些复制的文件夹被称为分支 —— branches。
分支是代码的替代版本。假设你想在一个大项目中改变一些东西,进行一个你不太确定的实验。要是没有git,你会怎么做?
你可能会把项目复制到一个新文件夹中并在那儿尝试改变。如果结果你满意,那你就把它复制回主文件夹。如果不满意——就忘掉它,甚至删掉。
或者让我们举个生活中的例子。比如写书:
- 你有一本书的手稿(主分支)。
- 你想尝试改变结局(创建新分支)。
- 你在一个单独的文档中写新结局(在新分支上工作)。
- 如果新结局更好,你在手稿中替换旧的(合并分支)。
- 删除带新结局的单独文档(删除分支)。
11.2 创建分支
在IntelliJ IDEA中创建分支非常简单:
输入分支的名字:
IntelliJ IDEA会在菜单的顶部显示你当前分支的名字:
之前那边显示的是什么?
那时显示的是你的第一个也是最主要的分支的名字——master。
现在那边显示的是test,也就是说Git(在IntelliJ IDEA的帮助下)不仅创建了一个新分支,还马上切换到了它。
让我们在当前分支(test)的main.html文件里添加点代码并提交它:
11.3 在分支之间切换
步骤1. 选择一个分支。
现在让我们切换回到我们的旧分支。点击顶部菜单,我们会看见什么?
别害怕——这很简单:
Local——是你的本地git-repository的分支列表。这里有两个:
- test
- master
Remote——是你的远程repository,位于GitHub的服务器上。我们推送了你的改动,但那里没有新分支,这是合情合理的。远程repository名为origin,且只有一个分支master。
Recent——仅仅是你最近工作的分支名称列表:这是IntelliJ IDEA为了方便和速度而添加的。
本地repository名称右边的origin/master——是远程repository的名字,与它保持同步,提交的改动会推送到那里。
步骤2. 在当前文件夹中载入分支代码。
步骤3. 检查。
我的分支显示的是“master”并且是旧代码:
11.4 合并分支
现在让我们尝试把两个分支的代码合并。
步骤1. 首先让我们在项目中添加一个新文件——index.html并在其中写点代码:
- 创建文件index.html
- 在其中写代码 <h1>Hello</h1>
- 提交文件
这是我的master分支中的两个文件的样子:
步骤2. 合并分支。
我们将在当前分支(master)中合并在test分支中做的修改。
为此,我们也在使用顶部菜单和“Merge ‘test’ into ‘master’”命令:
步骤3. 检查结果。
检查:
- 顶部仍然显示分支master
- 我们的文件有两个:index.html和main.html
- 文件main.html包含在test分支中添加的代码
11.5 合并时的冲突
有时合并分支会出现冲突。
如果你在不同的分支中对同一文件做了修改,并尝试合并它们,那么可能会出现冲突。
文本文件的冲突
Git是一个非常智能的系统——它能识别文件类型。如果你在它认为是文本的文件的不同地方做修改,它会将一个文件的修改转移到另一个文件的相应位置(就像人类会做的那样)。
二进制文件的冲突
但如果你在某处修改了图片或文档,Git不会试图将它们的不同部分合并成一个:它会让你选择在当前分支中保留哪个版本的文件。
手动解决冲突
如果你对文本文件的同一位置做了修改,那么Git无法正确合并不同的版本,会让你自己处理:
这可能看起来像这样:
你在这里看到了什么:
- 左边是master分支的main.html文件的内容
- 右边是test分支的main.html文件的内容
- 中间是IntelliJ IDEA让你写下的代码的最终版本(可以点击按钮“>>”和“<<”,自动从某个文件插入修改)
我选择了mater的版本并手动写了代码。这是我最终的结果:
11.6 修改历史
还有个有用且有趣的东西。你可以查看任何文件的修改历史,点击Show History按钮。 它可能位于两个位置。找到它。
这是我main.html文件的修改历史:
说明:
-
左边你看到的是单个文件的修改历史:
- 越新的修改越高,越旧的越低
- 这里也显示分支合并的历史
- 右边是某个提交中做出的修改
GO TO FULL VERSION