当前位置: 首页 > 编程日记 > 正文

Git的其他用法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

目录:

  • 减少【.git】文件夹的大小和文件数
  • 更换git for windows的文本编辑器
  • 修改已经提交的commit说明
  • 合并commit
  • 解决merge时出现的冲突
  • 回退一个merge
  • 获取某一commit的修改
  • 将低版本push到Github(删掉高版本Commit)

减少【.git】文件夹的大小和文件数

随着commit次数的增多,.git文件夹的文件数和文件夹大小都会不断增大。

虽然对于小项目,增大的速度极慢,文件夹也基本在10M左右。但如果你和我一样,想减少该文件夹的文件数目(通常不少),可以试试这个命令。当然,git是鼓励你多使用这个命令的。见:Git - git-gc Documentation

Users are encouraged to run this task on a regular basis within each repository to maintain good disk space utilization and good operating performance.

如何减少?特别简单,就是你进入到一个repository,也就是你项目的根目录,执行 git gc 就行了。

我们来看看执行gc命令前后的对比:

运行 git gc 前:

809218-20170115214601697-480279175.jpg

运行 git gc 后:

809218-20170115214607510-1147295395.jpg

文件夹大小变化不大。变化最大的是文件数目(2561 -> 37)和文件夹数(274 -> 18)。

要讲清楚这个命令,涉及到了git是如何存储你的commit。这就要说到快照(Snapshot)

我们先看看git的官方说明:直接记录快照,而非差异比较

每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。

那么问题来了:什么是快照?

来实际感受一下:

首先我准备了一个大的文件,这样比较能说明问题。刚好今天整理一个文件,有55.3MB,就顺手拿来用了。

809218-20170115230551416-1794822309.jpg

809218-20170115230250728-753466185.jpg

可以看到,源文件是55.3MB,而将其添加到仓库里后,仓库的大小变为46.3MB。这相当于是将整个文件复制到里面去。

如果这还不能说明问题,再来一次。我删除了文件里的一大部分内容,将其减小至20.5MB。再将其提交到仓库里面。

809218-20170115230554228-184799821.jpg

809218-20170115230257994-32768218.jpg

增加了19MB,跟20.5MB很接近。

你可以在 .git\objects\某个文件夹 里找到这两份快照。

809218-20170115232333431-1122489419.jpg

809218-20170115232336666-222754137.jpg

于是我们可以得出一个近似的结论:在git中,一份快照就是你当前工作目录的状态。当你使用add命令时,它将你当前工作目录的文件进行压缩,形成一份快照。

不过,如果你有一些文件完全没有被修改过,它只保存指向之前版本的引用。这样可以减少快照所占用的空间。这里没有试验,但是官方对此有说明:
To be efficient, if files have not changed, Git doesn’t store the file again, just a link to the previous identical file it has already stored.

那么这个时候我们再去执行 git gc ,会变成什么样呢?

809218-20170115232735088-54497085.jpg

809218-20170115233041025-752982170.jpg

之前说的三个方面都有减少。

我们再看看.git\objects里的文件夹(事先不知道它会删除文件夹,没有截图。。)

809218-20170115233042431-557552073.jpg

可以看到我们上面快照所在文件,即02f7文件夹已经不在objects这个文件夹里面了。(info和pack两个文件夹一直都在那里)

点进pack文件夹:

809218-20170115233708353-128671852.jpg

.git 文件夹的46.5M都在这里了。所以我们可以知道,git将之前两个文件夹的快照文件合并到一起了。


更换git for windows的文本编辑器

git for windows默认使用vim作为文本编辑器,为此我专门写了篇vim的基本操作:vim编辑器的简单使用

如果你不想学习vim的使用,也可以把它换掉。

例如我想把它换成atom:

  1. 先找到启动atom的exe文件的路径。我的在 C:\Users\Schaepher\AppData\Local\atom\app-1.13.0\atom.exe
  2. 启动git for windows,执行git config --global core.editor "C:/Users/Schaepher/AppData/Local/atom/app-1.13.0/atom.exe --new-window --foreground --wait"

    注意,这里路径的斜杠与Windows显示的相反,这是Linux的路径格式。
    后面一串参数--new-window --foreground --wait是由各编辑器自己指定的。如果不这样指定,执行git rebase -i commitId^的时候会直接退出编辑。


修改已经提交的commit说明

先用git log查看commit信息:

809218-20170113151046056-967795774.png

我打算更改下面那个commit,使用git rebase -i 版本号^

809218-20170113151243947-791803325.png

执行命令后,会进入这样的界面:

809218-20170113151051103-1707647553.png

它把我们传入的版本号之上的commit条目都显示出来了,这里只关注我们要改的那一条。将第一个pick修改为reword,保存并退出。

过一会儿,它会再进入这样的界面:

809218-20170113151055353-1678885020.png

将第一行的Android的ListView改为这个更改后的message,保存并退出。

再用git log查看:

809218-20170113151102556-1969555440.png

不仅commit message被更改了,从被更改的commit开始,commit id都会重新生成。


合并commit

先用git log查看commit信息:

809218-20170113213803260-630487490.png

如果你想把最近的四个commit合并成一个commit,有两种方法。一种是用git reset --soft d7ac,在git commit -m "新的commit message",另一种是用git rebase。接下来讲第二种。

首先根据上图的commit id,我想把afe14f之后的commit合并到afe14f里面,执行 git rebase -i afe14f^。进入编辑界面:

809218-20170113223346978-204618168.png

根据提示,squash会把所在的commit合并到前一个commit上面。我们要合并到afe14f,所以修改后三个。而在合并之后,我们需要修改afe14f的commit message,所以使用reword

你也可以用缩写,比如squash的缩写是s。而reword的缩写是s

809218-20170113223351416-502078337.png

保存并退出,会进入下一个界面。修改第一行的commit message,即reword的那个message,为添加Android学习笔记,特别是ListView的介绍;添加对git commit的修改教程。如下图:

809218-20170113223355588-2133522629.png

保存并退出。自动进入下一个界面:

809218-20170113223358525-387095125.png

此时要将其他三个message去掉,只要在那三行前面加#就行了。如下图:

809218-20170113223401775-1494057357.png

保存并退出,等待git处理完成。

再次使用git log查看commit信息:

809218-20170114002320525-763331490.png

完成!

这里貌似可以不使用reword,待实验。


解决merge时出现的冲突

当你和其他团队成员对同一个文件进行修改后,merge的时候有可能会出现冲突。你可以打开每个冲突的文件,手工解决冲突;也可以借助冲突处理工具来解决冲突。这里分别介绍这两种方式:

  1. 手工解决冲突

    冲突提示如下图所示:

    809218-20151116223930593-1760266962.png

    CONFLICT表示有冲突,在这一行的末尾,显示冲突文件。这里有两个文件冲突,分别是README.md和app.iml
    这里以README.md为例,解决冲突:

    809218-20151116223851718-48866874.png

    被红框框住的符号 ======= 是冲突的分割线。

    <<<<<<< HEAD 和分割线之间的是本地的文本,分割线和 >>>>>>> upstream/dev 之间的是远程分支的文本

    你可以选择保留其中一个版本的文本,然后将三个冲突符号都删除。这样表示已解决冲突。如果你想同时保留两个版本,那么只需将冲突符号删除。

    解决冲突后如下图所示:

    809218-20151116223256608-2077380872.png

  2. 借助冲突处理工具
    个人认为Meld这个工具比较好用,Android Studio自带的冲突处理工具和它很相似。我用过tortoisegit的工具,感觉没有Meld好用,这里就不介绍了。

    (1) 首先去Meld的官网下载安装文件并安装。->点此进入Meld官网

    (2) 安装完后,打开你的git工具,比如msysgit。执行 git config --edit --global ,此时会打开一个配置文件。在文件最后添加以下四行:

        [merge]  tool = meld  [mergetool "meld"] path = e:/software/MeldMergeTool/Meld.exe  

    提示:path是根据你安装Meld的路径来决定的,同时要把路径中的 \ 改成 / 。从上面可以看出我的安装路径为 e:\software\MeldMergeTool\ 。

    (3) 在merge的时候,如果出现冲突,运行命令 git mergetool 这时就会打开Meld。

    (4) Meld的界面如下:

    809218-20151129212715813-1728290775.png

    冲突的地方会显示红色,如果你想保留本地的代码,则点击左边的  箭头。

    把所有红色(冲突)区域解决后,可以根据实际情况去解决绿色(添加)和灰色(更改)。

    一般保存中间的修改就行。如上图红框处。


回退一个merge

  1. 如果是merge一个GitHub的Pull Request,可以进入要回退的那个Pull Request,在下面有一个revert按钮,可以用来revert一个Pull Request。如下图红框处:

    809218-20151129214048063-2138029364.png

  2. 在命令行里revert

    (1)用 git log 看commit记录

    809218-20151116223326421-1380239590.png

    现在我们要回退 commit 561dab (也就是图中第一个commit),该commit将Pull Request #113 merge到项目中。

    (2)使用 git revert HEAD -m 1 命令回退

    809218-20151116223335155-387212738.png

    如果是非merge的回退,用 git revert 版本号 就行了。但是这里是对merge操作进行revert,需要加上参数 -m。命令最后加个 1

    为什么要加上 1 呢?看上面(1)的图中的第二个红框,这个 1 对应红框中的 6a3c30c 版本。而如果填 2 ,则对应 b7831df 。

    继续看log,会发现 6a3c30c 是merge这个Pull Request之前的状态。而 b7831df 则是当前版本之前的一个merge。

    输入命令回车后,会跳出一个文本。

    809218-20151116223342436-540832725.png

    目前无视它就行。关闭文本,回到shell,回车。

    809218-20151116223354858-2073416423.png

    回退成功!这个回退不会删除掉中间的commit记录,而是将这次revert作为一个commit加到commit记录上面。


获取某一commit的修改

假设有commit a b c ,从左到右,c 为最新版。
这时你发现 b 的一个修改有问题,想回退到 a 。但是如果回退到 a , c 的commit也会被取消。
这时可以用 git cherry-pick 版本号 这个命令获取 c 的commit。

下图是示例的log记录,从①可以看出,这里从②回退到⑤。

809218-20151118150019671-1870975439.png

现在我想获取④的commit。使用 git cherry-pick 版本号 将选定版本的提交合并到当前版本。

809218-20151118150026327-2034885343.png


将低版本push到Github(删掉高版本Commit)

有时候会因为各种原因,想要回退版本。如果没有关联Github或者没有push上去,那问题不大。但是如果你已经push到Github上了,这时候就比较尴尬了,因为普通的push是会被Github拒绝的。虽然Github提供了Revert功能,但是这并不能完全消去一个commit。

先看看reset后被拒绝的样子:

809218-20160604212640196-641381418.png

解决方法就是:

  1. 先用 git reset --hard 版本号 回到你想要的版本
  2. 执行 git push --force
    809218-20160604212746321-1639371739.png

    再看看Github:

    809218-20160604212804867-1594519594.png

    当然,一般是推荐用 git push origin HEAD --force 的,能防止因为其他没配置好而产生错误。对我来说差别并不大……

转载于:https://my.oschina.net/liuh1988/blog/3001906

相关文章:

UE中的几个极有用功能

1. 指定目录和文件类型批量查找目标字符串 示例&#xff1a;在H:\qtdemo目录&#xff08;含子目录&#xff09;中下的*.h和*.cpp中&#xff0c;查找“main”字符串 查找结果&#xff1a; 2. 在当前活动窗口中查找目标字符串&#xff08;Ctrl F&#xff09; &#xff08;1&…

Missing space before value for key ‘routes‘ key-spacing

vue项目报错&#xff1a; Missing space before value for key ‘routes’ key-spacing 解决办法&#xff1a; 字母new前面应该是1个空格&#xff0c;我写了两个空格&#xff0c;删去一个空格即可

Oracle Mutex 机制 说明

之前也整理过一篇文章来说明Oracle Lock的&#xff0c;参考&#xff1a; 锁 死锁 阻塞 Latch 等待 详解 http://blog.csdn.net/tianlesoftware/archive/2010/08/19/5822674.aspx 在这篇文章里&#xff0c;提到了System Locks&#xff0c;它包含&#xff1a; &#xff08;1&…

POJ-1860-Currency Exchange

链接&#xff1a;https://vjudge.net/problem/POJ-1860 题意&#xff1a; 有N个点&#xff0c;支持货币兑换&#xff0c;从货币a->b手续费c&#xff0c;汇率r。 求能否换一圈使总净额增加。 思路&#xff1a; bellman-ford。 找一个正权回路。 代码&#xff1a; #include &l…

如果asp.net mvc中某个action被执行了两次,请检查是不是以下的原因

注释 <link rel"icon" href"#"> 这一句后试试转载于:https://www.cnblogs.com/lummon/p/4559185.html

vue常见错误汇总(自看)

解决办法汇总 eslint: Expected indentation of 2 spaces but found 4缩进报错 &#xff0c;所有缩进只能用两个空格 Newline required at end of file but not found需要在最后的后面再加一行!!! Missing space before value for key ‘name’在关键字“值”之前缺少空格 …

IOS的钥匙串,确保本地隐私数据的安全

* 苹果的"生态圈"&#xff0c;钥匙串访问&#xff0c;使用 AES 256 加密算法&#xff0c;能够保证用户密码的安全 * 钥匙串访问SDK&#xff0c;是苹果在 iOS 7.0.3 版本以后公布的 * 钥匙串访问的接口是纯 C 语言的&#xff0c;但是&#xff0c;网络上有框架把它封装…

【转】PendingIntent的总结

Intent和PendingIntent的关系&#xff0c;初学的时候很迷惑&#xff0c;用PendingIntent的时候&#xff0c;还会出现奇怪的问题&#xff0c;比如无法传递数据&#xff0c;无法更新数据&#xff0c;所以我集众家之长&#xff0c;加上我个人的一些实践&#xff0c;总结如下&#…

CentOS 7 安装 GlusterFS

目录 环境说明&#xff1a; 3台机器安装 GlusterFS 组成一个集群。 使用 docker volume plugin GlusterFS 服务器&#xff1a; 10.6.0.140 10.6.0.192 10.6.0.196转载于:https://www.cnblogs.com/MeiCheng/p/10274222.html

npm安装less报错 rollbackFailedOptional: verb npm-session

解决办法 在cmd中依次输入然后回车 &#xff08;1&#xff09; npm install -g cnpm --registryhttps://registry.npm.taobao.org &#xff08;2&#xff09; cnpm install less less-loader --save-dev

Online Judge上陪审团选人问题用Java实现的一个AC解

原问题位于&#xff1a;http://poj.org/problem?id1015 以下为问题描述的摘录&#xff1a; In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the general public. Every time a trial is set to begin, a j…

【D3】transition API

摘要&#xff1a; 动画类API 一、API 使用 1. 1 d3.ease 1.2 d3.timer Start a custom animation timer, invoking the specified function repeatedly until it returns true. There is no way to cancel the timer after it starts, so make sure your timer function return…

微信小程序 - 富文本图片宽度自适应(正则)

引言&#xff1a;在微信小程序里&#xff0c;比如商品展示页面的商品详情会有图片展示&#xff0c;PC端设置的商品详情是PC端的宽度&#xff0c;所以在小程序里图片会显示不全&#xff0c;这时就应该做相应的处理&#xff0c;使小程序里图片显示正确 思路 把图片的宽度改为手机…

(1)01背包问题

#include <stdio.h> #define N 6 #define M 21 #define W 20 int dp[N][M]; int w[N] {0}; int v[N] {0}; void knapsack(){int i, j;int value1, value2;for(i 1; i < N; i){ // 前i件物品for(j 1; j < N; j){ // 背包剩余空间if(w[i] > j){ // 第i件物品太…

Web.Config文件配置之限制上传文件大小和时间

在邮件发送系统或者其他一些传送文件的网站中&#xff0c;用户传送文件的大小是有限制的&#xff0c;因为这样不但可以节省服务器的空间&#xff0c;还可以提高传送文件的速度。下面介绍如何在Web.Config文件中配置限制上传文件大小与时间。 在Web.Config文件中配置限制上传文件…

成为软件高手的几个忌讳

1&#xff09; 不会英语&#xff1a;CS源于美国&#xff0c;重量级的文档都是英文的。不会英语&#xff0c;那么你只能忍受拙劣的翻译和大延迟的文档&#xff08;翻译出来的文档几乎都是很久以前出版的东西&#xff09;。2&#xff09; 急于求成&#xff1a;什么都没学习就开始…

Linux下的redis的持久化,主从同步及哨兵

redis持久化 Redis是一种内存型数据库&#xff0c;一旦服务器进程退出&#xff0c;数据库的数据就会丢失&#xff0c; 为了解决这个问题&#xff0c;Redis提供了两种持久化的方案&#xff0c;将内存中的数据保存到磁盘中&#xff0c;避免数据的丢失。 RDB持久化 redis提供了RDB…

vue/require-v-for-key]Elements in iteration expect to have ‘v-bind:key‘ directives

报错内容&#xff1a;[vue/require-v-for-key]Elements in iteration expect to have v-bind:key directives.解决&#xff1a;加上v-bind:key"index"<p>主演:<!--显示电影主演&#xff0c;循环--><span v-for"(actor, index) in scope.row.act…

@Ignore_JUnit - Ignore Test

Ignore 用法很简单, 如果你的测试用例还没有准备好而不想被执行, 又不想删掉或注释掉, 可以使用 Ignore 标注来忽略测试。 方法一旦用 Ignore 注解了将不会被执行. 如果一个类用 Ignore 注解了 他下面的所有测试方法将不会被执行. 看个应用 Create a Class Create a java clas…

Redis5.0之Stream案例应用解读

2019独角兽企业重金招聘Python工程师标准>>> 非常高兴有机会和大家在这里交流Redis5.0之Stream应用。今天的分享更多的是一个抛砖引玉&#xff0c;欢迎大家提出更多关于Redis的思考。 首先&#xff0c;我们来个假设&#xff0c;这里有个杯子&#xff0c;这个杯子是去…

往阿里云服务器上安装Mysql

在安装完Mysql后要进行登录&#xff0c;这时候显示让你输密码&#xff0c; 我点击键盘发现怎么没有密码出现&#xff0c; 然后我就把Mysql卸载了重新装的&#xff0c;折腾了2个多小时&#xff0c; 最后&#xff0c;我突然想试试直接输密码然后就回车&#xff0c; 发现成功进入数…

PHP中spl_autoload_register函数的用法

spl_autoload_register(PHP 5 > 5.1.2)spl_autoload_register — 注册__autoload()函数说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活&#xff0c;则激活它们。如果在你的程序中已经实现…

Linux初步——常用简单命令

散乱的记录&#xff0c;目前是边学边用&#xff0c;以后有机会再整理 curl命令 发起一个HTTP请求&#xff0c;如&#xff1a;curl "http://www.baidu.com" 加上-I选项查看HTTP协议头的信息&#xff0c;如&#xff1a;curl "http://www.baidu.com" -I Linux…

Centos-Mysql配置my.cnf内容

#v1.0 [mysqld] #通用 #skip-grant-tables 跳过授权密码登录 port3306 #使用mysql系统账号操作进程 usermysql socket/var/lib/mysql/mysql.sock #basedir/usr datadir/var/lib/mysql #mysql错误日志 log_error /tmp/ch_mysql_log/error.log #mysql所有操作日志 生产服务器不…

本地navicat连接阿里云数据库

自己起连接名字&#xff1b; prot:填公网IP&#xff08;服务器给的&#xff09; password&#xff1a;填阿里云数据库的密码

adb logcat命令查看并过滤android输出log

adb logcat命令查看并过滤android输出log cmd命令行中使用adb logcat命令查看android系统和应用的log&#xff0c;dos窗口按ctrlc中断输出log记录。 logcat日志中的优先级/tag标记&#xff1a; android输出的每一条日志都有一个标记和优先级与其关联。 优先级是下面的字符&…

重读TCP协议(3)

重读TCP协议&#xff08;3&#xff09; TCP 的数据流TCP的数据流大致可以分为两类&#xff0c;交互数据流与成块的数据流。交互数据流就是发送控制命令的数据流&#xff0c;比如relogin&#xff0c;telnet&#xff0c;ftp命令等等&#xff1b;成块数据流是用来发送数据的包&…

拥有2000家门店,他如何晋升为服装界的新宠?

—— iwarm3.0加热组件、碳纳米管膜炎、管状石墨结构体...你看到并不是一款高科技电子产品&#xff0c;这是快鱼服饰在这个冬天推出的黑科技产品 - 智能温控羽绒服。 在竞争激烈的服装行业&#xff0c;快鱼&#xff08;Fast Fish&#xff09;将“快时尚”的理念推广至全国&…

navicat连接云数据库报错2003,2005

一开始报2003&#xff0c;好吧&#xff0c;是Mysql挂掉了&#xff0c; 然后重启Mysql服务 systemctl restart mysqld.service #重启 mysql然后再连接&#xff0c;报错2005&#xff0c; 好吧&#xff0c;是复制ip的时候多了一个空格&#xff0c;再输入一次即可 我服了。

基础学习总结(四)--SQLite

1. SQLiteDatabase操作SQLite数据库的类。可以执行SQL语句&#xff0c;对数据库进行增、删、查、改的操作。也可以进行transaction的控制。很多类对数据库的操作最终都是通过SQLiteDatabase实例来调用执行的。需要注意的是&#xff0c;数据库对于一个应用来说是私有的&#xff…