版本控制之最佳实践(Git版)

2023-11-10

现如今,应该每个开发者都在使用版本控制工具了吧。然而,如果你理解版本控制的基本规则,你便能更好地发挥它的效用。在此,我们汇总了一些最佳实践,希望你在使用Git做版本控制时能够了然于心、得心应手。

1.  相关的改动才放一起提交

一次提交(git commit)应该只包含相关的改动。比如说,修复两个不同的bug就应该分开来做两次提交。提交的改动越小(或越少),其他开发者理解起来就越容易;如果改动有问题,退回去也比较方便。Git有一个暂存区域(staging area)的概念,它还允许你暂存文件的某些部分,这更便于你创建非常细粒度的提交。

2.  经常性地提交

经常提交势必让你每次提交的东西都很少,也有助于你只提交相关的改动。并且,你还能更频繁地与别人共享代码。通过这种方式,所有人在集成代码时都会感觉更轻松,也就能避免一些不必要的冲突。相比之下,如果每次提交的东西很多、改动很大、时间间隔很长,那么在代码合并(merge)过程中产生的冲突就很难解决了。

3.  别提交半成品

你应该只在完工之后才提交。这并不是逼你把一个大块头功能完整实现好之后再提交。恰恰相反!你应该把大功能的实现分解成合乎逻辑的小块工作,并且记住要早一些、经常性地提交你的代码。只是要切忌为了提交而提交,比如在下班离开公司之前把一些东西仓促放入仓库中。如果你这么做只是为了从服务器抓取一份干净的代码(git checkout <branch>或者git pull),可以考虑使用Git的“Stash”功能。

4.  提交之前必须测试

你“认为”已经完工了,然后就可以提交了吗?千万要抵得住这种诱惑!你应该进行全面的测试,以确保你真的是“完工”了,并且(在你能够识别的范围内)没有副作用。尽管将半成品提交到本地仓库不伤大雅(原谅你的庸人自扰),但当你把代码推送(git push)到服务器与别人共享时,这个问题就大了——在这之前,请务必测试你的代码!

5.  提交时须带上适当的描述

在描述的开头部分,你应该简单总结一下你所做的改动(别超过50个字)。然后,用一个空行将开头与主体部分隔离开来。在主体部分,你应该详细回答这些问题:为什么要做这次改动?跟以前的实现有什么不一样?请使用祈使语气和现在时态(比如,要使用“change”这个单词,而不用使用“changed”或“changes”),为的是与像git merge这样的命令自动产生的描述保持一致。

6.  版本控制有别于备份系统

把你的文件备份到远程的服务器上是版本控制系统的一个不错的副作用。但是,你不应该只把版本控制当备份系统来使用。版本控制追求的是每次提交的意义(请回过去阅读第一条:把相关的改动放在一次提交里)——你不应该填鸭式地塞入一堆毫不相干的文件。

7.  使用分支

分支是Git最强大的功能之一。这并不是偶然的——从一开始,简单、快速创建分支的能力就是对Git的一个核心需求。使用分支能够有效地避免不同开发工作之间的相关干扰。你应该在开发过程中广泛使用分支,它可以用于开发新功能、修复bug、试验新的想法……

8.  采用一致的工作流程

Git允许你采纳很多种不同的工作流程:持久存在的分支、主题分支、合并或复位、Gitflow(点我!……你到底应该选择哪一种呢?这取决于几个因素:你的项目,开发与部署的整体流程,还有(可能是最重要的)就是大家的个人偏好。不管你们选择哪种工作流程,请确保团队中的每个人都对工作流程有相同的理解并且严格遵循。

 

原文链接:http://www.git-tower.com/learn/version-control-best-practices.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

版本控制之最佳实践(Git版) 的相关文章

  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可
  • Git 将一个分支合并到所有其他分支中

    我知道这个问题已经在这里被问过 https stackoverflow com questions 2329716 merging changes from master into all branches using git https
  • 创建一个空分支?

    我有一个包含项目的 git 存储库 我现在要对这个项目进行大规模的修改 如何为这次大修创建一个空白的新分支 然后当完成时 如何将这个分支切换到master 使用 checkout orphan 命令 git checkout orphan
  • 带有 git Remote 的 Gem 文件在 Heroku 推送上失败

    我的 gemfile 中有以下行 gem client side validations git gt email protected cdn cgi l email protection Dakuan client side valida
  • Git 在哪里存储标签?

    Git 在哪里存储标签 我执行 git tag v0 1 0 v0 10 0 v0 11 0 但目录 git refs tags是空的 Git 将这些标签存储在哪里 谢谢 它们也可以存储在 git packed refs
  • 仅使用 Git grep 的文件名

    我只想查看文本中包含特定单词的不同文件 current directory git grep word 显示文件中具有匹配单词的每一行 所以我尝试了这个 current directory git grep word files with
  • 显示 master 之前/之后有多少提交分支的别名

    新的 Bitbucket Branches 页面非常棒 它显示每个分支领先 落后于 master 的提交数量 是否有显示相同信息的 Git 别名 信息应显示 分店名称 上次更新是什么时候 其背后有多少提交 有多少提交领先于 master 看
  • VSTS:在构建过期的情况下自动变基/合并和重新排队构建验证门

    我们最近对 PR 上的构建验证门进行了更改 这样 如果另一个提交在当前 PR 完成之前进入主分支 则构建会 立即 过期 看here https stackoverflow com questions 49418800 vsts invali
  • 如何使用git-svn切换svn分支?

    复制 如何让 git svn 使用特定的 svn 分支作为远程存储库 https stackoverflow com questions 192736 how do i make git svn use a particular svn b
  • Git:如何修改服务器的提交?

    我已经在 EC2 上的 git 服务器上推送了一些提交 而不是在 github 上 如何修改 git 服务器上的这些提交 操作就像 删除提交 例如变基 更改提交消息 是否可以 非常感谢 你几乎可以通过用力推动来完成所有事情 将您的本地树更改
  • 如何创建名称中带有正斜杠的标签

    当我已经有了类似的标签时 有什么方法可以创建名称中带有正斜杠的 git 标签吗 假设我有 1 16 0 标签 并且我想创建 1 16 0 1 0 0 标签 git tag 1 16 0 1 0 0 error refs tags 1 16
  • 使用Git记录文件复制操作

    当我使用 git mv 在 git 中移动文件时 状态显示该文件已被重命名 即使我更改了某些部分 它仍然被认为几乎是相同的东西 这很好 因为它让我可以跟踪它的历史记录 当我复制文件时 原始文件有一些历史记录 我想将其与新副本关联起来 我尝试
  • 使用BFG时可以指定多个文件吗?

    我正在尝试删除通配符无法覆盖的多种类型的文件 我尝试使用多个 delete files 但它不接受它 还尝试将文件全部放在 delete files 之后 但它也不接受它 有没有一种方法可以将它们全部放在一个命令中 如果没有 那么我必须运行
  • Gitolite git 克隆错误

    我正在尝试在我的服务器 Macos 服务器 上设置 gitolite 我按照此处找到的安装文档中的说明进行操作 http sitaramc github com gitolite doc 1 INSTALL html http sitara
  • Git 认为我每次进行小更改时都在重写我的一个文件

    我有一个中等大小的 Java 文件 每次我对一个文件 BuildTable java 进行更改时 Git 都会将其报告为巨大的更改 即使只是一两行 BuildTable java 大约有 200 行 本次提交中的更改仅更改了一行 git d
  • 如何更改 GitHub 上的文件模式?

    git add test file git commit m first commit create mode 100644 test file git push git update index add chmod x test file
  • 使用 git 子树时如何添加特定文件夹?

    我正在开发一个复杂的 Ionic 项目 我正在开发的许多组件和提供程序都是通用的 可以在我公司正在进行的其他项目中使用 这在软件开发中很常见 这是我提出的 Git 工作流程 该图显示了分支 my company library repo c
  • 在 Windows 下克隆 git repo 时,出现“错误:无法创建文件 <文件>...(是目录)”

    Z gt git clone git github com kennethreitz httpbin git Cloning into httpbin remote Counting objects 1073 done remote Com
  • 如何在 Visual Studio 2013 中使用 Git 的外部 diff 工具?

    我找到了这个帖子 http architects dzone com articles how configure diff and merge这解释了如何让 Visual Studio 2013 在比较 Git 中的文件时使用内置 dif
  • 如何从 Git 存储库中删除选定的提交日志条目,同时保留其更改?

    我想从线性提交树中删除选定的提交日志条目 以便这些条目不会显示在提交日志中 我的提交树看起来像 R A B C D E HEAD 我想删除 B 和 C 条目 以便它们不会显示在提交日志中 但应保留从 A 到 D 的更改 也许通过引入单个提交

随机推荐

  • impdp参数+impdp交互模式的命令列表

    impdp参数 1 help 是否显示用于导入的联机帮助 2 exclude 排除特定的对象豢型 3 directory 让转储文件 日志文件和sql文件使用的目录对象 4 dumpfile 需要导入的转储文件的列表 5 include 包
  • c语言如何定义标识符 常量 变量,标识符、常量和变量

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1 单选题 C语言主要是借助以下哪个功能来实现程序模块化 A 定义函数 B 定义常量和外部变量 C 三种基本结构语句 D 丰富的数据类型 参考答案 A 参考解析 C语言用函数实现软件的模块化设计
  • 小程序原理

    开发过一段时间小程序了 对于我们现在使用的业务来说 使用小程序开发上手很快 所以反思了一下 那么小程序的原理到底是怎么样的呢 我自己总结一下 小程序的架构 官网原话 当小程序基于 WebView 环境下时 WebView 的 JS 逻辑 D
  • deepfake教程

    https github com iperov DeepFaceLab 首先下载根据不同系统不同显卡分类下载对应版本 能在文件夹下看到以下命令 一 clear workspace 重置 一 提取帧 extract images from v
  • k8s占用的端口号用 kubectl get svc 和lsof -i、netstat 命令都查不到

    如果你使用了 kubectl get svc 和 lsof i 或 netstat 命令查看端口 却没有查到 Kubernetes 的服务 有可能是因为 Kubernetes 服务运行在容器内部 在这种情况下 你可以通过以下步骤来查看 Ku
  • 音视频 ffmpeg ffplay ffprobe命令行

    ffmpeg工具 命令格式 ffmpeg 全局选项 输入选项 i input url 输出选项 output url 帮助命令 查看解封装帮助 dhav ffmpeg4 2才有 ffmpeg h demuxer dhav ffmpeg h
  • 黄广斌谈ELM进展:为深度学习提供理论支持, 将勾连生物学习

    强大的深度神经网络 仍有很多待解决的问题 超限学习机 ELM 发明人 新加坡南阳理工大学副教授黄广斌认为 ELM能够有效地拓展神经网络的理论和算法 近日 黄广斌发表文章 超限学习机 筑梦普适学习和普适智能 Extreme learning
  • 【数据结构】堆的向上调整和向下调整以及相关方法

    文章目录 一 堆的概念 二 堆的性质 三 堆的分类 1 大根堆 2 小根堆 四 说明 五 堆的结构 六 堆的向上调整 1 图示 2 代码实现 3 时间复杂度分析 七 堆的向下调整 1 思路 2 代码实现 八 删除根 1 思路 2 代码实现
  • CentOS6 YUM 源失效问题解决办法

    问题描述 Yum 源失效 无法正常使用 Yum 错误信息如下 http mirrors aliyun com centos 6 updates x86 64 repodata repomd xml Errno 14 PYCURL ERROR
  • CentOs 6.5下java 安装

    我们下载jdk 的rpm包到要安装的服务器上 然后要进行下面的工作 1 移除系统自带的jdk 1 查找系统自带的jdk版本 输入命令 rpm qa grep jdk 2 移除系统自带的jdk 输入命令 yum y remove java 1
  • fatal: Not a git repository (or any of the parent directories): .git

    问题描述 解决方案
  • js之事件委托

    在js的事件流模型中 事件的触发分为3个阶段 1 捕获阶段 由外向内传播 寻找目标元素 2 目标阶段 找到事件触发的目标元素 3 冒泡阶段 事件由内向外冒泡 事件委托也被称为事件代理 那么是事件委托呢 用一个例子来说明 div div di
  • 万字详解:Activiti 工作流引擎

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • BART论文要点解读:看这篇就够了

    全称 Denoising Sequence to Sequence Pre training for Natural Language Generation Translation and Comprehension BART来源于Bidi
  • java晋级赛 深入并发编程

    根据黑马java并发编程学习做的笔记 传送门 https www bilibili com video BV16J411h7Rd p 15 java晋级赛 深入并发编程 一 多线程基础 进程与线程 创建线程的方式及运行原理 创建线程的方式
  • 进程调度的控制—文件锁

    前言 在进程之间 我们不能决定应该先去调度哪一个进程 这时候我们就需要对一个文件加锁 来要求那个先来执行 整体文件锁 int flock int fd int operation fd 文件描述符 operation 定义的宏 也就是选项
  • STL标准模板库学习笔记一(STL序列容器)

    目录 STL 容器 STL迭代器 array vector deque功能 list 和 forward list 功能 vector emplace back 和push back 的区别 vector插入函数insert和emplace
  • ST7796S MIPI单通道, 320x480初始化代码

    ST7796S MIPI单通道接口 320x480分辨率初始化代码 代码示例 loadWidthSet 320 loadHeightSet 480 loadHBPSet 180 loadVBPSet 20 loadHFPSet 20 loa
  • 【C语言】统计素数并求和

    改名字了 2022 2 26之前叫 回到正题 由题可知 题目要求在用户自己输入的定整数M和N区间内求出素数的个数 并且对他们求和 要想解决编程题目 首先要知道题目问的是什么 素数一般指质数 质数是指在大于1的自然数中 除了1和它本身以外不再
  • 版本控制之最佳实践(Git版)

    现如今 应该每个开发者都在使用版本控制工具了吧 然而 如果你理解版本控制的基本规则 你便能更好地发挥它的效用 在此 我们汇总了一些最佳实践 希望你在使用Git做版本控制时能够了然于心 得心应手 1 相关的改动才放一起提交 一次提交 git