试用 git

在初步看完 pro git 后,很被 git 的分布式仓库设计吸引,决定试用一下git,并将lite-ext 迁移到git-hub 上。

一点介绍@slideshare


列一下原先使用svn的不便之处:


1.从来没有用过svn的分支功能,因为一直听说svn分支实为代码copy,速度很慢,而且分支都会在服务器上建立,则一直都在主线上开发,而有些实验功能以及bug修正都不敢轻易提交,这样的话就丧失了版本控制的功能,常常将代码搞得一塌糊涂后只能全部删掉,重新check out了,中间的历史常常没有记录。


2.当连接网络不方便时自然也就丧失了版本控制的功能,因为每次commit都是要连到网上的。


而使用git后,可以有效解决上述问题


1.有些自己试验功能以及bug修正,可以采用本地分支,则在本地分支上commit可以保留代码版本记录的同时,在完全搞好后合并到主线上再push到服务器上,也避免了服务器上分支的建立。以及

利用 git commit --amend 将这次的修改 undo 上次commit

利用 git reset (file) 将已经stage(缓存)的文件恢复为未stage状态

利用 git checkout -- (file) 将修改过的文件恢复为未修改前内容(破坏性不可复原操作)


2.当没有网络连接时,可以在本地进行commit操作,当有网络连接时可以使用push和服务器同步即可。


3.可以方便快速的查看log信息,不必每次都连接到网络。


总之,这一切都是拜git分布的版本控制仓库所赐,每个客户端都有完整的版本控制仓库。

ps 中文文件名注意:

如果有文件为中文文件名可要注意了,windows下的中文文件名以 gbk 编码,则上传到 github 服务后,可以浏览器查看变为乱码(linux下clone后也为乱码文件名),可见github服务器应为linux系统(文件名为utf-8编码),所以不建议用中文文件名。

ps2 换行符注意

在 window 下使用 msysgit 时默认 core.autocrlf 为 true,那么直接使用 git 客户端的话没有问题,github上都是lf存储,但是如果使用了 idea 等 git 的插件,而没有注意 idea 的格式转换提示,那么就可能和使用git客户端的其他人产生冲突:

idea 的换行转换提示设置:

pro git阅读笔记


git 为dvs,不是cvs,分布式的版本控制,每个client都有完整的仓库。

git 中文件状态 tracked(clone初始状态,或通过git commit), modified(通过修改添加), staged(缓

存,通过git add命令),比传统多了staged这个状态。


没有区分明确的 git server ,只不过是多个个人 git 仓库的公共媒介,永远在线。
传输协议:git , http/https ,SSH (需要生成公钥私钥),gitosis很方便的可以配置,可以通过git提交

配置文件管理。

git 大大强化了分支的功能,不同于以往分支建立很麻烦很耗资源而往往不创建分支结果垃圾代码提交到

主线上去,git很轻量级的创建分支(指向commit的指针),鼓励多创建分支,在分支上进行新功能以及

bug的解决,最后才合并到 master 分支上去。

git 为三路合并,两个合并branch的最小公共祖先为base,将两个branch合并到上面去并生成新的commit

,如果同一行两个branch有不同的数据,则提示用户手动合并。

分支历史可以通过 git gui 中 版本库->图是所有分支历史 来查看

利用 git push remote-name local-branch:remote-branch 将本地分支 local-branch 推到 remate-name

的remote-branch上面去,省略 remote-branch时,remote-branch=local-branch,
省略 local-branch时,为删除remote-name的remote-branch分支。
注意push前首先要
git checkout local-branch
git fetch remote-name
git merge remote-name/remote-branch
更新当前的分支

利用track branch简化分支操作,git checkout-b local-branch remote-name/remote-branch
以后在 git checkout local-branch 后,可以利用
git pull 更新分支
git push 提交分支


git 内部实现:只要拷贝.git目录即可。以key-value为基础的内容管理系统
.git/objects 所有文件,目录(tree)以及tag,commit的内容都在此,sha索引,文件名保留在tree中

.git/objects/pack 通过git gc手动或不定期自动将原先的每个版本文件都重新存储
改变为存储一个完整的版本,其后版本都增量存储。

.git/refs 指向sha索引的指针文件,分支与tag本质都是指针文件指向commit(文件内容为commit sha)


分支指针文件内容经常变化,tag指针文件从不变化。

.git/HEAD 二级指针文件,指向其他指针文件,表明当前所在分支的最后提交





猜你喜欢

转载自yiminghe.iteye.com/blog/597223