自己编译对Cygwin友好的git

首先,我承认我使用的Cygwin版本很老,1.5.24(使用uname -r显示)。如果你在Cygwin下使用git没有遇到我的问题,那很好,恭喜你。

由于Cygwin的版本很老,它自带的git版本就更不用说了,所以我都是自己编译的。随便用用没什么,后来用了自己搭建的gitorious,发现push上去后在别处clone,执行文件的执行属性都不见了。研究发现,原来是在.git/config文件中core.filemode设置为false,意味着权限都被忽略了。

简单但略微繁琐的解决方法是(无论使用git init还是git clone)每次创建新的git repository,都不要忘记执行

$ git config core.filemode true

或者修改git根目录下的Makefile,然后重新编译。修改很简单(此处以git 1.7.2.1为例),即注释掉Makefile:889行,

# NO_TRUSTABLE_FILEMODE = UnfortunatelyYes

git merge –squash介绍

Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如:

$ git merge another
$ git checkout another
# modify, commit, modify, commit ...
$ git checkout master
$ git merge another

但是,操作方便并不意味着这样操作就是合理的,在某些情况下,我们应该优先选择使用--squash选项,如下:

$ git merge --squash another
$ git commit -m "message here"

--squash选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不提交、不移动HEAD,因此需要一条额外的commit命令。其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。

判断是否使用--squash选项最根本的标准是,待合并分支上的历史是否有意义。

如果在开发分支上提交非常随意,甚至写成微博体,那么一定要使用--squash选项。版本历史记录的应该是代码的发展,而不是开发者在编码时的活动。

只有在开发分支上每个commit都有其独自存在的意义,并且能够编译通过的情况下(能够通过测试就更完美了),才应该选择缺省的合并方式来保留commit历史。