Git 使用规范流程

团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。

否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。

下面是ThoughtBot 的Git使用规范流程。我从中学到了很多,推荐你也这样使用Git。

第一步:新建分支

首先,每次开发新功能,都应该新建一个单独的分支(这方面可以参考《Git分支管理策略》)。

# 获取主干最新代码
$ git checkout master
$ git pull
# 新建一个开发分支myfeature
$ git checkout -b myfeature

第二步:提交分支commit

分支修改后,就可以提交commit了。

$ git add --all
$ git status
$ git commit --verbose

git add 命令的all参数,表示保存所有变化(包括新建、修改和删除)。从Git 2.0开始,all是 git add 的默认参数,所以也可以用 git add . 代替。

git status 命令,用来查看发生变动的文件。

git commit 命令的verbose参数,会列出 diff 的结果。

第三步:撰写提交信息

提交commit时,必须给出完整扼要的提交信息,下面是一个范本。

Present-tense summary under 50 characters

* More information about commit (under 72 characters).

* More information about commit (under 72 characters).

http://project.management-system.com/ticket/123

第一行是不超过50个字的提要,然后空一行,罗列出改动原因、主要变动、以及需要注意的问题。最后,提供对应的网址(比如Bug ticket)。

第四步:与主干同步

分支的开发过程中,要经常与主干保持同步。

$ git fetch origin
$ git rebase origin/master

第五步:合并commit

分支开发完成后,很可能有一堆commit,但是合并到主干的时候,往往希望只有一个(或最多两三个)commit,这样不仅清晰,也容易管理。

那么,怎样才能将多个commit合并呢?这就要用到 git rebase 命令。

$ git rebase -i origin/master

git rebase命令的i参数表示互动(interactive),这时git会打开一个互动界面,进行下一步操作。

下面采用Tute Costa的例子,来解释怎么合并commit。

pick 07c5abd Introduce OpenPGP and teach basic usage
pick de9b1eb Fix PostChecker::Post#urls
pick 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend
# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

上面的互动界面,先列出当前分支最新的4个commit(越下面越新)。每个commit前面有一个操作命令,默认是pick,表示该行commit被选中,要进行rebase操作。

4个commit的下面是一大堆注释,列出可以使用的命令。

  • pick:正常选中
  • reword:选中,并且修改提交信息;
  • edit:选中,rebase时会暂停,允许你修改这个commit(参考这里)
  • squash:选中,会将当前commit与上一个commit合并
  • fixup:与squash相同,但不会保存当前commit的提交信息
  • exec:执行其他shell命令

上面这6个命令当中,squash和fixup可以用来合并commit。先把需要合并的commit前面的动词,改成squash(或者s)。

pick 07c5abd Introduce OpenPGP and teach basic usage
s de9b1eb Fix PostChecker::Post#urls
s 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend

这样一改,执行后,当前分支只会剩下两个commit。第二行和第三行的commit,都会合并到第一行的commit。提交信息会同时包含,这三个commit的提交信息。

# This is a combination of 3 commits.
# The first commit's message is:
Introduce OpenPGP and teach basic usage
# This is the 2nd commit message:
Fix PostChecker::Post#urls
# This is the 3rd commit message:
Hey kids, stop all the highlighting

如果将第三行的squash命令改成fixup命令。

pick 07c5abd Introduce OpenPGP and teach basic usage
s de9b1eb Fix PostChecker::Post#urls
f 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend

运行结果相同,还是会生成两个commit,第二行和第三行的commit,都合并到第一行的commit。但是,新的提交信息里面,第三行commit的提交信息,会被注释掉。

# This is a combination of 3 commits.
# The first commit's message is:
Introduce OpenPGP and teach basic usage
# This is the 2nd commit message:
Fix PostChecker::Post#urls
# This is the 3rd commit message:
# Hey kids, stop all the highlighting

squash和fixup命令,还可以当作命令行参数使用,自动合并commit。

$ git commit --fixup 
$ git rebase -i --autosquash

这个用法请参考这篇文章,这里就不解释了。

第六步:推送到远程仓库

合并commit后,就可以推送当前分支到远程仓库了。

$ git push --force origin myfeature

git push命令要加上force参数,因为rebase以后,分支历史改变了,跟远程分支不一定兼容,有可能要强行推送(参见这里)。

第七步:发出Pull Request

提交到远程仓库以后,就可以发出 Pull Request 到master分支,然后请求别人进行代码review,确认可以合并到master。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle安装静默

安装环境:centos71、修改主机名 /etc/sysconfig/network#HOSTNAMEoracledb.012、修改ip和对应的主机名 /etc/hosts#10.5.1.190 oracledb.013、关闭Selinux /etc/selinux/config#SELINUXdisabled4、参考官方文档安装依赖的软件包 binutils-2.23.52.0.1-12.el7.x86_64…

[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)

通过介绍世界上最受欢迎的编程语言之一掌握Java编程概念 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了一个极端的报价 。 我们提供的《 Ultimate Java Development and Certification Guide 》 仅售20美元,而…

python浅拷贝的说法_Python中List的复制(直接复制、浅拷贝、深拷贝)

直接赋值:如果用 直接赋值,是非拷贝方法。这两个列表是等价的,修改其中任何一个列表都会影响到另一个列表。old [1,[1,2,3],3]new []for i in range(len(old)):new.append(old[i])new[0] 3new[1][0] 3-----------------------Before:[1,…

AliOS-Things Visual studio code helloworld 入门

配置环境的时候别忘了下载:GCC工具链:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads AliOS Things 完成第一个应用:Hello World 全局掌控 从Git上下载源码用VSCode打开源码,查看源码的目录结构打开Hello…

java 联网_java网络

这个图很形象的展示了OSI的五层架构之间的关系。OSI被称为开放式互联,是国际标准组织制定的网络模型,本来是七层,后来把表现层和会话层加到应用层里面了。那么五层模型中的每一层具体都是干什么的呢?在标准的网络模型中&#xff0…

[小米OJ] 4. 最长连续数列

思路: 时间限制为O(n),即不能使用先排序后寻找的方法。 这里利用哈希表查询插入复杂度都为O(1)的特性来解,利用一个哈希表来保存每一个数字以及其所在数列的长度。 遍历每一个数字n:查询表中是否存在n-1和n1,若存在&am…

控制反转

控制反转[编辑] 维基百科,自由的百科全书控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Depe…

使用Mutability Detector对Java数据类的不变性进行单元测试

在我们所有的项目中,我们使用的数据类根据定义包含数据(字段),但不包含(业务)逻辑。 根据最佳编码实践,数据类最好应该是不可变的,因为不可变性意味着线程安全。 这里的主要参考是J…

三种单例模式的C++实现

简介 因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不…

centos安装Redis

vRedis的安装 ♛ 1.0 下载Rediswget http://download.redis.io/releases/redis-5.0.2.tar.gz ♛ 1.1 解压tar -zxvf redis-5.0.2.tar.gz ♛ 1.2 安装gcc依赖Redis是C实现的,需要gcc来进行编译,先安装gcc。 yum install gcc ♛ 1.3 打开Redis目录cd redis…

maven插件编写_编写Maven插件的提示

maven插件编写最近,我花了很多时间为Maven编写插件或在其中工作。 它们简单,有趣且有趣。 我以为我会分享一些技巧,使编写它们时的生活更轻松。 提示1:将任务与Mojo分开 最初,您将把mojo的所有代码放入mojo的类&…

e3是合法浮点数吗_下列哪些是不合法的浮点数的选项是 123 2e4.2 .e5 -e3 .234 1e3

共回答了16个问题采纳率:93.8%浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法.由此可以看出…

VC的Win32控制台程序中使用MFC库文件

如果想要在VC中的Win32控制台程序中使用CString类&#xff0c;应注意下列情况&#xff1a; 1.必须包含头文件#include <afx.h> 2.Project ----settings... ----General---- Microsoft Foundation Classes: Use MFC in a Shared DLL

java能否调用com_java调用com

一、C#写com组件开发环境 vs20051、新建工程:ClassLibrary1 //根据自己需要取工程名2、右键点击工程->应用程序->程序集信息->使程序集com可见&#xff0c;打上勾右键点击工程->生成->为com Interop注册 打上勾3、设置强签名打开Visual Studio Command Pr…

JUnit规则–引发异常时执行附加验证

在本文中&#xff0c;我将快速向您展示如果您需要解决以下挑战&#xff0c;那么JUnit规则有多方便 方法捕获异常并必须执行一些额外的任务&#xff0c;然后再抛出或引发包装异常。 调用额外任务和引发的异常应通过单元测试进行验证。 这意味着您有一些这样的代码 public cla…

十分钟搞清字符集和字符编码

什么是字符集 什么是字符编码 UTF-8和Unicode的关系 UTF-8编码简介 为什么会出现乱码 如何识别乱码的本来想要表达的文字 常见问题处理之Emoji 本文将简述字符集&#xff0c;字符编码的概念。以及在遭遇乱码时的一些常用诊断技巧 背景&#xff1a;字符集和编码无疑是IT菜鸟甚至…

前端Ajax/JS/HTML+后端SpringMVC(二)

1. jQuery AJAX 1.1. jQuery框架中的ajax()函数 在应用了jQuery框架后&#xff0c;调用ajax()函数即可发出AJAX请求&#xff0c;并获取响应结果&#xff0c;该函数的参数必须是JSON对象&#xff0c;通常&#xff0c;在JSON对象中封装的属性有&#xff1a; url&#xff1a;处理请…

java lambda函数_番石榴函数和Java 8 Lambdas

java lambda函数我最近阅读了Brian Goetz的《 Lambda的状况》 &#xff0c;在阅读了该文章之后&#xff0c;我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类&#xff0c;其中ActionListener是规…

c++组合 聚合 关联

组合和聚合区别(不能脱离整体 能脱离整体) 组合&#xff1a;&#xff08;表示两个对象之间是整体和部分的强关系&#xff0c;部分的生命周期不能超越整体。如人和脑袋&#xff09; 比如A类中包含B类的一个引用b&#xff0c;当A类的一个对象消亡时&#xff0c;b这个引用所指向的…

python内建时间模块 time和datetime

时间模块 UTC&#xff08;Coordinated Universal Time&#xff0c;世界协调时&#xff09;亦即格林威治天文时间&#xff0c;世界标准时间。在中国为UTC8。DST&#xff08;Daylight Saving Time&#xff09;即夏令时。 在Python中,通常有这几种方式来表示时间&#xff1a;1&…