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>
我们对文件进行了更改,并在工作目录中添加了一个新文件(与main
branch
)。
现在检查当前的状态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
而不是单个文件名阶段所有更改(新的、修改的和删除的)文件。
检查status
的branch
:
示例
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 准备好了修复程序,我们需要合并两个分支。