Git 分支
使用 Git 分支
在 Git 中,分支
是主仓库的新版本或独立版本。
假设你有一个大型项目,你需要更新其设计。
在有和没有 Git 的情况下,这将如何运作?
没有 Git
- 复制所有相关文件以避免影响实时版本
- 开始设计工作,发现代码依赖于其他文件中需要更改的代码!
- 也复制依赖文件。确保每个文件依赖项都引用了正确的文件名
- 紧急!项目中其他地方存在无关错误,需要立即修复!
- 保存所有文件,并记录正在使用的副本的名称
- 处理无关错误,更新代码以修复它
- 返回设计,并完成那里的工作
- 复制代码或重命名文件,以便更新的设计出现在实时版本中
- (两周后,你意识到无关错误在新的设计版本中没有被修复,因为你在修复之前复制了文件)
使用 Git
- 使用名为 new-design 的新分支,直接编辑代码,而不会影响主分支
- 紧急!项目中其他地方存在无关错误,需要立即修复!
- 从主项目创建一个名为 small-error-fix 的新分支
- 修复无关错误并将 small-error-fix 分支合并到主分支
- 你返回 new-design 分支,并完成那里的工作
- 将 new-design 分支与主分支合并(并提醒你缺少的小错误修复)
分支允许你处理项目的不同部分,而不会影响主分支。
工作完成后,可以将分支与主项目合并。
你甚至可以在分支之间切换,并在不同的项目上工作,而不会互相干扰。
Git 中的分支非常轻量级,速度很快!
新建 Git 分支
让我们为 index.html
页面添加一些新功能。
我们在本地仓库中工作,我们不想干扰或可能破坏主项目。
因此,我们创建一个新的 分支
示例
git branch hello-world-images
现在,我们创建了一个名为 "hello-world-images
" 的新 分支
让我们确认我们已经创建了一个新的 分支
示例
git branch
hello-world-images
* master
我们可以看到名为 "hello-world-images" 的新分支,但 master
旁边的 *
指定我们目前在该 分支
上。
checkout
是用于检出 分支
的命令。将我们从当前 分支
移动到命令末尾指定的 分支
示例
git checkout hello-world-images
Switched to branch 'hello-world-images'
现在,我们已将当前工作区从 master 分支移动到新的 分支
打开你喜欢的编辑器并进行一些更改。
在此示例中,我们在工作文件夹中添加了一个图像(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>
我们已对文件进行了更改,并在工作目录(与 main
分支
相同的目录)中添加了一个新文件。
现在检查当前 分支
的状态
示例
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 有所更改,但该文件尚未暂存以供
提交
img_hello_world.jpg
未被跟踪
因此,我们需要将这两个文件都添加到此 分支
的暂存区
示例
git add --all
使用 --all
而不是单独的文件名将 暂存 所有更改(新建、修改和删除)的文件。
检查 分支
的 状态
示例
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
我们对更改感到满意。因此,我们将它们提交到 分支
示例
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
现在,我们有了新的 分支
,它与 master 分支
不同。
注意:在 checkout
上使用 -b
选项将创建新的分支并移动到该分支,如果该分支不存在
在分支之间切换
现在让我们看看使用不同分支是多么快速和容易,以及它的效果如何。
我们目前在 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 的修复程序,我们需要合并这两个分支。