目录:


减少【.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 前:

运行 git gc 后:

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

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

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

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

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

来实际感受一下:

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

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

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

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

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

于是我们可以得出一个近似的结论:在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 ,会变成什么样呢?

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

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

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

点进pack文件夹:

.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信息:

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

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

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

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

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

再用git log查看:

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


合并commit

先用git log查看commit信息:

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

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

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

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

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

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

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

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

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

完成!

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


解决merge时出现的冲突

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

  1. 手工解决冲突

    冲突提示如下图所示:

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

    这里以README.md为例,解决冲突:

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

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

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

    解决冲突后如下图所示:

  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的界面如下:

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

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

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


回退一个merge

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

  2. 在命令行里revert

    (1)用 git log 看commit记录

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

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

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

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

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

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

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

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


获取某一commit的修改

假设有commit a b c ,从左到右,c 为最新版。

这时你发现 b 的一个修改有问题,想回退到 a 。但是如果回退到 ac 的commit也会被取消。

这时可以用 git cherry-pick 版本号 这个命令获取 c 的commit。

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

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


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

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

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

解决方法就是:

  1. 先用 git reset --hard 版本号 回到你想要的版本

  2. 执行 git push --force

    再看看Github:

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

Git的其他用法的更多相关文章

  1. Eclipse Git和sourceTree用法

    Eclipse Git和sourceTree用法 Eclipse Git: 提交代码到git: 1.team->Repository->pull 若没有冲突: 2.team->com ...

  2. git的基本用法——我的日常使用

    git的基本用法 一,前言 网上有太多关于git的用法说明,而我看得云里雾里,可能是本人比较愚笨.平常时间老问别人又觉得很不好意思,估计大多的同学们都是自己解决.后来我想到了买一本书,淘宝上git书籍 ...

  3. Git merge && git rebase的用法

    Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m  “Merge from Dev”  Dev //-m可以加上m ...

  4. git clone、git pull和git fetch的用法及区别

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流.Git 常用命令速查表 最近在一个学习小组里学习AI的课程,我们所有的学习资料和homework都放在gitlab上.今天一个小队友从gitlab ...

  5. Git的一些用法

    三. Git的一些用法 1. .gitignore文件 屏蔽文件 : .gitignore文件是告诉Git哪些目录或者文件需要忽略, 这些文件将不被提交; 常用场景 : 写完代码后会执行变异调试等操作 ...

  6. git日常基本用法

    git作为项目管理现在已经是越来越广泛应用,结合自己平时的一些基本操作加上git说明文档里面的一些补充,我总结了一下git的基本用法: mkdir project # 创建项目目录 cd projec ...

  7. github+git提交 基础用法

    git版本管理基本用法: 安装就不用说了 随便一搜 安装完 妥妥的.下边说的是在github从新建一个项目开始: 1.首先打开自己的github地址,如下图所示 点加号 选 New repositor ...

  8. 问题: 查看某个文件的修改记录| git log 高级用法

    参考文章: git查看某个文件的修改历史 5.3 Git log 高级用法 基本步骤 git log --pretty=oneline [文件名] git show [节点] git log 两周高级 ...

  9. Git stash 常见用法

    Git stash git stash这个命令可以将当前的工作状态保存到git栈,在需要的时候再恢复 1.1 git stash  保存当前的工作区与暂存区的状态,把当前的工作隐藏起来,等以后需要的时 ...

  10. Git push 常见用法

        Git push 在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,g ...

随机推荐

  1. VS Code 快捷键使用小技巧

    相关文档 官方文档(英文版):Documentation for Visual Studio Code 中文文档(未完成):GitHub - jeasonstudio/CN-VScode-Docs: ...

  2. 浮动、清除浮动、BFC

    一. 浮动 1. 浮动的定义 使元素脱离文档流,按照向左或向右的方向移动,直到它的外边缘碰到包含它的框或另一个浮动框为止. 脱离文档流就是在页面中不占位置了. 左浮动右浮动此处就不再赘述了. 2. 看 ...

  3. [NOI2005]瑰丽华尔兹

    嘟嘟嘟 这题大家应该都做过,就是暴力dp+单调队列优化. dp方程其实很好想,最初是这样的:dp[t][i][j]表示时刻\(t\)后,走到\((i, j)\)格子的最远路程,于是就有: \[dp[t ...

  4. PHP中使用Elasticsearch

    PHP中使用Elasticsearch composer require elasticsearch/elasticsearch 会自动加载合适的版本!我的php是5.6的,它会自动加载5.3的ela ...

  5. 接上篇,php生成静态页面,加上页面时间缓存

    <?php require_once(dirname(__FILE__).'/include/config.inc.php'); ?> <?php $dosql->Execut ...

  6. leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)

    124. Binary Tree Maximum Path Sum https://www.cnblogs.com/grandyang/p/4280120.html 如果你要计算加上当前节点的最大pa ...

  7. 基于SaaS的企业数据隐私保护平台

    导读 WireWheel成立于2016年,总部位于华盛顿,该公司致力于降低数据隐私保护合规能力建设的难度,帮助企业来应对复杂.严厉的法案.条例规定.2018年10月,公司获得了PSP Growth领投 ...

  8. PAT A1121 Damn Single (25 分)——set遍历

    "Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...

  9. easyui datagrid JS加载样式 表头乱

    解决方案,找了下资料,加一个遮罩层,提升用户体验. <script type="text/javascript"> var width = document.docum ...

  10. <转>安全测试思维导图

    最近有监控到公司的某些系统在某些时间段出现大量的HTTP或者TCP连接,考虑到安全性,老大让我研究研究安全测试... 正好今晚从订阅的码农周刊(开发者头条)看到了一篇安全测试相关的帖子,做个搬运工,分 ...