Git的其他用法

上一篇 / 下一篇  2018-11-05 10:05:47 / 个人分类:操作系统

  减少【.git】文件夹的大小和文件数
  随着commit次数的增多,.git文件夹的文件数和文件夹大小都会不断增大。
  虽然对于小项目,增大的速度极慢,文件夹也基本在10M左右。但如果你和我一样,想减少该文件夹的文件数目(通常不少),可以试试这个命令。当然,git是鼓励你多使用这个命令的。见:Git-git-gcDocumentation
  
Usersareencouragedtorunthistaskonaregularbasiswithineachrepositorytomaintaingooddiskspaceutilizationandgoodoperatingperformance.
  如何减少?特别简单,就是你进入到一个repository,也就是你项目的根目录,执行gitgc就行了。
  我们来看看执行gc命令前后的对比:
  运行gitgc前:
  运行gitgc后:
  文件夹大小变化不大。变化最大的是文件数目(2561->37)和文件夹数(274->18)。
  要讲清楚这个命令,涉及到了git是如何存储你的commit。这就要说到
快照(Snapshot)
  我们先看看git的官方说明:直接记录快照,而非差异比较
  
每次你提交更新,或在Git中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git对待数据更像是一个快照流。
  那么问题来了:什么是快照?
  来实际感受一下:
  首先我准备了一个大的文件,这样比较能说明问题。
  可以看到,源文件是55.3MB,而将其添加到仓库里后,仓库的大小变为46.3MB。这相当于是将整个文件复制到里面去。
  如果这还不能说明问题,再来一次。删除了文件里的一大部分内容,将其减小至20.5MB。再将其提交到仓库里面。
  于是我们可以得出一个近似的结论:在git中,一份快照就是你当前工作目录的状态。当你使用add命令时,它将你当前工作目录的文件进行压缩,形成一份快照。
  不过,如果你有一些文件完全没有被修改过,它只保存指向之前版本的引用。这样可以减少快照所占用的空间。这里没有试验,但是官方对此有说明:  Tobeefficient,iffileshavenotchanged,Gitdoesn’tstorethefileagain,justalinktothepreviousidenticalfileithasalreadystored.
  那么这个时候我们再去执行gitgc,会变成什么样呢?
  之前说的三个方面都有减少。
  我们再看看.git\objects里的文件夹
  可以看到我们上面快照所在文件,即02和f7文件夹已经不在objects这个文件夹里面了。(info和pack两个文件夹一直都在那里)
  点进pack文件夹:
  .git文件夹的46.5M都在这里了。我们可以知道,git将之前两个文件夹的快照文件合并到一起了。
  更换gitforwindows的文本编辑器
  gitforwindows默认使用vim作为文本编辑器
  例如想把它换成atom:
  1、先找到启动atom的exe文件的路径。
   2、启动gitforwindows,
执行gitconfig--globalcore.editor"C:/Users/Schaepher/AppData/Local/atom/app-1.13.0/atom.exe--new-window--foreground--wait"
  注意,这里路径的斜杠与Windows显示的相反,这是Linux的路径格式。
  后面一串参数
--new-window--foreground--wait
是由各编辑器自己指定的。如果不这样指定,执行
gitrebase-icommitId^
的时候会直接退出编辑。
  修改已经提交的commit说明
  先用gitlog查看commit信息:
  打算更改下面那个commit,使用gitrebase-i版本号^:
  执行命令后,会进入这样的界面:
  它把我们传入的版本号之上的commit条目都显示出来了,这里只关注我们要改的那一条。将第一个pick修改为reword,保存并退出。
  过一会儿,它会再进入这样的界面:
  将第一行的Android的ListView改为这个更改后的message,保存并退出。
  再用gitlog查看:
  不仅commitmessage被更改了,从被更改的commit开始,commitid都会重新生成。
  合并commit
  先用gitlog查看commit信息:
  如果想把最近的四个commit合并成一个commit,有两种方法。一种是用gitreset--softd7ac,在gitcommit-m"新的commitmessage",另一种是用gitrebase。接下来讲第二种。
  首先根据上图的commitid,我想把afe14f之后的commit合并到afe14f里面,执行gitrebase-iafe14f^。进入编辑界面:
  根据提示,squash会把所在的commit合并到前一个commit上面。我们要合并到afe14f,所以修改后三个。而在合并之后,需要修改afe14f的commitmessage,所以使用reword。
  保存并退出,会进入下一个界面。修改第一行的commitmessage,即reword的那个message,为添加Android学习笔记,特别是ListView的介绍;添加对gitcommit的修改教程。如下图:
  保存并退出。自动进入下一个界面:
  此时要将其他三个message去掉,只要在那三行前面加#就行了。如下图:
  保存并退出,等待git处理完成。
  再次使用gitlog查看commit信息:
  完成!
  这里可以不使用reword。
  解决merge时出现的冲突
  当你和其他团队成员对同一个文件进行修改后,merge的时候有可能会出现冲突。可以打开每个冲突的文件,手工解决冲突;也可以借助冲突处理工具来解决冲突。这里分别介绍这两种方式:
  1、手工解决冲突
  冲突提示如下图所示:
  CONFLICT表示有冲突,在这一行的末尾,显示冲突文件。这里有两个文件冲突,分别是README.md和app.iml
  这里以README.md为例,解决冲突:
  被红框框住的符号=======是冲突的分割线。
  <<<<<<<HEAD和分割线之间的是本地的文本,分割线和>>>>>>>upstream/dev之间的是远程分支的文本
  你可以选择保留其中一个版本的文本,然后将三个冲突符号都删除。这样表示已解决冲突。如果你想同时保留两个版本,那么只需将冲突符号删除。
  解决冲突后如下图所示:
  2、借助冲突处理工具
  个人认为Meld这个工具比较好用,AndroidStudio自带的冲突处理工具和它很相似。我用过tortoisegit的工具,感觉没有Meld好用,这里就不介绍了。
  (1)首先去Meld的官网下载安装文件并安装。->点此进入Meld官网
  (2)安装完后,打开你的git工具,比如msysgit。执行gitconfig--edit--global,此时会打开一个配置文件。在文件最后添加以下四行:
  冲突的地方会显示红色,如果你想保留本地的代码,则点击左边的→箭头。
  把所有红色(冲突)区域解决后,可以根据实际情况去解决绿色(添加)和灰色(更改)。
  一般保存中间的修改就行。如上图红框处。

TAG: git Git 测试 操作

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2018-12-12  
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

我的存档

数据统计

  • 访问量: 3875
  • 日志数: 42
  • 建立时间: 2018-11-01
  • 更新时间: 2018-11-06

RSS订阅

Open Toolbar