百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

掌握版本控制系统(如Git)的高级使用技巧

ztj100 2024-12-23 14:53 12 浏览 0 评论

一、引言

Git 作为当前最流行的版本控制系统,掌握其高级技巧能极大提高开发效率。本文将深入探讨 Git 的高级使用技巧,让你从普通用户晋升为 Git 专家。

在软件开发过程中,版本控制是至关重要的一环。Git 以其强大的功能和灵活性,成为了众多开发者的首选版本控制系统。然而,仅仅掌握 Git 的基本操作是远远不够的,为了更高效地管理代码和协作开发,我们需要深入了解 Git 的高级使用技巧。

Git 提供了一系列高级命令,如 git stash、git revert、git reset、git rebase 和 git merge 等,这些命令可以帮助我们更好地处理代码变更、解决冲突、整理提交历史等。此外,Git 还支持别名、钩子、提示和远程源等功能,这些功能可以进一步提高我们的开发效率和代码管理能力。

接下来,我们将详细介绍 Git 的高级使用技巧,包括高级命令的使用方法和最佳实践,帮助你更好地掌握 Git,提升开发效率。

二、高级命令

1. Git Rebase

  • 清理历史记录,使提交更清晰线性。Git rebase 可以将一系列提交整理成一条清晰的线性历史记录。通过交互式 rebase,可以对提交进行重新排序、合并或分割,从而使项目的历史更加整洁。
  • 交互式 Rebase 可重新排序、编辑或合并提交。在进行交互式 rebase 时,可以使用 git rebase -i origin/master 命令。这会打开预设的编辑器,显示需要进行 rebase 的提交列表。每个提交都以 (action) (partial-sha) (short commit message) 的格式显示。可以将操作(action)改为 edit(使用提交,但是暂停以便进行修正)、squash(使用提交,但是把它与前一提交合并)或 pick(使用提交)。还可以对这些行上下移动从而对提交进行重排序。
  • Squashing Commits 和 Splitting Commits 的用法。如果选择 squash 操作,git 会把这个提交和前一个提交合并成为一个新的提交,并再次调用编辑器让用户合并这两个提交的提交信息。如果选择 edit 操作,git 会在对下一提交进行操作之前,返回到命令行让用户对提交进行修正,或者对提交内容进行修改。例如,可以重置一个提交,然后创建两个或更多个新提交。

2. Git Stash

  • 临时保存修改,应对紧急问题。在开发过程中,可能会遇到紧急任务需要切换到其他分支进行开发,而此时又不想将尚未完成的代码提交到版本库中。这时可以使用 git stash 将当前工作目录中的修改保存起来,让我们可以在以后的任何时候恢复这些修改。
  • 保存、应用、查看和删除保存的修改。使用 git stash save 命令可以保存当前的修改,使用 git stash list 命令查看保存的列表,使用 git stash apply 命令恢复最近的保存,使用 git stash drop 命令删除最近的保存。还可以使用 git stash branch 命令创建一个新的分支,并将保存的修改应用到新分支上。

3. Git Cherry-Pick

  • 选择性应用提交,用于修复 bug 或迁移功能。当只需要另一个分支的部分代码变动(某几个提交)时,可以采用 Cherry pick。git cherry-pick 命令的作用,就是将指定的提交(commit)应用于其他分支。要使用 git cherry-pick,首先需要找到想要应用的提交的哈希值(commit hash)。然后执行 git cherry-pick <commitHash>,其中 <commitHash> 为提交的哈希值。
  • 注意事项及解决合并冲突的方法。如果 cherry-pick 操作导致冲突,Git 会暂停操作,并要求手动解决冲突。解决完冲突后,使用 git add 将修改标记为已解决,然后继续 cherry-pick:git add <conflicted-file> git cherry-pick --continue。如果决定放弃这次 cherry-pick,可以使用 git cherry-pick --abort。使用此命令时,应确保当前工作区干净,没有未提交的更改,以避免不必要的冲突或混淆。

4. Git Submodule

  • 管理子模块,在大型项目中引用第三方库。在 Git 中可以用子模块 submodule 来管理项目,将一个 Git 仓库当作另外一个 Git 仓库的子目录。这允许克隆另外一个仓库到项目中并且保持提交相对独立。
  • 添加、更新和管理子模块的步骤。添加子模块可以使用 git submodule add <url> <path> 命令,其中 <url> 为远程项目地址,<path> 为本地子模块路径。添加子模块后,运行 git status 可以看到目录增加了一个 .gitmodules 文件,这个文件用来保存子模块的信息。查看子模块可以使用 git submodule 命令。更新项目内子模块到父模块期望的版本可以使用 git submodule update,更新子模块为远程项目的最新版本可以使用 git submodule update --remote。克隆包含子模块的项目有两种方法:一种是先克隆父项目,再更新子模块;另一种是直接递归克隆整个项目,使用 git clone <url> <path> --recursive。在子模块中修改文件后,可以直接提交到远程项目分支。如果要删除子模块,需要手动删除相关的文件,包括子模块文件夹、.gitmodules 文件中相关子模块信息、.git/config 中的相关子模块信息和 .git 文件夹中的相关子模块文件。

5. Git Bisect

  • 二分查找 Bug 引入点,快速定位问题。Git bisect 可以将代码提交的历史按照两分法不断缩小定位,找到可能引入错误的提交记录区间。
  • 启动、标记和结束 Bisect 会话的流程。首先查找提交记录,找到可能引入错误的提交记录区间,可以使用 git log --pretty=oneline。然后开始使用 git bisect start <latest> <oldest> 启动二分查找,其中 <latest> 为最近出现问题的提交,<oldest> 为较远的正确的提交。如果从当前记录开始,可以使用 HEAD 代替提交 ID。接着使用 git bisect good 或 git bisect bad 进行标记,如果代码有 bug 则使用 git bisect bad,如果代码 bug 消失则使用 git bisect good。不断重复这个过程,直到找到出现问题的那条记录。最后使用 git bisect reset 恢复代码到最近的那条记录。

三、最佳实践

1. 使用 Feature 分支

在开发新功能时,创建功能分支是一种良好的实践。这样可以避免与主分支发生冲突,确保主分支的稳定性。当新功能开发完成后,将功能分支合并到主分支,并及时删除功能分支,以保持代码仓库的整洁。

例如,在开发代号为 Vulcan 的新功能时,可以使用以下命令创建功能分支:

$ git switch -c feature-vulcan
Switched to a new branch 'feature-vulcan'

开发完成后,可以进行如下操作:

$ git add vulcan.py
$ git status
On branch feature-vulcan
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: vulcan.py
$ git commit -m "add feature vulcan"
[feature-vulcan 287773e] add feature vulcan
1 file changed, 2 insertions(+)
create mode 100644 vulcan.py
$ git switch dev
$ git merge feature-vulcan --no-ff -m "合并修复 feature-vulcan" feature-vulcan

如果新功能被取消,可以强行删除功能分支:

$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).

2. 编写清晰的提交信息

提交信息应简洁明了,包含目的和变更内容。格式要求如下:

  • 采用类似于 “<type>: <subject>” 的格式,其中 “type” 用于说明提交的性质,常见的类型有 “feat”(新功能)、“fix”(修复 bug)、“docs”(文档修改)、“style”(代码格式调整)、“refactor”(代码重构)、“perf”(性能优化)、“revert”(回退)、“test”(增加测试用例)、“chore”(其他杂项事务)等。
  • “subject” 是提交信息的简短描述,用简洁的语言概括本次提交的主要内容。

例如,“feat: 添加用户登录功能”,表示这是一个新功能提交,添加了用户登录功能。如果需要,可以在提交信息中添加更详细的描述,包括背景、解决方法等。

3. 定期进行代码审查

通过拉取请求或合并请求进行审查,能够提高代码质量。代码审查的重要性在于确保代码质量、发现潜在问题和共享知识。

审查流程如下:

  • 提交前审查:开发者在提交前进行自我审查或请求同事审查。
  • Pull Request 审查:通过 Pull Request 进行代码审查。
  • 合并后审查:定期审查合并到主分支的代码。

审查标准包括代码风格、功能实现、性能和安全性等方面。确保代码风格一致性,实现了预期的功能,并且具有良好的性能和安全性。

可以使用 GitLab、GitHub 或 Bitbucket 等工具支持代码审查。例如,在 GitLab 中,可以创建 Pull Request,其他开发者可以查看代码变更,提出意见和建议,并对代码变更进行审查。

4. 避免直接在主分支上开发

保持主分支稳定可发布,在独立分支开发后合并。这样可以确保主分支始终处于可发布状态,避免因未完成的开发工作而影响主分支的稳定性。

在实际工作中,可以从主分支创建功能分支或 bug 分支,在这些分支上进行开发。开发完成后,将分支合并到主分支,并及时删除分支。

例如,在修复 bug 时,可以从主分支创建 bug 分支,进行修复后合并到主分支:

$ git checkout -b bug-1234
# 修复 bug
$ git add xxx
$ git commit -m "修复 bug-1234"
$ git checkout master
$ git merge bug-1234 --no-ff -m "合并修复 bug-1234" bug-1234
$ git branch -d bug-1234

5. 频繁提交

保持小而清晰的变更,便于追踪问题和回滚。频繁提交可以让代码的变更更加清晰,易于理解和追踪。如果出现问题,可以更容易地回滚到之前的版本。

每次提交应该只包含一个小的、明确的变更,避免将多个功能或大量代码放在一个提交中。这样可以使提交历史更加清晰,便于其他开发者理解和审查。

6. 使用 Git Hooks 自动化任务

在 Git 操作前后自动运行脚本,如代码格式化等。Git Hooks 是基于事件的,当执行特定的 Git 指令时,会从仓库下的 hooks 目录检查是否有相对应的脚本,如果有就执行。

例如,可以使用 post-receive 钩子在推送代码后自动部署:

#!/bin/sh
unset GIT_DIR
NowPath=`pwd`
DeployPath="../../www"
cd $DeployPath
git pull origin master
cd $NowPath
exit 0

使用 chmod +x post-receive 改变权限即可。

还可以结合 GitLab-CI 与 GitLab-Runner 实现持续集成,在仓库的根目录下新建.gitlab-ci.yml 文件,定义持续集成流程模板,并在 GitLab 中配置 runner,在每次提交或合并中触发构建。

四、其他高级技巧

1. 修改错误的提交信息

当发现提交信息有误时,可以使用 git commit --amend 命令进行编辑。这个命令允许我们在不产生新的提交记录的情况下,修改最近一次的提交信息。运行该命令后,会打开一个编辑器,我们可以在其中修改提交信息。使用 git log 检查时,会发现历史记录的修改时间还是上一次的时间,就好像什么也没有发生过一样,悄无声息地就改掉了错误的提交信息。

2. 从暂存区删除不想提交的内容

如果不小心将一些不希望提交的内容放入了暂存区,可以使用 git reset HEAD 文件名 命令来删除暂存区特定文件。这样可以确保只有我们真正想要提交的内容被提交到版本库中。

3. 撤销最近一次代码提交

有时候我们可能会提交一些多余的文件或遗漏了一些东西,这时可以使用 git reset --soft HEAD~1 命令让 Git 状态回到最近一次 commit 前。这个命令可以撤销最近一次的代码提交,让我们有机会重新整理和提交代码。

4. 删除远程分支

如果提交了错误代码后需要重新提交,可以将远程分支删除,重新创建远程分支后再提交。使用 git push origin --delete <branchName> 命令可以删除错误提交的远程分支。需要注意的是,在删除远程分支之前,要确保没有其他人正在使用该分支进行开发工作,以免造成不必要的麻烦。

5. 创建远程分支

可以使用 git push origin devBranchName:farBranchName 命令创建远程分支。这个命令将本地的 devBranchName 分支推送到远程仓库,并创建一个名为 farBranchName 的远程分支。这样可以方便地在远程仓库中进行协作开发。

6. 暂停当前分支

当在新分支上工作时,忽然旧分支有 bug 要改,需要暂停新分支,否则新分支的修改会污染其他分支。这时可以使用 git stash 命令暂停新分支。这个命令会将当前工作目录中的修改保存起来,让我们可以在以后的任何时候恢复这些修改。

7. 重启分支

回到新分支后需要重启分支,可以使用 git stash pop 命令。这个命令会将之前保存的修改恢复到当前分支,让我们可以继续在新分支上工作。

8. cherry-pick 的多种用法

  • 单个提交、批量提交和保留原提交者信息的 cherry-pick。当只需要另一个分支的部分代码变动(某几个提交)时,可以采用 Cherry pick。git cherry-pick 命令的作用,就是将指定的提交(commit)应用于其他分支。要使用 git cherry-pick,首先需要找到想要应用的提交的哈希值(commit hash)。然后执行 git cherry-pick <commitHash>,其中 <commitHash> 为提交的哈希值。
  • 注意事项及解决合并冲突的方法。如果 cherry-pick 操作导致冲突,Git 会暂停操作,并要求手动解决冲突。解决完冲突后,使用 git add 将修改标记为已解决,然后继续 cherry-pick:git add <conflicted-file> git cherry-pick --continue。如果决定放弃这次 cherry-pick,可以使用 git cherry-pick --abort。使用此命令时,应确保当前工作区干净,没有未提交的更改,以避免不必要的冲突或混淆。

9. 从另一分支获取文件内容

可以使用 git checkout (branch) -- (path/file) 命令不切换分支获取文件内容。这个命令非常方便,当我们需要从另一个分支获取某个特定文件的内容时,可以使用这个命令,而不需要切换到那个分支。

10. 删除已缓存进 git 库的文件

如果想要删除要忽略的文件,可以使用 git rm -r --cached <文件路径> 命令。这个命令可以将已缓存进 git 库的文件从暂存区中删除,而不会从文件系统中删除该文件。

11. 基于 commitID 或 tag 创建新分支

可以使用 git checkout -b newbranchName commitId 或 tagName 命令基于 commitID 或 tag 创建新分支。这个命令非常有用,当我们需要基于某个特定的提交或标签创建一个新分支时,可以使用这个命令。

五、结语

掌握 Git 的高级技巧能让你更有效地管理代码历史,提高工作效率,在团队协作中发挥更大作用。不断实践这些技巧,成为真正的 Git 专家。

在软件开发过程中,Git 作为强大的版本控制系统,为我们提供了诸多高级技巧来优化代码管理和团队协作。从高级命令的灵活运用到最佳实践的遵循,再到其他高级技巧的探索,每一个环节都为我们的开发工作带来了便利和效率提升。

通过掌握 Git Rebase、Git Stash、Git Cherry-Pick、Git Submodule 和 Git Bisect 等高级命令,我们能够更好地处理代码变更、解决冲突、整理提交历史、管理子模块以及快速定位问题。同时,遵循最佳实践,如使用 Feature 分支、编写清晰的提交信息、定期进行代码审查、避免直接在主分支上开发、频繁提交和使用 Git Hooks 自动化任务,能够提高代码质量、增强团队协作和提升开发效率。

此外,了解其他高级技巧,如修改错误的提交信息、从暂存区删除不想提交的内容、撤销最近一次代码提交、删除远程分支、创建远程分支、暂停和重启分支、cherry-pick 的多种用法、从另一分支获取文件内容、删除已缓存进 git 库的文件以及基于 commitID 或 tag 创建新分支,能够在特定

相关推荐

Vue 技术栈(全家桶)(vue technology)

Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...

vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)

前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...

vue3 组件初始化流程(vue组件初始化顺序)

学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...

vue3优雅的设置element-plus的table自动滚动到底部

场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...

Vue3为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...

9、echarts 在 vue 中怎么引用?(必会)

首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...

无所不能,将 Vue 渲染到嵌入式液晶屏

该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...

vue-element-admin 增删改查(五)(vue-element-admin怎么用)

此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...

最全的 Vue 面试题+详解答案(vue面试题知识点大全)

前言本文整理了...

基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时

今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...

不来看看这些 VUE 的生命周期钩子函数?| 原力计划

作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...

Vue3.5正式上线,父传子props用法更丝滑简洁

前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...

Vue 3 生命周期完整指南(vue生命周期及使用)

Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...

救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘

前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...

怎么在 vue 中使用 form 清除校验状态?

在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...

取消回复欢迎 发表评论: