今天是Git系列课程第五课,上一课我们做了Git本地提交前的准备工作,今天痞子衡要讲的是Git本地提交操作。

  当我们在仓库工作区下完成了文件增删改操作之后,并且使用git add将文件改动记录在暂存区之后,便可以开始将其提交到Git本地仓库。

1.本地文件改动提交git commit

  Git空间本地的改动完成之后可以直接提交,有如下三种提交命令选项:

1.1将暂存区内容提交git commit -m ["description"]

  暂存区里目前只有app/app.c文件,我们先将其提交至仓库。

// 将暂存区里所有改动提交到本地仓库,提交标题为"Initial application"

jay@pc MINGW64 /d/my_project/gittest (master)

$ git commit -m "Initial application"

[master 0a0c0fc] Initial application
1 file changed, 7 insertions(+)
create mode 100644 app/app.c

// 查看本地提交日志,确认提交是否已记录在仓库中

jay@pc MINGW64 /d/my_project/gittest (master)

$ git log

commit 0a0c0fcec8a1ef56bfc6a24e68bbf1436b2ef2cf (HEAD -> master)
Author: Jay Heng <hengjie1989@foxmail.com>
Date: Sat Mar 10 21:58:36 2018 +0800 Initial application commit 867df08b4e13649e30926b483279dddce32750c2 (origin/master, origin/HEAD)
Author: Jay Heng <hengjie1989@foxmail.com>
Date: Sat Mar 10 20:11:04 2018 +0800 second commit

1.2追加提交git commit --amend -m ["description"]

  工作区里面还有app/test.c文件处于Untracked状态,我们想将其也加到1.1的提交里合并成一个提交。

// 将Untracked状态的test.c文件添加到暂存区,用于新提交

jay@pc MINGW64 /d/my_project/gittest (master)

$ git add app/test.c

// 将暂存区里新改动追加提交到本地仓库,与上一次提交进行合并,并修改提交标题为"Initial application and test"

jay@pc MINGW64 /d/my_project/gittest (master)

$ git commit --amend -m "Initial application and test"

[master 589f65b] Initial application and test
Date: Sat Mar 10 21:58:36 2018 +0800
2 files changed, 7 insertions(+)
create mode 100644 app/app.c
create mode 100644 app/test.c

// 查看本地提交日志,确实两次提交被合并成了一个

jay@pc MINGW64 /d/my_project/gittest (master)

$ git log

commit 589f65b386dd4475bb884c40ea1441d8449fdcd1 (HEAD -> master)
Author: Jay Heng <hengjie1989@foxmail.com>
Date: Sat Mar 10 21:58:36 2018 +0800 Initial application and test commit 867df08b4e13649e30926b483279dddce32750c2 (origin/master, origin/HEAD)
Author: Jay Heng <hengjie1989@foxmail.com>
Date: Sat Mar 10 20:11:04 2018 +0800 second commit

1.3非Untracked文件的改动全部提交git commit -a -m ["description"]

  我们新增一个名叫platform.c空白文件,并将其git add到暂存区;且对已提交的空白test.c文件修改恢复其一开始的内容。此时我们工作区(test.c)和暂存区(platform.c)均存在文件改动。有没有可能一次性将test.c和platform.c改动提交上去,答案当然是有。

// 将platform.c改动添加到暂存区

jay@pc MINGW64 /d/my_project/gittest (master)

$ git add app/platform.c

// 查看Git空间当前状态,test.c改动在工作区,platform.c改动在暂存区

jay@pc MINGW64 /d/my_project/gittest (master)

$ git status

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits) Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: app/platform.c Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) modified: app/test.c

// 将Git空间内非Untracked改动之外的所有改动(无论是工作区/暂存区)一次性提交到本地仓库,此处为test.c和platform.c

jay@pc MINGW64 /d/my_project/gittest (master)

$ git commit -a -m "Add initial platform and update test"

[master 610feaf] Add initial platform and update test
2 files changed, 6 insertions(+)
create mode 100644 app/platform.c

// 查看Git空间当前状态,没有任何改动记录,说明test.c和platform.c改动已被提交到仓库

jay@pc MINGW64 /d/my_project/gittest (master)

$ git status

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits) nothing to commit, working tree clean

// 查看本地提交日志,又多了一次名为"Add initial platform and update test"的新提交

jay@pc MINGW64 /d/my_project/gittest (master)

$ git log

commit 610feafbf5264b66dd0515f90cce79169aebd995 (HEAD -> master)
Author: Jay Heng <hengjie1989@foxmail.com>
Date: Sun Mar 11 07:46:16 2018 +0800 Add initial platform and update test commit 589f65b386dd4475bb884c40ea1441d8449fdcd1
Author: Jay Heng <hengjie1989@foxmail.com>
Date: Sat Mar 10 21:58:36 2018 +0800 Initial application and test

  需要注意的是git commit -a虽然是-all的简写,但其并不是将Git空间内所有改动全部提交,其不会提交工作区里新建的文件(Untracked状态)。

2.补丁包方式提交

  Git是分布式版本控制系统,一个项目常常由多个人一起开发,有时候我们想把本地的改动交给别人去完成提交,传统的做法是把你改动的所有文件全部提取出来打包发送给对方,但显然这样做比较繁琐,而且你的提交描述也容易丢失。Git提供了一种很好方式解决这个需求,即生成一个patch,这个patch就是你本地的一次提交的所有信息,你只需要把这个patch发给别人就可以了。

2.1生成补丁包git format-patch

  git format-patch命令是以本地提交为基础的,让我们先看看目前本地有多少提交:

// 图形化方式查看本地仓库里的历史提交,共记录4个提交

jay@pc MINGW64 /d/my_project/gittest (master)

$ gitk

  由上图可知,仓库里一共有4次提交,其中两次已推送到远程,还有两次在本地未推送:

2.1.1指定任意单个提交git format-patch -1 [commit]

  让我们试着将"Initial application and test"这个提交生成patch:

// 将SHA-1号前7位为589f65b的提交生成一个patch

jay@pc MINGW64 /d/my_project/gittest (master)

$ git format-patch -1 589f65b

0001-Initial-application-and-test.patch

  此时在gittest仓库目录下便可以看到生成的.patch文件,让我们用文本编辑器打开它看一看,确实包含了这个提交的所有改动。

From 589f65b386dd4475bb884c40ea1441d8449fdcd1 Mon Sep 17 00:00:00 2001
From: Jay Heng <hengjie1989@foxmail.com>
Date: Sat, 10 Mar 2018 21:58:36 +0800
Subject: [PATCH] Initial application and test ---
app/app.c | 7 +++++++
app/test.c | 0
2 files changed, 7 insertions(+)
create mode 100644 app/app.c
create mode 100644 app/test.c diff --git a/app/app.c b/app/app.c
new file mode 100644
index 0000000..20fe868
--- /dev/null
+++ b/app/app.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include <stdlib.h>
+int main(void)
+{
+ printf("hello world\n");
+ return 0;
+}
\ No newline at end of file
diff --git a/app/test.c b/app/test.c
new file mode 100644
index 0000000..e69de29
--
2.16.2.windows.1

2.1.2当前提交之前n个提交git format-patch -n

  如果一次想把本地未推送的提交全部生成patch,也可以试试-n参数,-1代表生成最近的一次提交的patch,-2代表生成最近两次提交的patch,以此类推。这个参数也可以用HEAD替换,HEAD^ 等效于-1,HEAD^^等效于-2,HEAD~n等效于-n。

// 将最近3次提交全部生成patch

jay@pc MINGW64 /d/my_project/gittest (master)

$ git format-patch HEAD~3

0001-second-commit.patch
0002-Initial-application-and-test.patch
0003-Add-initial-platform-and-update-test.patch

// 依然是将最近3次提交全部生成patch

jay@pc MINGW64 /d/my_project/gittest (master)

$ git format-patch -3

0001-second-commit.patch
0002-Initial-application-and-test.patch
0003-Add-initial-platform-and-update-test.patch

2.1.3某个提交之后的所有提交git format-patch [commit]

  如果你觉得用-n参数显得有点繁琐,比如本地有很多个提交,你需要先往回数一共有多少个。还有一个方法是直接指定某个提交,以某个提交为基准往后的所有提交全部生成patch,比如我们以"second commit"为基准:

// 将SHA-1号前7位为867df08的提交之后的所有提交全部生成patch

jay@pc MINGW64 /d/my_project/gittest (master)

$ git format-patch 867df08

0001-Initial-application-and-test.patch
0002-Add-initial-platform-and-update-test.patch

2.2应用补丁包git am

  2.1.3节生成了2个补丁包,让我们试着用一下这两个补丁包,在用之前我们需要先把本地仓库中这两次提交撤销并且也不保留在工作区(即完全删除)。

// 将最近两次提交在仓库里直接删除,不留痕迹

jay@pc MINGW64 /d/my_project/gittest (master)

$ git reset --hard HEAD~2

HEAD is now at 867df08 second commit

// 查看本地提交日志,确实最近两次提交已被删除

jay@pc MINGW64 /d/my_project/gittest (master)

$ gitk

jay@pc MINGW64 /d/my_project/gittest (master)

$ git status

On branch master
Your branch is up to date with 'origin/master'. Untracked files:
(use "git add <file>..." to include in what will be committed) 0001-Initial-application-and-test.patch
0002-Add-initial-platform-and-update-test.patch nothing added to commit but untracked files present (use "git add" to track)

2.2.1指定单个补丁包git am [patch path]

  让我们试着将0001-Initial-application-and-test.patch打入我们的仓库。

// 将名为0001-Initial-application-and-test的patch文件打入仓库

jay@pc MINGW64 /d/my_project/gittest (master)

$ git am 0001-Initial-application-and-test.patch

Applying: Initial application and test

// 查看本地提交日志,确实patch已经进入仓库

jay@pc MINGW64 /d/my_project/gittest (master)

$ gitk

  细心的朋友可能会注意到,同一个patch在生成和打入的时候SHA-1号是不一样的,是的,Git会保证任何时候任何人在任何本地仓库生成的任何提交都是唯一的。

2.2.2指定目录下所有补丁包git am [patch dir/*.patch]

  让我们试着将gittest目录下的所有patch全部打入我们的仓库,需要注意的是由于2.2.1中已经将编号为0001 patch打入了仓库,所有我们需要先将这个patch文件删除,否则在打入的时候会报错。

// 将gittest目录下的所有patch文件全部打入仓库

jay@pc MINGW64 /d/my_project/gittest (master)

$ git am *.patch

Applying: Add initial platform and update test

// 查看本地提交日志,确实patch已经都进入仓库

jay@pc MINGW64 /d/my_project/gittest (master)

$ gitk

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:第一本Git命令教程(5)- 提交(commit/format-patch/am)的更多相关文章

  1. 痞子衡嵌入式:第一本Git命令教程(0)- 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家讲的是Git命令汇编,共12篇文章,循序渐进地介绍Git操作的完整过程. 在开始Git课程之前,需要先跟大家普及2个重要概念(四度空间.四种状 ...

  2. 痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)

    今天是Git系列课程第七课,上一课我们学会了查看Git本地历史提交,今天痞子衡要讲的是Git仓库的清理操作,一共4个命令,都是日常开发中非常实用的命令,掌握这4个命令,会让你有一种玩弄Git仓库于股掌 ...

  3. 痞子衡嵌入式:第一本Git命令教程(1)- 准备(init/config/.gitignore)

    今天是Git系列课程第一课,痞子衡给大家要讲的是创建仓库的准备工作. 1.建仓库git init 第一步是创建一个空仓库,这是一切操作的前提. // 打开git bash命令行,切换到指定目录下 ja ...

  4. 痞子衡嵌入式:第一本Git命令教程(3)- 变动(status/diff)

    今天是Git系列课程第三课,前两课我们都是在做Git仓库准备工作,今天痞子衡要讲的是如何查看Git空间内发生的改动. 本地有了仓库,我们便可以在仓库所在目录下做文件增删改操作,为了确定改动操作的正确性 ...

  5. 痞子衡嵌入式:第一本Git命令教程(4)- 转移(add/rm/mv)

    今天是Git系列课程第四课,上一课我们在Git空间里做了一些文件改动并且知道了如何利用Git查看这些变动,今天痞子衡要讲的是将这些变动提交到Git本地仓库前的准备工作. Git仓库目录下的文件改动操作 ...

  6. 痞子衡嵌入式:第一本Git命令教程(6)- 日志(log/reflog/gitk)

    今天是Git系列课程第六课,上一课我们学会了Git本地提交,今天痞子衡要讲的是如何查看Git本地历史提交. 当我们在仓库里做了很多次提交之后,免不了需要回看提交记录,看看自己之前的改动.有三种Git命 ...

  7. 痞子衡嵌入式:第一本Git命令教程(2)- 连接(remote/clone)

    今天是Git系列课程第二课,上一课我们已经学会在本地创建一个空仓库,痞子衡今天要讲的是如何将本地仓库与远程建立联系. 1.将本地仓库挂上远程git remote 本地建好了仓库,我们希望能够挂到远程服 ...

  8. 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> 历时 8 个月终于迎来了 v1.0 版发布,因为是第一个正式版,为了保证质 ...

  9. 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...

随机推荐

  1. # xrdp 在linux deploy 折腾记录

    xrdp 在linux deploy 折腾记录 1. xrdp connect fail vnc 不管用tiger or vnc4server都可以正常用,但xrdp无法连接 netstat -tnl ...

  2. js判断时间段

    开始时间小于结束时间的判断,下面是封装号的方法,直接可以调用: var data = new Date(); var year = data .getFullYear(); //获取完整的年份(4位) ...

  3. PHP 经典有趣的算法收集(面试题)

    1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...

  4. 《SpringMVC从入门到放肆》十四、SpringMVC分组数据校验

    上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验. 一.什么是分组校验 校验规则是定义在实体中的,而同一个实体可以被多个Con ...

  5. VS启动Winform项目提示:不支持互操作调试

    64 位平台不支持互操作调试(托管 + 非托管混合模式调试). 在VS中设置项目属性--->调试--->取消选中“启用本地代码调试”. 此问题在.NET FrameWork低版本框架会出现 ...

  6. oracle登录管理员创建数据库和表空间

    登录管理员最高权限账号 cmd输入sqlplus 回车,或者直接打开sqlplus 用户名:sys 密码:sys as sysdba 1.首先,创建(新)用户: create user usernam ...

  7. web测试实践——day01

    一.任务进展情况 主要是找寻网站的bug,分析bug的严重程度.同时找了本专业的同学进行博客园系统的使用. 二.存在的问题 由于上线的网站做的比较完善,导致找寻bug比较困难. 三.解决方法 对此我们 ...

  8. kali linux 网络渗透测试学习笔记(二)OWASP ZAP工具扫描SQL injection漏洞失败

    按照惯例,利用OWASP ZAP工具扫描SQL injection漏洞时,应该很快就可以扫描出来,但是在笔者进行扫描的时候,却遇到了以下状况: 这说明了该工具根本就没能够扫描出SQL注入的漏洞,不知道 ...

  9. ReactNative问题随记1 Exception in thread "main" java.lang.RuntimeException: gradle-2.14.1-all.zip

    ReactNative问题随记 想运行在真机上,在运行命令react-native run-android遇到错误如下: Scanning 559 folders for symlinks in D: ...

  10. 【安富莱】【RL-TCPnet网络教程】第11章 RL-TCPnet调试方法

    第11章      RL-TCPnet调试方法 本章节为大家讲解RL-TCPnet的调试方法,RL-TCPnet的调试功能其实就是通过串口打印实时监控运行状态.而且RL-TCPnet的调试设置比较简单 ...