Git 完全指南:从入门到精通
Git 是现代软件开发中最重要的版本控制工具之一,它帮助开发者高效地管理项目,支持分布式协作和版本控制。无论是个人项目还是团队开发,Git 都能提供强大的功能来跟踪、管理代码变更,并保障项目的稳定性与可持续发展。本篇文章从基础命令讲起,逐步深入,帮助你全面了解并掌握 Git,最终达到精通。
目录
- Git 完全指南:从入门到精通
- 1. Git 概述
- 1.1 什么是 Git
- 1.2 Git 与其他版本控制系统的区别
- 1.3 Git 的主要特点
- 2. Git 安装与配置
- 3. Git 基础命令
- 3.1 克隆 Git 仓库
- 3.2 查看 Git 仓库状态
- 3.3 查看提交历史
- 3.4 创建、切换和删除分支
- 创建分支
- 切换分支
- 删除分支
- 3.5 合并分支
- 4. Git 提交与变更管理
- 4.1 提交文件变更
- 4.2 查看差异
- 4.3 使用暂存区
- 暂存所有更改
- 暂存单个文件
- 5. Git 分支管理
- 5.1 分支的概念
- 5.2 创建、切换和删除分支
- 创建分支
- 切换分支
- 删除分支
- 5.3 合并分支与解决冲突
- 合并分支
- 解决冲突
- 6. Git 工作流
- 6.1 基本工作流
- 6.2 Git Flow 工作流
- 6.3 Fork 与 Pull Request 工作流
- 7. Git 高级命令与技巧
- 8. Git 与远程仓库
- 8.1 查看远程仓库
- 8.2 拉取远程仓库的更新
- 8.3 推送本地更改到远程仓库
- 8.4 克隆远程仓库
- 9. Git 高级特性
- 9.1 子模块 (Submodule)
- 添加子模块
- 更新子模块
- 9.2 使用 Git 钩子 (Hooks)
- 设置钩子
- 示例钩子:`pre-commit`
- 9.3 Git 配置与别名
- 设置别名
- 查看配置
- 10. Git 性能优化与高级技巧
- 10.1 使用 Git LFS (Large File Storage)
- 安装 Git LFS
- 跟踪大型文件类型
- 提交 LFS 文件
- 10.2 Git 分支管理高级技巧
- 删除本地分支
- 删除远程分支
- 10.3 Git 合并与冲突解决
- 合并分支
- 解决冲突
- 11. Git 工作流程
- 11.1 基本工作流程
- 11.2 Git Flow 工作流程
- 安装 Git Flow
- 创建新特性分支
- 完成特性分支
- 发布分支
- 12. Git 进阶技巧
- 12.1 使用 Stash 临时保存更改
- 保存当前更改
- 查看 Stash 列表
- 恢复 Stash
- 删除 Stash
- 12.2 使用 rebase 重新应用提交
- 执行 Rebase
- 12.3 使用 Bisect 查找提交中的 bug
- 启动 Bisect
- 标记提交为好或坏
- 13. 寄语
- 14. 结束语
1. Git 概述
1.1 什么是 Git
Git 是一个分布式版本控制系统,用于跟踪文件的变化,尤其是程序代码的变化。它由 Linus Torvalds(Linux 操作系统的创建者)于 2005 年开发。Git 允许开发者在本地创建代码仓库,进行文件修改、提交等操作,直到准备好与远程仓库同步。Git 提供强大的分支管理功能,可以在不干扰主分支的情况下开发新功能或修复 bug。
1.2 Git 与其他版本控制系统的区别
- 集中式版本控制系统(如 SVN):所有的代码版本保存在一个中央服务器中。每次操作都需要连接到服务器。
- 分布式版本控制系统(如 Git):每个开发者的工作站都有完整的代码历史记录,可以脱离服务器工作,直到需要同步时才连接。
1.3 Git 的主要特点
- 速度快:Git 的本地操作速度非常快,因为大多数操作是在本地完成的。
- 分布式架构:每个开发者的机器上都有完整的代码库副本,不依赖于中央服务器。
- 支持分支和合并:Git 提供强大的分支管理和合并功能,便于团队协作。
- 数据完整性:Git 使用 SHA-1 哈希值确保版本数据的完整性,防止数据丢失。
2. Git 安装与配置
2.1 Git 安装
Git 支持多种操作系统,包括 Windows、macOS 和 Linux。以下是不同操作系统的安装方法:
Windows_33">Windows
- 前往 Git 官方网站 下载 Windows 版 Git。
- 运行安装程序,按照向导完成安装,选择默认选项即可。
- 安装完成后,在命令行输入
git --version
,如果显示 Git 的版本号,表示安装成功。
macOS_39">macOS
Linux
- 在 Debian/Ubuntu 系统上,可以使用以下命令安装:
sudo apt update sudo apt install git
- 在 Red Hat/Fedora 系统上:
sudo yum install git
2.2 Git 配置
Git 安装完成后,第一次使用时需要进行一些基本配置,主要包括设置用户名和邮箱。
命令:
git config --global user.name "<username>"
git config --global user.email "<email>"
示例命令:
git config --global user.name "John Doe"
git config --global user.email "johndoe@example.com"
效果:
- 这些配置将用于你所有的 Git 提交,确保每次提交时正确记录提交者信息。
- 配置成功后,使用
git config --list
可以查看所有配置信息。
3. Git 基础命令
3.1 克隆 Git 仓库
命令:
git clone <repository_url>
示例命令:
git clone https://github.com/example/repo.git
效果:
- 克隆远程仓库到本地。此命令会创建一个与远程仓库同名的文件夹,并将所有文件和历史记录下载到本地。
- 终端输出:
Cloning into 'repo'... remote: Counting objects: 50, done. remote: Compressing objects: 100% (25/25), done. remote: Total 50 (delta 15), reused 20 (delta 5), pack-reused 0 Unpacking objects: 100% (50/50), done.
3.2 查看 Git 仓库状态
命令:
git status
示例命令:
git status
效果:
- 显示当前工作目录的状态,列出哪些文件有变更,哪些文件已经暂存,哪些文件没有被跟踪。
- 终端输出:
On branch master Your branch is up to date with 'origin/master'.Changes not staged for commit:modified: index.htmlno changes added to commit (use "git add" and/or "git commit -a")
3.3 查看提交历史
命令:
git log
示例命令:
git log
效果:
- 查看当前 Git 仓库的提交历史。Git 会显示每次提交的哈希值、作者信息、提交日期和提交信息。
- 终端输出:
commit 1234567890abcdef1234567890abcdef12345678 Author: John Doe <johndoe@example.com> Date: Tue Oct 28 18:32:01 2024 +0800Fixed the bug in index.htmlcommit 0987654321abcdef0987654321abcdef09876543 Author: Jane Smith <janesmith@example.com> Date: Mon Oct 27 12:15:45 2024 +0800Added new feature to main.js
3.4 创建、切换和删除分支
创建分支
命令:
git branch <branch_name>
示例命令:
git branch feature-xyz
效果:
- 创建一个新的分支
feature-xyz
,但并不切换到该分支。
切换分支
命令:
git checkout <branch_name>
示例命令:
git checkout feature-xyz
效果:
- 切换到指定的分支
feature-xyz
。
删除分支
命令:
git branch -d <branch_name>
示例命令:
git branch -d feature-xyz
效果:
- 删除分支
feature-xyz
,如果分支已经合并到当前分支,则可以成功删除。如果没有合并,Git 会提示你需要使用-D
强制删除。
3.5 合并分支
命令:
git merge <branch_name>
示例命令:
git merge feature-xyz
效果:
- 将
feature-xyz
分支的更改合并到当前分支。如果没有冲突,Git 会自动合并并创建一个新的提交。 - 终端输出:
Updating abcdef1..1234567 Fast-forwardfile1 | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)
如果合并过程中出现冲突,Git 会标记出冲突文件,需要手动解决冲突后再提交。
4. Git 提交与变更管理
4.1 提交文件变更
命令:
git commit -m "<commit_message>"
示例命令:
git commit -m "Fix bug in header component"
效果:
- 将已暂存的更改提交到本地 Git 仓库,并附带一条提交信息。
- 终端输出:
[master 1234567] Fix bug in header component1 file changed, 2 insertions(+), 1 deletion(-)
4.2 查看差异
命令:
git diff
示例命令:
git diff
效果:
- 显示工作目录与暂存区之间的差异,或者暂存区与最后一次提交之间的差异。它是用来查看文件改动的详细内容。
- 终端输出:
diff --git a/index.html b/index.html index abcdef1..1234567 100644 --- a/index.html +++ b/index.html @@ -1,3 +1,3 @@<header> - <h1>Welcome to My Website</h1> + <h1>Welcome to Our Website</h1></header>
4.3 使用暂存区
Git 使用暂存区来暂存更改,等待提交。你可以使用 git add
将修改的文件添加到暂存区,然后使用 git commit
提交更改。
暂存所有更改
命令:
git add .
示例命令:
git add .
效果:
- 暂存当前目录下的所有更改(包括新增、修改和删除的文件)。然后,使用
git commit
提交这些更改。
暂存单个文件
命令:
git add <file_name>
示例命令:
git add index.html
效果:
- 将
index.html
文件的更改添加到暂存区,准备提交。
5. Git 分支管理
5.1 分支的概念
分支是 Git 中一个非常强大的功能,它允许你在不影响主分支(通常是 master
或 main
)的情况下进行开发。每个分支都是代码的一个独立版本,开发者可以在不同分支上并行开发,最后再将它们合并。
- 主分支:通常是主开发线的分支,生产环境代码通常部署在主分支上。
- 功能分支:通常用于开发新功能。每个功能分支在完成开发后合并回主分支。
- 发布分支:用于准备代码发布,确保代码在生产环境中运行良好。
5.2 创建、切换和删除分支
创建分支
命令:
git branch <branch_name>
示例命令:
git branch feature-login
效果:
- 创建一个名为
feature-login
的新分支,但不切换到该分支。
切换分支
命令:
git checkout <branch_name>
示例命令:
git checkout feature-login
效果:
- 切换到
feature-login
分支,开始在该分支上进行开发。
删除分支
命令:
git branch -d <branch_name>
示例命令:
git branch -d feature-login
效果:
- 删除
feature-login
分支。如果该分支已经合并到当前分支,删除将成功。如果尚未合并,Git 会发出警告。
5.3 合并分支与解决冲突
当开发者在不同分支上进行开发并且最终需要将这些更改合并时,Git 提供了合并操作。合并时,如果两个分支修改了相同的部分,Git 会提示冲突,并要求开发者手动解决。
合并分支
命令:
git merge <branch_name>
示例命令:
git merge feature-login
效果:
- 将
feature-login
分支的更改合并到当前分支。如果没有冲突,Git 会自动完成合并,并创建一个新的提交。
解决冲突
如果合并时发生冲突,Git 会标记出冲突文件,开发者需要手动编辑冲突部分,解决后再执行提交。
6. Git 工作流
6.1 基本工作流
Git 的基本工作流包括以下步骤:
- 从远程仓库克隆项目。
- 在本地创建新的分支进行开发。
- 完成开发后,提交更改并推送到远程仓库。
- 合并到主分支并推送到远程仓库。
6.2 Git Flow 工作流
Git Flow 是一种非常流行的 Git 工作流,适用于持续集成和团队合作的项目。Git Flow 使用几个固定的分支来管理开发周期:
- master:用于发布的分支,生产环境代码总是保持稳定。
- develop:用于开发的主分支,所有的开发和集成工作都发生在这里。
- feature:每个新功能都应该在独立的分支上开发。
- release:当开发周期结束时,创建一个发布分支进行最终调试。
- hotfix:用于修复生产环境的紧急问题。
6.3 Fork 与 Pull Request 工作流
在开源项目中,通常使用 Fork 和 Pull Request(PR)工作流。开发者可以 fork 一个远程仓库,修改自己的分支,最后通过 Pull Request 将修改提交给原仓库的所有者进行合并。
- Fork:在 GitHub 上 fork 仓库,创建该仓库的副本。
- Clone:将 fork 的仓库克隆到本地。
- 修改与提交:在本地修改代码并提交。
- Pull Request:在 GitHub 上发起 Pull Request,将修改提交给原项目。
7. Git 高级命令与技巧
7.1 Rebase 与 Merge
git merge
和 git rebase
都用于合并分支,但它们的工作方式不同。
- Merge:合并分支时,会产生一个合并提交,保留合并历史。
- Rebase:将一个分支的修改应用到另一个分支的最顶端,从而产生一个线性的提交历史。
命令:
git rebase <branch_name>
示例命令:
git rebase master
效果:
- 将当前分支的更改应用到
master
分支的顶部,从而产生一个线性的提交历史。
7.2 使用 Tag
Git 使用标签(Tag)来标记特定的提交点,通常用于标记发布版本。
命令:
git tag <tag_name>
示例命令:
git tag v1.0
效果:
- 为当前提交创建一个名为
v1.0
的标签。
7.3 Git 忽略文件
在 Git 中,.gitignore
文件用于指定 Git 不需要跟踪的文件或目录。它通常用于忽略临时文件、编译产物、操作系统生成的文件等不需要版本控制的内容。合理使用 .gitignore
能有效保持 Git 仓库的整洁,避免不必要的文件进入版本控制系统。
gitignore__482">7.3.1 创建 .gitignore
文件
命令:
echo "<pattern>" >> .gitignore
示例命令:
echo "node_modules/" >> .gitignore
效果:
- 这个命令将
node_modules/
目录添加到.gitignore
文件中,表示 Git 将忽略所有node_modules
目录下的文件。 - 如果
.gitignore
文件不存在,它会自动创建并将指定的内容追加到文件末尾。 - 运行命令后,执行
cat .gitignore
可以看到文件内容:$ cat .gitignore node_modules/
注意事项:
gitignore__507">7.3.2 编辑 .gitignore
文件
在项目开发中,可能会有多个文件需要被忽略,或者更改忽略规则。你可以手动编辑 .gitignore
文件,添加新的忽略规则。
命令:
nano .gitignore
示例命令:
nano .gitignore
效果:
- 这会打开
.gitignore
文件,允许你进行手动编辑。你可以在文件中添加或删除需要忽略的文件或目录模式。 - 例如,添加以下内容以忽略某些常见文件和文件夹:
这样,所有*.log *.tmp node_modules/ dist/
.log
、.tmp
文件以及node_modules/
和dist/
目录下的文件都会被 Git 忽略。
提示:
- 使用
nano
命令时,编辑完文件后需要按Ctrl + O
保存文件,按Ctrl + X
退出编辑器。
7.3.3 忽略已跟踪的文件
如果某个文件已经被 Git 跟踪,但之后你希望忽略它,可以通过修改 .gitignore
文件来实现。需要先将该文件从 Git 的索引中移除,然后才能正确忽略。
命令:
git rm --cached <file_name>
示例命令:
git rm --cached node_modules/
效果:
- 这个命令将
node_modules/
目录从 Git 的索引中移除,但不会删除本地文件。 - 在移除索引后,
node_modules/
目录将被.gitignore
忽略,不再被 Git 跟踪。 - 执行
git status
会看到该文件或目录从暂存区移除的提示:$ git status Changes to be committed:(use "git restore --staged <file>..." to unstage)deleted: node_modules/
注意事项:
- 使用
--cached
参数仅会从 Git 的索引中删除文件,文件本身会保留在本地工作区。 - 在移除文件后,记得提交
.gitignore
文件和git rm
操作:git commit -m "Remove node_modules from version control"
7.3.4 适用的忽略规则
在 .gitignore
文件中,可以使用不同的模式来指定忽略哪些文件或目录。以下是常见的忽略规则:
- 通配符
*
:匹配零个或多个字符。例如,*.log
会忽略所有.log
文件。 - 目录模式
/*
:匹配目录中的所有文件。例如,build/*
会忽略build/
目录下的所有文件。 - 否定符
!
:在忽略规则中,使用!
来指定不忽略某个文件或目录。例如,!important.log
会保留important.log
文件。 - 注释
#
:注释行以#
开头,Git 会忽略注释行。例如,# Ignore logs
。
命令:
echo "*.log" >> .gitignore
echo "!important.log" >> .gitignore
效果:
*.log
忽略所有.log
文件。!important.log
保留important.log
文件,即使它符合.log
模式。
注意事项:
- 在
.gitignore
中添加规则时,一定要注意规则的顺序,因为后面的规则会覆盖前面的规则。例如,如果先添加*.log
忽略所有.log
文件,再添加!important.log
来保留important.log
。
gitignore__590">7.3.5 常见的 .gitignore
配置
以下是一些常见的 .gitignore
配置,适用于不同的开发环境和工具。
gitignore_594">1. Node.js 项目 .gitignore
# 忽略 node_modules 目录
node_modules/# 忽略编译的日志文件
npm-debug.log*# 忽略临时文件
*.tmp
*.swp
gitignore_608">2. Python 项目 .gitignore
# 忽略虚拟环境目录
venv/
# 忽略 Python 编译的文件
*.pyc
*.pyo
gitignore_618">3. Java 项目 .gitignore
# 忽略 Maven 构建输出目录
target/
# 忽略 IntelliJ IDEA 配置文件
.idea/
# 忽略 Eclipse 配置文件
.project
.classpath
gitignore__630">7.3.6 提交 .gitignore
文件
一旦你修改了 .gitignore
文件并确保它包含了所有需要忽略的文件和目录,记得将它提交到 Git 仓库,以便其他开发者也能够使用相同的忽略规则。
命令:
git add .gitignore
git commit -m "Add .gitignore to ignore unnecessary files"
git push origin <branch_name>
示例命令:
git add .gitignore
git commit -m "Add .gitignore to ignore node_modules"
git push origin main
效果:
7.4 查看提交历史
命令:
git log
示例命令:
git log
效果:
-
显示当前分支的提交历史,包括每个提交的哈希值、提交作者、提交时间和提交信息。输出格式如下:
commit 1234567890abcdef1234567890abcdef12345678 (HEAD -> master) Author: John Doe <johndoe@example.com> Date: Thu Oct 28 12:15:42 2024 +0000Fix bug in header componentcommit abcdef1234567890abcdef1234567890abcdef12 Author: Jane Smith <janesmith@example.com> Date: Wed Oct 27 15:22:08 2024 +0000Add new feature to handle user login
-
额外选项:
7.5 撤销修改
Git 提供了多种方式撤销更改,视不同的场景而定。
7.5.1 撤销未暂存的更改
命令:
git checkout -- <file_name>
示例命令:
git checkout -- index.html
效果:
- 撤销文件
index.html
中的未暂存更改,恢复到上次提交时的状态。
7.5.2 撤销暂存的更改
命令:
git reset <file_name>
示例命令:
git reset index.html
效果:
- 将已暂存的
index.html
文件从暂存区移除,但不影响文件内容。如果你已经执行了git add
,此命令将取消暂存,但不会丢失文件中的更改。
7.5.3 撤销整个提交
命令:
git reset --hard <commit_hash>
示例命令:
git reset --hard abcdef1234567890abcdef1234567890abcdef12
效果:
- 重置当前分支到指定的提交
abcdef1234567890abcdef1234567890abcdef12
,并且丢弃所有当前工作目录中的更改。请谨慎使用,因为此命令会删除所有未提交的更改。
8. Git 与远程仓库
8.1 查看远程仓库
命令:
git remote -v
示例命令:
git remote -v
效果:
- 显示当前项目的远程仓库信息,包括远程仓库的名称(通常为
origin
)和 URL 地址。输出示例如下:origin https://github.com/example/repo.git (fetch) origin https://github.com/example/repo.git (push)
8.2 拉取远程仓库的更新
命令:
git pull
示例命令:
git pull origin master
效果:
- 从远程仓库的
master
分支拉取最新的更改并自动合并到本地当前分支。如果没有冲突,Git 会自动合并。 - 终端输出:
remote: Enumerating objects: 20, done. remote: Counting objects: 100% (20/20), done. remote: Compressing objects: 100% (14/14), done. From https://github.com/example/repo* branch master -> FETCH_HEADUpdating abcdef1..1234567Fast-forwardfile1 | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)
8.3 推送本地更改到远程仓库
命令:
git push <remote_name> <branch_name>
示例命令:
git push origin master
效果:
-
将本地
master
分支的提交推送到远程仓库。确保本地分支与远程分支一致后,执行推送操作。 -
终端输出:
Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 329 bytes | 329.00 KiB/s, done. To https://github.com/example/repo.git1234567..89abcdef master -> master
8.4 克隆远程仓库
命令:
git clone <repository_url>
示例命令:
git clone https://github.com/example/repo.git
效果:
- 克隆远程仓库到本地,创建一个新的 Git 仓库,并自动设置远程
origin
指向该仓库。 - 终端输出:
Cloning into 'repo'... remote: Enumerating objects: 123, done. remote: Counting objects: 100% (123/123), done. remote: Compressing objects: 100% (90/90), done. remote: Total 123 (delta 10), reused 90 (delta 6), pack-reused 0 Receiving objects: 100% (123/123), 3.64 MiB | 2.50 MiB/s, done. Resolving deltas: 100% (10/10), done.
9. Git 高级特性
9.1 子模块 (Submodule)
Git 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。它特别适合将第三方库或依赖项目引入到你的项目中。
添加子模块
命令:
git submodule add <repository_url> <path>
示例命令:
git submodule add https://github.com/example/other-repo.git submodules/other-repo
效果:
- 将一个外部仓库添加为子模块,并将其内容放置在指定路径(如
submodules/other-repo
)下。
更新子模块
命令:
git submodule update --remote
示例命令:
git submodule update --remote
效果:
- 更新所有子模块到最新的远程版本。
9.2 使用 Git 钩子 (Hooks)
Git 钩子是 Git 中的一个机制,允许在执行某些操作前或后运行自定义脚本。常见的钩子包括 pre-commit
和 post-commit
。
设置钩子
命令:
cd .git/hooks
示例命令:
cd .git/hooks
效果:
- 进入
.git/hooks
目录,所有的钩子脚本都存放在该目录中。
示例钩子:pre-commit
命令:
echo "#!/bin/sh" > .git/hooks/pre-commit
echo "echo 'Running pre-commit hook...'" >> .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
效果:
- 创建一个
pre-commit
钩子,每次提交之前,都会运行这个脚本。 - 脚本内容会输出
"Running pre-commit hook..."
,并且该钩子需要执行权限。
9.3 Git 配置与别名
Git 允许你为常用命令设置别名,帮助提高工作效率。
设置别名
命令:
git config --global alias.<alias_name> <git_command>
示例命令:
git config --global alias.co checkout
效果:
查看配置
命令:
git config --list
示例命令:
git config --list
效果:
- 显示所有 Git 配置项,例如用户信息、别名设置等。
10. Git 性能优化与高级技巧
10.1 使用 Git LFS (Large File Storage)
Git LFS 用于管理大型文件(如二进制文件、视频文件等),它将这些大文件存储在 Git 外部的专用服务中,从而避免仓库变得过于庞大。
安装 Git LFS
命令:
git lfs install
示例命令:
git lfs install
效果:
- 安装 Git LFS(Large File Storage),使其可以用于管理大型文件。
- 终端输出:
Git LFS initialized.
跟踪大型文件类型
命令:
git lfs track "*.psd"
示例命令:
git lfs track "*.psd"
效果:
- 开始跟踪所有
.psd
文件类型的文件,将它们存储在 Git LFS 中。 - 输出示例:
Tracking "*.psd" to Git LFS.
提交 LFS 文件
命令:
git add <file_name>
git commit -m "Add large file"
示例命令:
git add image.psd
git commit -m "Add large PSD file"
效果:
- 将大文件(如
image.psd
)添加到 Git LFS 管理的文件中,然后提交。
10.2 Git 分支管理高级技巧
删除本地分支
命令:
git branch -d <branch_name>
示例命令:
git branch -d feature-xyz
效果:
- 删除本地分支
feature-xyz
,如果该分支未完全合并到当前分支,Git 会阻止删除。使用-D
强制删除:git branch -D feature-xyz
删除远程分支
命令:
git push <remote_name> --delete <branch_name>
示例命令:
git push origin --delete feature-xyz
效果:
- 删除远程仓库中的
feature-xyz
分支。
10.3 Git 合并与冲突解决
合并分支
命令:
git merge <branch_name>
示例命令:
git merge feature-xyz
效果:
- 将
feature-xyz
分支的修改合并到当前分支。如果没有冲突,Git 会自动合并修改并创建一次新的提交。
解决冲突
命令:
git status
示例命令:
git status
效果:
- 查看当前分支的状态,Git 会提示哪些文件存在冲突。通常会显示为
both modified
,需要手动编辑冲突文件。
解决冲突步骤:
-
打开冲突文件,手动解决冲突。Git 会在冲突部分标记出不同的修改,类似如下:
<<<<<<< HEAD // Your changes here ======= // Changes from the other branch >>>>>>> feature-xyz
-
在解决冲突后,标记为已解决:
git add <file_name>
-
完成合并并提交:
git commit
11. Git 工作流程
11.1 基本工作流程
命令:
git clone <repository_url>
git checkout -b <new_branch>
git add <file_name>
git commit -m "Your commit message"
git push origin <new_branch>
示例命令:
git clone https://github.com/example/repo.git
git checkout -b feature-xyz
git add index.html
git commit -m "Add new feature to index"
git push origin feature-xyz
效果:
- 这是一个基本的 Git 工作流程,包括从远程仓库克隆、创建新分支、修改文件、提交更改、推送到远程仓库等步骤。
11.2 Git Flow 工作流程
Git Flow 是一种常见的 Git 工作流程,它定义了多个分支类型和对应的管理策略,旨在简化团队协作。
安装 Git Flow
命令:
git flow init
示例命令:
git flow init
效果:
- 启动 Git Flow 工作流程初始化,设置默认的分支策略。
- 会提示输入分支名称等设置,通常选择默认设置即可。
创建新特性分支
命令:
git flow feature start <feature_name>
示例命令:
git flow feature start feature-xyz
效果:
- 使用 Git Flow 创建一个新的特性分支
feature-xyz
,用于开发新功能。
完成特性分支
命令:
git flow feature finish <feature_name>
示例命令:
git flow feature finish feature-xyz
效果:
- 完成
feature-xyz
分支的开发,并将其合并回develop
分支。
发布分支
命令:
git flow release start <release_name>
示例命令:
git flow release start 1.0.0
效果:
- 创建一个新的发布分支
1.0.0
,用于准备发布版本。
12. Git 进阶技巧
12.1 使用 Stash 临时保存更改
Git 提供了 stash
命令,用于将当前的更改暂时保存,之后可以恢复,以便切换到其他任务。
保存当前更改
命令:
git stash
示例命令:
git stash
效果:
- 保存当前工作区的修改,并将工作区恢复为最近一次提交时的状态。
查看 Stash 列表
命令:
git stash list
示例命令:
git stash list
效果:
- 显示所有的暂存更改(stash)列表。输出示例:
stash@{0}: WIP on master: 1234567 Add feature X stash@{1}: WIP on feature-xyz: abcdef0 Fix bug Y
恢复 Stash
命令:
git stash apply <stash_index>
示例命令:
git stash apply stash@{0}
效果:
- 恢复指定的暂存更改,将其应用到当前分支。
删除 Stash
命令:
git stash drop <stash_index>
示例命令:
git stash drop stash@{0}
效果:
- 删除指定的暂存更改。
12.2 使用 rebase 重新应用提交
rebase
用于将一组提交应用到另一个分支上,常用于整理提交历史。
执行 Rebase
命令:
git rebase <base_branch>
示例命令:
git rebase master
效果:
- 将当前分支的提交重新应用到
master
分支的最新提交上。
12.3 使用 Bisect 查找提交中的 bug
Git Bisect 是一个二分查找工具,用于定位某个 bug 引入的提交。
启动 Bisect
命令:
git bisect start
示例命令:
git bisect start
效果:
- 启动 bisect 过程,Git 会要求你指定已知的“坏”提交和“好”提交。
标记提交为好或坏
命令:
git bisect good <commit_hash>
git bisect bad <commit_hash>
示例命令:
git bisect good abcdef1234567890
git bisect bad 1234567890abcdef
效果:
- 标记提交为好(不包含 bug)或坏(包含 bug)。Git 会通过二分查找来缩小范围,直到定位到引入 bug 的提交。
13. 寄语
Git 是一种强大的版本控制工具,掌握了其基本命令和高级特性后,可以大大提高开发效率并方便团队协作。通过本篇文章,你已经学会了 Git 的核心命令及其使用方法,希望你能够灵活运用 Git 在实际项目中进行版本管理。
14. 结束语
- 本节内容已经全部介绍完毕,希望通过这篇文章,大家对
Git
有了更深入的理解和认识。- 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️