Git 是一个分布式版本控制系统,用于跟踪文件的更改,通常用于源代码管理。它的设计目的是为了协同工作和版本管理,让多个开发人员能够高效地合作开发和维护代码。
Git环境配置
在官网可以找到对应下载:Git - Downloads (git-scm.com)。安装选项均默认即可
也可以在Windows命令行输入:
sh
winget install --id Git.Git -e --source winget
对于Ubuntu来说,这个PPA提供了最新的稳定的上游Git版本:
sh
add-apt-repository ppa:git-core/ppa #可以通过添加 Git Core PPA 来安装最新的稳定版 Git
apt update #添加 PPA 后,更新你的包列表:
apt install git #安装最新版本的 Git
打开 Git Bash(可以在开始菜单中找到)
设置用户名和邮箱:
sh
git config --global user.name "你的名字"
git config --global user.email "你的邮箱地址(可随意填写)"
验证配置:
sh
git config --list
创建新的本地仓库
在 Git Bash 中导航到你想创建新仓库的目录。例如:
sh
cd D:\Test #或者在目录下右键打开 Git Bash 窗口
初始化一个新的 Git 仓库:
sh
git init [目录] #缺省则为当前目录
这将在 D:\Test
目录下创建一个新的 Git 仓库
Git基础操作
在 Git 中,工作目录下文件的修改(增加、删除、更新)会经历几个状态,这些状态会随着你执行不同的 Git 命令而发生变化。主要的状态包括:未追踪(Untracked) 、已暂存(Staged) 和 已提交(Committed)。
git status
命令的作用是查看当前 Git 仓库中文件的状态:
sh
git status
未追踪(Untracked)
未追踪状态指的是 Git 不跟踪该文件的任何变化。这些文件存在于你的工作目录中,但尚未被 Git 跟踪。当你在工作目录中新增一个文件时,它就处于未追踪状态。
处理方法:
-
添加到暂存区(Stage):将未追踪的文件添加到 Git 的暂存区,使其成为已暂存状态,准备提交到仓库中。
shgit add <文件名>
或者,如果要添加所有未追踪的文件:
shgit add .
已暂存(Staged)
已暂存状态指的是文件已经被添加到 Git 的暂存区,准备被提交到仓库中。当你执行 git add
命令后,文件就会进入这个状态。
处理方法:
-
提交到仓+库:将已暂存的文件提交到 Git 仓库中。
shgit commit -m "提交说明"
-
撤销暂存 :如果你想撤销暂存,可以使用
git reset
命令。这会将文件从暂存区移除,但保留在工作目录中的修改。shgit reset <文件名>
已提交(Committed)
已提交状态指的是文件的修改已经被成功提交到 Git 仓库中,成为历史记录的一部分。
-
查看提交历史 :使用
git log
命令查看提交历史记录。shgit log [option]
- --all 显示所有分支
- --pretty=oneline 将提交信息显示为一行
- --abbrev-commit 使得输出的commitId更简短
- --graph 以图的形式显示
-
回滚到历史版本 :如果需要回滚到过去的某个版本,可以使用
git checkout
或git reset
命令,具体取决于是否想保留历史记录。shgit checkout <提交ID> <文件名> # 恢复单个文件到特定提交状态 git reset --hard <提交ID> # 回滚整个仓库到特定提交状态
其他状态和命令:
-
修改但未暂存 :如果文件已经被 Git 跟踪,但在提交前又有新的修改,它们会处于修改但未暂存的状态。你可以使用
git diff
查看工作目录和暂存区之间的差异,并决定是否要添加修改到暂存区。shgit diff
-
删除文件 :如果你删除了工作目录中的文件,Git 会将其标记为已删除状态。你可以使用
git rm
命令从暂存区中删除文件,并提交该变更。shgit rm <文件名>
-
显示日志:即仓库中所有的引用更新历史。它记录了本地仓库中 HEAD 和分支引用的变动,包括提交、合并、重置等操作,即使在分支已被删除或者重置后也能查看到相应的引用历史。
shgit reflog
添加文件忽略
将文件添加到 Git 的忽略列表可以防止它们被 Git 跟踪和提交到版本控制系统中。这在某些情况下非常有用,比如临时文件、日志文件、编译生成的文件等不需要进行版本控制的文件。
添加要忽略的文件模式:
在工作目录创建并打开 .gitignore
文件,并在其中添加你想要忽略的文件或目录的模式。模式可以是文件名、文件夹名或使用通配符来匹配多个文件。Git 将根据 .gitignore
文件中的规则来忽略相应的文件或目录。以下是一些示例:
-
忽略特定文件或目录:
# 忽略临时文件 temp.txt temp/ # 忽略编译生成的文件 *.exe *.dll # 忽略日志文件 *.log
-
使用通配符:
*
表示零个或多个字符。?
表示任意单个字符。!
表示取消忽略指定模式。
确保 .gitignore
文件本身被跟踪并提交到仓库中,以便所有团队成员都能享有相同的忽略规则。
分支
查看本地分支
使用 git branch
命令可以查看本地仓库中的所有分支。这个命令会列出当前仓库中所有的分支,并且会标注出当前所在的分支(前面带有 *
号)。
命令形式:
sh
git branch
示例输出:
假设你有两个分支:master
和 feature/new-feature
,其中 master
是当前分支。
* master
feature/new-feature
在这个示例中,*
标志表示当前所在的分支是 master
。
创建本地分支
使用 git branch <分支名>
命令可以创建一个新的本地分支,但是创建后并不会自动切换到该分支,需要使用 git checkout
或 git switch
命令切换到新创建的分支。
命令形式:
sh
git branch <分支名>
示例:
创建一个名为 feature/new-feature
的新分支:
sh
git branch feature/new-feature
切换分支
使用 git checkout <分支名>
命令可以切换到已经存在的本地分支。
命令形式:
sh
git checkout <分支名>
示例:
切换到 feature/new-feature
分支:
sh
git checkout feature/new-feature
创建并切换到分支
如果要创建一个新的分支并立即切换到该分支,可以使用 git checkout -b <分支名>
命令。
命令形式:
sh
git checkout -b <分支名>
示例:
创建并切换到名为 bugfix/123-fix
的新分支:
sh
git checkout -b bugfix/123-fix
这个命令相当于执行了以下两个命令:
sh
git branch bugfix/123-fix # 创建新分支
git checkout bugfix/123-fix # 切换到新分支
合并分支
使用 git merge <分支名>
命令可以将指定分支的更改合并到当前分支。
命令形式:
sh
git merge <分支名>
示例:
假设你当前在 master
分支,想将 feature/new-feature
分支合并到 master
:
sh
git checkout master # 确保当前在 master 分支
git merge feature/new-feature
删除分支
使用 git branch -d <分支名>
命令可以删除一个已经存在的本地分支。需要注意的是,不能删除当前所在的分支,删除分支前需要切换到其他分支。
命令形式:
sh
git branch -d <分支名>
如果要强制删除一个分支(即使它包含未合并的更改),可以使用 git branch -D <分支名>
命令。
示例:
删除名为 bugfix/123-fix
的分支:
sh
git branch -d bugfix/123-fix
如果想强制删除 bugfix/456-fix
分支,可以使用:
sh
git branch -D bugfix/456-fix
冲突解决
当你执行 git merge
或 git pull
操作时,如果存在冲突,Git 会在合并的过程中停止,并提示你手动解决冲突。冲突会在合并操作的输出中显示。
冲突文件:
Git 会将冲突标记为带有特殊标记的文件,标记的部分指示了冲突发生的位置。你需要手动编辑这些文件来解决冲突。
例如,一个冲突标记可能看起来像这样:
<<<<<<< HEAD
这是当前分支的内容
=======
这是要合并的内容
>>>>>>> 分支名
<<<<<<< HEAD
到=======
之间的部分是当前分支(通常是你所在的分支)的修改。=======
到>>>>>>> 分支名
之间的部分是要合并的分支(通常是你要合并进当前分支的其他分支)的修改。
操作:
-
解决冲突:在冲突标记之间编辑文件,选择或合并你需要的更改。你可以选择保留当前分支的更改、使用要合并的分支的更改,或者合并两者的内容。
-
保存文件:解决冲突后,保存文件并关闭编辑器。
-
添加解决后的文件 :将解决冲突后的文件标记为已解决状态,使用
git add
命令将文件添加到暂存区。git add <冲突文件>
-
完成合并 :继续执行合并操作,使用
git commit
提交已解决的合并。git commit
-
如果你不想保留默认的合并提交消息,可以通过编辑器提供的界面来编辑提交消息。
分支使用原则与流程
在软件开发中,通常会采用一些标准化的分支管理策略,以便有效地管理和协作。以下是常见的分支使用原则与流程:
分支名称 | 描述 | 主要用途 | 合并目标分支 |
---|---|---|---|
master | 线上生产环境的主分支,存放稳定的、经过测试的代码。 | 发布到生产环境的代码版本 | 无 |
develop | 从 master 分支派生,主要用于整个开发团队的集成开发。 |
所有开发人员的日常工作基础 | master (发布) |
feature/xxxx | 从 develop 分支派生,用于开发新功能或进行特定任务的临时分支。 |
同期并行开发不同功能或任务 | develop |
hotfix/xxxx | 从 master 分支派生,用于紧急修复线上生产环境中的问题。 |
紧急修复线上的 bug | master , develop |
test | 从 develop 或 master 分支派生,用于代码集成测试和验收测试。 |
确保开发的功能符合预期且不影响现有功能的测试 | develop , master |
pre | 从 develop 分支派生,用于预上线环境测试,准备进行线上发布前的最终验证。 |
预发布阶段的最终测试和验证 | master |
release/xxxx | 从 develop 分支派生,用于准备发布新版本的临时分支。 |
发布前的准备工作,包括版本号更新、文档编写等 | master |
- 发布到生产环境的代码版本 :
master
分支存放着经过测试并准备发布到生产环境的稳定代码版本。只有经过充分测试和验证的代码才能合并到master
分支。 - 所有开发人员的日常工作基础 :
develop
分支是所有开发人员进行日常开发的基础分支,新功能的开发和测试都在这个分支上进行。 - 同期并行开发不同功能或任务 :
feature/xxxx
分支用于并行开发不同的功能或任务,每个分支对应一个特定的开发任务,完成后合并回develop
分支。 - 紧急修复线上的 bug :
hotfix/xxxx
分支通常由master
分支派生,用于紧急修复线上生产环境中的问题,修复完成后需要合并回master
和develop
分支。 - 确保开发的功能符合预期且不影响现有功能的测试 :
test
分支用于进行集成测试和验收测试,确保开发的功能与预期一致且不会影响现有功能的稳定性。 - 预发布阶段的最终测试和验证 :
pre
分支用于进行预上线环境的最终测试和验证,确认准备发布到生产环境的代码版本稳定可靠。 - 发布前的准备工作 :
release/xxxx
分支用于准备发布新版本,包括版本号的更新、文档的编写、最终的测试和验证等工作,完成后将代码合并到master
分支进行发布。