git详解
简介
Git 是一个分布式版本控制系统,用于跟踪计算机文件的变化,特别是源代码的管理。它允许多个开发者协作开发软件项目,并能够管理项目的历史记录。Git 的设计旨在提高速度、数据完整性和支持分布式、非线性工作流。
工作区域
-
工作目录(Working Directory):这是你在本地计算机上实际工作的地方,即你打开的项目文件夹。你可以在这里编辑、删除、添加文件。
-
暂存区(Staging Area,也称为 Index):这是一个中间区域,用于暂时保存你打算提交的更改。当你执行 git add 命令时,文件的更改被添加到暂存区。这是一个准备提交的区域。
-
本地仓库(Local Repository):这是 Git 存储版本历史记录的地方,保存在 .git 目录中。提交(commit)被保存在本地仓库中,包括所有的提交记录和历史版本。
-
远程仓库(Remote Repository):这是存储在远程服务器上的 Git 仓库,通常用于团队协作。你可以将本地更改推送到远程仓库,也可以从远程仓库拉取更新。
简化图示——
+--------------------+
| Working Directory |
| |
| [ 文件 1 ] [ 文件 2 ] [ 文件 3 ] |
| |
+---------+----------+
|
| (git add)
v
+---------+----------+
| Staging Area |
| |
| [ 文件 1 ] [ 文件 2 ] |
| |
+---------+----------+
|
| (git commit)
v
+---------+----------+
| Local Repository |
| |
| Commit 1 Commit 2 Commit 3 |
| |
+---------+----------+
|
| (git push)
v
+---------+----------+
| Remote Repository |
| |
| Commit 1 Commit 2 Commit 3 |
| |
+--------------------+
基本操作
初始化仓库
git init
在当前目录初始化一个新的 Git 仓库。
克隆仓库
git clone <repository-url>
从远程仓库克隆一个完整的仓库到本地。
查看当前状态
git status
显示工作目录和暂存区的状态。
查看历史记录
git log
查看提交历史。
分支管理
查看所有分支
git branch
列出本地分支。
创建新分支
git branch <branch-name>
创建一个新的分支。
切换分支
git switch <branch-name>
git checkout <branch-name>
切换到指定的分支。
git checkout -b new-branch
创建并切换到新分支。
git checkout -
快速切换回上一个分支。
删除分支
git branch -d <branch-name>
删除指定的本地分支。
提交操作
添加文件到暂存区
git add <file-or-directory>
将文件或目录添加到暂存区。
提交更改
git commit -m "commit message"
提交已暂存的更改。
修改最后一次提交
git commit --amend
修改最后一次提交。
远程操作
查看远程仓库
git remote -v
列出所有远程仓库及其URL。
添加远程仓库
git remote add <remote-name> <repository-url>
添加一个新的远程仓库。
更新远程分支
git fetch
- 更新远程追踪分支:git fetch 会从远程仓库中获取最新的提交,并将它们保存在你本地的远程追踪分支(通常是 origin/branch_name)中。它不会自动合并这些更改到你的当前分支。
- 同步远程仓库的变动:git fetch 让你能够查看远程仓库的最新变动,而不会影响你当前的开发工作。你可以在合并、重置或变基之前,先检视这些变动。
git fetch origin
从名为 origin 的远程仓库中获取所有分支的更新,但不会改变你当前的分支。
git fetch origin branch_name
从 origin 仓库中拉取指定的 branch_name 分支的更新。
git fetch 是一种安全的方法来获取远程仓库的更新,它不会对你的当前工作造成干扰。通过定期使用 git fetch,你可以确保本地仓库与远程仓库同步,从而避免在合并或变基时遇到不必要的冲突。
拉取更新并合并
git pull origin <remote-branch-name>
git pull <remote-name> <branch-name>
从远程分支拉取最新更改并合并到当前分支。
git checkout -b <new-branch-name> origin/<remote-branch-name>
新建分支切到当前分支同时从远程分支拉取代码(一条龙)。
推送更改
git push <remote-name> <branch-name>
讲本地分支的更改推送到远程仓库。
撤销操作
撤销工作目录中的更改
git checkout -- <file>
撤销对文件的更改。
重置暂存区中的文件
git reset HEAD <file>
将文件从暂存区移除。
回退到指定提交
git reset --hard <commit-id>
将仓库重置到指定提交。
合并和冲突解决
合并分支
git merge <branch-name>
将指定分支合并到当前分支。
解决冲突并提交
打开有冲突的文件。你会看到类似以下格式的冲突标记:
<<<<<<< HEAD
当前分支的内容
=======
被合并分支的内容
>>>>>>> branch-name
- <<<<<<< HEAD 和 >>>>>>> branch-name 之间的内容是当前分支与被合并分支的冲突部分。
- 你需要手动编辑这些冲突文件,选择要保留的内容,删除冲突标记,然后保存文件。
git add <resolved-file> //将解冲突的文件添加到暂存区
git commit //提交合并结果
放弃本地更改并保留远程分支的修改
git checkout --theirs .
git add .
git commit -m "Resolved conflicts by keeping remote changes"
标签管理
在 Git 中,标签(Tag)是一种特殊的引用,通常用于给某个特定的提交打上标记。这种标记通常用于标识重要的时间点,如版本发布。标签本质上是一个指向某个提交的指针,类似于分支,但它是不可移动的,即一旦创建标签后,标签就始终指向那个特定的提交。
- 版本发布:最常见的用途是在发布新版本时打标签。例如,你可以在代码达到某个稳定版本时创建一个标签,标记为 v1.0.0,以后可以很方便地找到这个版本的代码。
- 标记里程碑:可以用标签来标记项目中的重要里程碑,如功能完成、修复重大问题等。
创建轻量标签
git tag <tag-name>
轻量标签仅仅是指向某个特定提交的引。
创建附注标签
git tag -a <tag-name> -m "Tag message"
附注标签是一个完整的对象,它除了指向某个提交外,还包含额外的元数据,如标签的作者、日期和一条消息。
将标签打到特定的提交上
git tag <tag-name> <commit-hash>
查看标签
git tag
推送标签到远程
git push <remote-name> <tag-name>
将标签推送到远程仓库。
配置管理
配置用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
查看配置
git config --list
查看和保存命令历史
查看命令历史
git reflog
查看所有的命令操作历史。
保存gdb输出到文件
gdb > output.txt
分支命名
分支命名约定涵盖了从功能开发到性能优化、文档更新、配置管理、实验性工作等各种场景。选择合适的命名约定有助于增强代码库的组织性、清晰度和可维护性。
feature/
- 用途:用于开发新功能。
- 示例:feature/user-authentication
bugfix/
- 用途:用于修复特定问题或缺陷。
- 示例:bugfix/fix-login-error
hotfix/
- 用途:用于紧急修复生产环境中的问题。
- 示例:hotfix/patch-security-vulnerability
release/
- 用途:用于发布准备阶段的分支,通常用于修复在发布版本中发现的问题。
- 示例:release/1.0.0
chore/
- 用途:用于项目中非功能性任务的分支,比如更新文档或配置文件。
- 示例:chore/update-dependencies
test/
- 用途:用于测试相关的分支,如编写或执行测试用例。
- 示例:test/add-unit-tests
refactor/
- 用途:用于代码重构,提升代码质量而不改变其功能。
- 示例:refactor/optimize-code-structure
docs/
- 用途:用于文档更新或改进。
- 示例:docs/update-readme
ci/
- 用途:用于持续集成配置或脚本更新。
- 示例:ci/improve-build-script
config/
- 用途:用于配置文件的更新或修改。
- 示例:config/update-database-config
experiment/
- 用途:用于实验性功能或概念验证。
- 示例:experiment/try-new-architecture
deps/(或 dependencies/)
- 用途:用于更新或管理项目依赖。
- 示例:deps/upgrade-node-version
wip/(Work In Progress)
- 用途:表示正在进行中的工作,通常尚未完成。
- 示例:wip/new-ui-design
revert/
- 用途:用于撤销或回滚之前的更改。
- 示例:revert/revert-bugfix-1234
security/
- 用途:用于处理安全相关的修复或改进。
- 示例:security/implement-oauth2
style/
- 用途:用于代码风格和格式化调整。
- 示例:style/format-codebase
perf/(Performance)
- 用途:用于优化系统性能。
- 示例:perf/improve-query-speed
fix/
- 用途:与 bugfix/ 类似,但可能用于更小规模的修复。
- 示例:fix/typo-in-docs
task/
- 用途:用于处理特定任务的分支,通常是一个单独的开发任务。
- 示例:task/setup-ci-pipeline
env/
- 用途:用于环境配置的更改或管理。
- 示例:env/update-docker-setup
infra/
- 用途:用于基础设施相关的更改,如服务器配置、部署脚本等。
- 示例:infra/add-kubernetes-support
build/
- 用途:用于构建系统相关的更改,如更改构建脚本或构建配置。
- 示例:build/update-build-settings
cleanup/
- 用途:用于代码清理,删除不再使用的代码或资源。
- 示例:cleanup/remove-old-files
prototype/
- 用途:用于创建原型或试验性实现。
- 示例:prototype/early-version-of-feature
merge/
- 用途:用于处理复杂的合并操作,通常是将多个分支的更改合并在一起。
- 示例:merge/feature-x-into-develop
temp/(Temporary)
- 用途:用于临时性工作,通常不打算长期保留。
- 示例:temp/debugging-issue
misc/
- 用途:用于杂项或不属于其他类别的更改。
- 示例:misc/update-scripts
patch/
- 用途:用于小规模的修补,通常是对特定问题的轻微调整。
- 示例:patch/fix-display-bug
archive/
- 用途:用于存档旧分支,这些分支可能不再被主动开发,但仍保留。
- 示例:archive/legacy-feature-x

浙公网安备 33010602011771号