作为一个程序员Git是我们每天都在使用的版本控制工具。但是很多程序员对Git的了解只停留在基本的add, commit, push, pull对Git的高级功能了解不多。

今天就来分享一下Git版本控制的进阶教程包括分支管理合并策略变基重置标签储藏子模块等高级功能希望能帮到大家。

1. 分支管理进阶

1.1 分支模型

常见的Git分支模型有几种:

Git Flow:Git Flow是一种比较经典的分支模型包含master, develop, feature, release, hotfix等分支。适合有明确发布周期的项目。

GitHub Flow:GitHub Flow是一种比较简单的分支模型只有master和feature分支。适合持续部署的项目。

Trunk Based Development:主干开发是一种比较激进的分支模型所有开发都在主干上进行通过特性开关控制功能的发布。适合高频率发布的项目。

选择哪种分支模型要根据项目的特点和团队的习惯来决定。没有最好的只有最适合,的。

1.2 分支操作技巧

创建并切换分支

git checkout -b feature/new-feature
# 或者使用Git 2.23+的新命令
git switch -c feature/new-feature

删除分支

# 删除已合并的分支
git branch -d feature/new-feature
# 强制删除分支(未合并也删除)
git branch -D feature/new-feature
# 删除远程分支
git push origin --delete feature/new-feature

查看分支

# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 查看分支最后一次提交
git branch -v
# 查看已合并到当前分支的分支
git branch --merged
# 查看未合并到当前分支的分支
git branch --no-merged

重命名分支

# 重命名当前分支
git branch -m new-name
# 重命名指定分支
git branch -m old-name new-name

2. 合并与变基

2.1 合并(Merge)

合并是将两个分支的修改整合到一起的操作。

普通合并

git checkout master
git merge feature/new-feature

快进合并(Fast-forward):当目标分支是当前分支的直接后继时Git会直接移动指针不产生新的提交这叫快进合并。

禁止快进合并

git merge --no-ff feature/new-feature

使用,--no-ff,会产生一个新的合并提交保留分支的历史信息。

2.2 变基(Rebase)

变基是将当前分支的提交重新应用到另一个分支的顶端的操作。变基能让提交历史更加线性整洁。

git checkout feature/new-feature
git rebase master

变基的过程是先找到两个分支的共同祖先然后将当前分支的提交暂存起来然后将当前分支指向目标分支的顶端最后将暂存的提交依次应用上去。

交互式变基

git rebase -i HEAD~3

交互式变基可以对最近的N次提交进行编辑包括修改提交信息合并提交删除提交重新排序,等。

2.3 合并 vs 变基

合并和变基都能整合两个分支的修改但是有区别:

  • 合并:保留完整的提交历史包括分支的分叉和合并历史比较真实但是可能比较杂乱。
  • 变基:让提交历史更加线性整洁但是会改变提交的哈希值修改历史。

使用原则

  • 对本地未推送的分支可以使用变基让历史更整洁。
  • 对已经推送到远程的分支不要使用变基因为会改变历史影响其他人。
  • 团队协作时要统一使用合并或者变基避免混乱。

3. 重置(Reset)

重置是将当前分支的指针移动到指定的提交的操作。重置有三种模式:

3.1 软重置(--soft)

git reset --soft HEAD~1

软重置只移动分支指针不改变暂存区和工作区。被重置的提交的修改会保留在暂存区可以重新提交。

3.2 混合重置(--mixed,默认)

git reset --mixed HEAD~1
# 或者
git reset HEAD~1

混合重置移动分支指针并且重置暂存区但是不改变工作区。被重置的提交的修改会保留在工作区需要重新add和commit。

3.3 硬重置(--hard)

git reset --hard HEAD~1

硬重置移动分支指针并且重置暂存区和工作区。被重置的提交的修改会被丢弃不可恢复。

注意:硬重置会丢弃工作区的修改使用前要确认不需要这些修改,了。

4. 标签(Tag)

标签是用于标记特定提交的引用通常用于版本发布。

4.1 创建标签

轻量标签

git tag v1.0.0

附注标签

git tag -a v1.0.0 -m "Release version 1.0.0"

附注标签包含标签名标签信息创建者日期等信息推荐使用。

4.2 查看标签

# 查看所有标签
git tag
# 查看标签详情
git show v1.0.0

4.3 推送标签

# 推送单个标签
git push origin v1.0.0
# 推送所有标签
git push origin --tags

4.4 删除标签

# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0

5. 储藏(Stash)

储藏是将当前工作区的修改暂时保存起来的操作。当你正在开发一个功能突然需要切换到另一个分支修复bug但是又不想提交当前的修改时就可以使用储藏。

5.1 创建储藏

git stash
# 或者带描述
git stash save "正在开发新功能"
# 储藏包括未跟踪的文件
git stash -u

5.2 查看储藏

git stash list

5.3 应用储藏

# 应用最近的储藏,不删除储藏记录
git stash apply
# 应用指定的储藏
git stash apply stash@{1}
# 应用最近的储藏,并删除储藏记录
git stash pop

5.4 删除储藏

# 删除最近的储藏
git stash drop
# 删除指定的储藏
git stash drop stash@{1}
# 删除所有储藏
git stash clear

6. 子模块(Submodule)

子模块是将一个Git仓库作为另一个Git仓库的子目录的功能。适合项目依赖其他项目的场景。

6.1 添加子模块

git submodule add https://github.com/user/repo.git path/to/submodule

6.2 克隆包含子模块的仓库

# 普通克隆,子模块目录是空的
git clone https://github.com/user/repo.git
# 初始化并更新子模块
git submodule init
git submodule update
# 或者一步到位
git clone --recursive https://github.com/user/repo.git

6.3 更新子模块

# 更新所有子模块到最新版本
git submodule update --remote

7. 其他实用技巧

7.1 查看提交历史

# 查看提交历史
git log
# 一行显示提交历史
git log --oneline
# 图形化显示分支合并历史
git log --graph --oneline --all
# 查看指定文件的修改历史
git log -- filename
# 查看指定作者的提交
git log --author="username"

7.2 比较差异

# 比较工作区和暂存区的差异
git diff
# 比较暂存区和最新提交的差异
git diff --cached
# 比较两个提交的差异
git diff commit1 commit2
# 比较两个分支的差异
git diff branch1 branch2

7.3 撤销修改

# 撤销工作区的修改(未add)
git checkout -- filename
# 或者Git 2.23+
git restore filename
# 撤销暂存区的修改(已add未commit)
git reset HEAD filename
# 或者Git 2.23+
git restore --staged filename

7.4 查找提交

# 按提交信息查找
git log --grep="keyword"
# 按修改内容查找
git log -S "keyword"
# 二分查找引入bug的提交
git bisect start
git bisect bad
git bisect good commit

7.5 配置别名

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --graph --oneline --all"

配置别名后就可以用,git st,代替,git status,提高效率。

写在最后

以上就是Git版本控制的进阶教程。Git是一个非常强大的版本控制工具掌握好Git的高级功能能让我们的开发效率提升很多。

但是Git的功能很多也很复杂我们不需要一下子全部掌握可以在实际使用中慢慢学习和积累。遇到问题时多查文档多实践就能逐渐掌握。

同时我们也要注意Git的一些危险操作比如硬重置强制推送变基已推送的分支等这些操作可能会丢失代码使用前要谨慎确认。

最后提醒大家几句:

  1. 多提交小步提交:不要等功能全部完成才提交要小步提交每完成一个小功能就提交一次这样方便回溯和管理。
  2. 写好提交信息:提交信息要清晰明了说明这次提交做了什么不要写,"更新","修改",这样模糊的信息。
  3. 定期推送:不要等功能全部完成才推送要定期推送到远程仓库避免本地代码丢失。
  4. 使用分支:不要直接在master分支上开发要使用feature分支开发完成后再合并到master。

希望这篇教程能帮到大家。如果有什么问题或者建议欢迎在评论区留言和我一起讨论。