Git是目前最流行的分布式版本控制系统,每个程序员都应该熟练掌握。但是很多人只会用add、commit、push、pull等基础命令,对Git的高级用法了解不多。今天就来分享一些Git版本控制的高级用法,帮助大家提升团队协作效率。

1. 分支管理策略

Git Flow工作流:

  • master:主分支,存放稳定发布版本
  • develop:开发分支,存放最新开发代码
  • feature/*:功能分支,从develop切出,开发完成后合并回develop
  • release/*:发布分支,从develop切出,用于发布前测试和修复
  • hotfix/*:热修复分支,从master切出,修复线上紧急bug后合并回master和develop
# 创建功能分支
git checkout -b feature/user-login develop
# 开发完成后合并回develop
git checkout develop
git merge --no-ff feature/user-login
git branch -d feature/user-login

简化工作流(适合小团队):

  • master:主分支,稳定版本
  • dev:开发分支
  • 直接在dev上开发,稳定后合并到master

2. 变基(rebase)

rebase可以把一个分支的提交"搬"到另一个分支上,让提交历史更加线性整洁。

# 在feature分支上rebase master
git checkout feature
git rebase master
# 如果有冲突,解决后继续
git add .
git rebase --continue
# 放弃rebase
git rebase --abort

注意: 不要对已经推送到公共仓库的提交做rebase,会导致其他人的代码混乱。rebase只适合本地未推送的提交。

3. 交互式rebase

交互式rebase可以编辑、删除、合并、重新排序提交。

# 编辑最近3次提交
git rebase -i HEAD~3

会打开编辑器,显示:

pick a1b2c3d 提交1
pick d4e5f6g 提交2
pick h7i8j9k 提交3

可以修改为:

  • pick:保留该提交
  • reword:保留提交,但修改提交信息
  • edit:保留提交,但暂停以便修改
  • squash:合并到前一个提交
  • fixup:合并到前一个提交,丢弃提交信息
  • drop:删除该提交

合并多次提交:

git rebase -i HEAD~3
# 修改为
pick a1b2c3d 提交1
squash d4e5f6g 提交2
squash h7i8j9k 提交3
# 保存后编辑合并后的提交信息

4. 储藏(stash)

当你在一个分支上工作到一半,需要切换到另一个分支处理紧急事情,但又不想提交半成品代码时,可以用stash储藏当前修改。

# 储藏当前修改
git stash
# 查看储藏列表
git stash list
# 恢复最近的储藏
git stash pop
# 恢复指定储藏
git stash apply stash@{1}
# 删除指定储藏
git stash drop stash@{0}
# 清空所有储藏
git stash clear
# 储藏包括未跟踪的文件
git stash -u

5. 撤销修改

撤销工作区修改:

# 撤销单个文件的修改
git checkout -- filename
# 撤销所有文件的修改
git checkout -- .

撤销暂存区修改(已经add但未commit):

# 取消暂存单个文件
git reset HEAD filename
# 取消暂存所有文件
git reset HEAD .

撤销提交(已经commit但未push):

# 撤销最近一次提交,保留修改在工作区
git reset --soft HEAD~1
# 撤销最近一次提交,保留修改在工作区和暂存区
git reset --mixed HEAD~1
# 撤销最近一次提交,彻底丢弃修改
git reset --hard HEAD~1

撤销已经push的提交:

# 生成一个反向提交,撤销指定提交的修改
git revert commit_id
# 撤销最近一次提交
git revert HEAD

6. 查看历史

# 查看提交历史
git log
# 一行显示提交历史
git log --oneline
# 图形化显示分支合并历史
git log --graph --oneline --all
# 查看指定文件的修改历史
git log -p filename
# 查看指定行的修改历史
git blame filename
# 查看某次提交的详细修改
git show commit_id
# 比较两个分支的差异
git diff branch1 branch2
# 比较工作区和暂存区的差异
git diff
# 比较暂存区和最新提交的差异
git diff --cached

7. 标签管理

# 列出所有标签
git tag
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本1.0.0发布"
# 查看标签信息
git show v1.0.0
# 推送单个标签到远程
git push origin v1.0.0
# 推送所有标签到远程
git push origin --tags
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin :refs/tags/v1.0.0

8. 别名配置

配置Git别名,简化常用命令:

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 config --global alias.unstage "reset HEAD"
git config --global alias.last "log -1 HEAD"

配置后可以用git st代替git statusgit co代替git checkout等。

9. 其他实用技巧

搜索提交历史:

# 搜索提交信息包含关键词的提交
git log --grep="关键词"
# 搜索修改内容包含关键词的提交
git log -S "关键词"

临时切换到某个提交:

# 检出某个提交(只读查看)
git checkout commit_id
# 回到原来的分支
git checkout master

保存用户名和邮箱:

git config --global user.name "Your Name"
git config --global user.email "your@email.com"

设置默认编辑器:

git config --global core.editor "vim"

忽略文件权限变化:

git config --global core.filemode false

总结

Git是一个强大的版本控制系统,掌握高级用法能大大提升开发效率和团队协作能力。本文介绍了分支管理、变基、交互式rebase、储藏、撤销修改、查看历史、标签管理、别名配置等高级用法,希望对大家有所帮助。

Git的学习是一个循序渐进的过程,建议大家在实际工作中多尝试、多练习,逐步掌握Git的高级用法。