git 分支


使用 Git 分支

在 Git 中,一个branch是主存储库的新/单独版本。

假设您有一个大型项目,并且需要更新其设计。

没有 Git 和使用 Git 会如何工作:

没有 Git:

  • 复制所有相关文件以避免影响实时版本
  • 开始进行设计,发现代码依赖于其他文件中的代码,这些代码也需要更改!
  • 同时复制相关文件。确保每个文件依赖项都引用正确的文件名
  • 紧急情况!项目中其他地方存在不相关的错误,需要尽快修复!
  • 保存所有文件,记下您正在处理的副本的名称
  • 处理不相关的错误并更新代码来修复它
  • 返回设计并完成那里的工作
  • 复制代码或重命名文件,以便更新的设计出现在实时版本上
  • (2周后,您意识到不相关的错误在新设计版本中并未修复,因为您复制了修复之前的文件)

使用 Git:

  • 使用名为 new-design 的新分支,直接编辑代码而不影响主分支
  • 紧急情况!项目中其他地方存在不相关的错误,需要尽快修复!
  • 从主项目创建一个名为small-error-fix的新分支
  • 修复不相关的错误并将小错误修复分支与主分支合并
  • 你回到新设计分支,并在那里完成工作
  • 将新设计分支与主分支合并(收到您遗漏的小错误修复的警报)

分支允许您处理项目的不同部分,而不会影响主分支。

当工作完成后,分支可以与主项目合并。

您甚至可以在分支之间切换并处理不同的项目,而不会相互干扰。

Git 中的分支非常轻量且快速!


新的 Git 分支

让我们添加一些新功能index.html页。

我们正在本地存储库中工作,我们不想打扰或可能破坏主项目。

所以我们创建一个新的branch:

示例

git branch hello-world-images

现在我们创建了一个新的branch称为“hello-world-images

让我们确认一下我们已经创建了一个新的branch:

示例

git branch
  hello-world-images
* master

我们可以看到名称为 "hello-world-images" 的新分支,但是* master表明我们目前正在处理该问题branch

checkout是用于检查的命令branch。感动我们当前的branch,命令末尾指定的一个:

示例

git checkout hello-world-images
Switched to branch 'hello-world-images'

现在我们已经将当前的工作区从 master 分支移至新的branch

打开您最喜欢的编辑器并进行一些更改。

对于此示例,我们将图片 (img_hello_world.jpg) 添加到工作文件夹中,并在index.html文件:

示例

<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>

<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space"
style="width:100%;max-width:960px"></div>
<p>This is the first file in my new Git Repo.</p>
<p>A new line in our file!</p>

</body>
</html>

我们对文件进行了更改,并在工作目录中添加了一个新文件(与mainbranch)。

现在检查当前的状态branch:

示例

git status
On branch hello-world-images
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        img_hello_world.jpg

no changes added to commit (use "git add" and/or "git commit -a")

让我们看看这里发生了什么:

  • 我们的index.html发生了变化,但该文件没有暂存commit
  • img_hello_world.jpg不是tracked

因此,我们需要将这两个文件添加到暂存环境中branch:

示例

git add --all

使用--all而不是单个文件名阶段所有更改(新的、修改的和删除的)文件。

检查statusbranch:

示例

git status
On branch hello-world-images
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    new file: img_hello_world.jpg
    modified: index.html

我们对自己的改变感到满意。所以我们将承诺他们branch:

示例

git commit -m "Added image to Hello World"
[hello-world-images 0312c55] Added image to Hello World
2 files changed, 1 insertion(+)
create mode 100644 img_hello_world.jpg

现在我们有一个新的branch,这与master不同branch

笔记:使用-b选项开启checkout将创建一个新分支,如果不存在则移至该分支



分支间切换

现在让我们看看使用不同的分支是多么快速和容易,以及它的工作效果如何。

我们目前在分行hello-world-images。我们向该分支添加了一个图片,所以让我们列出当前目录中的文件:

示例

ls
README.md  bluestyle.css  img_hello_world.jpg  index.html

我们可以看到新的文件img_hello_world.jpg,如果我们打开html文件,我们可以看到代码已被更改。一切都是它应该的样子。

现在,让我们看看当我们将分支更改为时会发生什么master

示例

git checkout master
Switched to branch 'master'

新图片不属于该分支。再次列出当前目录下的文件:

示例

ls
README.md  bluestyle.css  index.html

img_hello_world.jpg已经不存在了!如果我们打开 html 文件,我们可以看到代码恢复到更改之前的状态。

看看使用分支机构是多么容易吗?这如何让你能够从事不同的事情?


紧急科

现在想象一下,我们还没有完成 hello-world-images,但我们需要修复 master 上的错误。

我不想直接与 master 发生冲突,也不想与 hello-world-images 发生冲突,因为它还没有完成。

所以我们创建一个新的分支来应对紧急情况:

示例

git checkout -b emergency-fix
Switched to a new branch 'emergency-fix'

现在我们已经从master创建了一个新分支,并更改为它。我们可以安全地修复错误,而不会影响其他分支。

让我们修正我们的假想错误:

示例

<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>

<h1>Hello world!</h1>
<p>This is the first file in my new Git Repo.</p>
<p>This line is here to show how merging works.</p>

</body>
</html>

我们已对此文件进行了更改,并且需要将这些更改添加到 master 分支。

检查状态:

示例

git status
On branch emergency-fix
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

暂存文件并提交:

示例

git add index.html
git commit -m "updated index.html with emergency fix"
[emergency-fix dfa79db] updated index.html with emergency fix
 1 file changed, 1 insertion(+), 1 deletion(-)

现在我们已经为 master 准备好了修复程序,我们需要合并两个分支。

通过练习测试一下

练习:

创建一个名为的新分支hello-world-images:

git  

开始练习