FreeOZ论坛

标题: 开帖介绍GIT (更新git学习资源列表) [打印本页]

作者: coredump    时间: 27-6-2008 18:11
标题: 开帖介绍GIT (更新git学习资源列表)
GIT - The stupid content tracker, 这样称呼Git的不是别人,正是她的作者,大名鼎鼎的Linux kernel的作者inus. Linux kernel原来使用的版本控制系统是BitKeeper, 不过这是个商业软件, 很多GPL的狂热份子一直为此觉得不爽,最后把Bitkeeper惹急了,不和OSDL合作了。Linus是个实用主义者,他一直用BitKeeper用得很爽,为这件事Linus狂怒了一次,大骂这些开源极端分子stupid。不过骂归骂,Linux kernel这么大的项目可不能没有版本控制啊,而且Linus一直对CVS, Subversion之流的版本控制系统不屑一顾,事已至此,徒呼奈何。不过牛人永远是牛人,说干就干,撸起袖子就自己写了一个版本控制系统。

和Linus的性格一样, Git个性十足,功能强大,不过如果没有理解它,则很有可能不得其门而入,下面偶就尝试用一系列的介绍,争取为大家揭去Git的神秘面纱,展现其 stupid content tracker的傻瓜化本质,一旦理解了它,你就会惊呼:哇真简单啊,不会用的真的都是傻瓜

ok,大家先看段有趣的视频(很长,不过是Linus亲自介绍的,语音很标准,我雅思5分的都能听懂):
GoogleTech Talk: Linus Torvalds on git
http://www.youtube.com/watch?v=4XpnKHJAok8

http://www.youtube.com/v/4XpnKHJAok8&hl=en



references:

    *  Home page: http://git.or.cz/
    *  Linux kernel git publish web site: http://git.kernel.org/
    *  GIT中文教程(!totally out of date!)   http://www.bitsun.com/documents/gittutorcn.htm
    *  IBM developerworks上的GIT教程(!also out of date!) http://www.ibm.com/developerworks/cn/linux/l-git/index.html
    * Git @ wikipedia:  http://en.wikipedia.org/wiki/Git_(software)
    * Git @ wikipedia中文:  http://zh.wikipedia.org/wiki/Git
作者: coredump    时间: 29-4-2009 17:51
标题: git学习资源列表
1.  Git The Basics Tutorial
      视频
      对应PDF
      这个视频和PDF做的非常好,条理非常清晰,用很多图示详细直观地解释了git的各种概念。相信用心看完一遍的话, git就可以完全能够掌握了。

2. Git cheat sheet(everybody love cheat就一页, 名副其实的cheat sheet,适合打印出来放在订电脑旁边)

3. Git community Book, Git社区合著的Git从入门到精通书籍,很好的日常参考资料,既无所不包又不乏味。
       PDF版

4.  Every day Git 20 commands


5. SVN crash Course  (如果你从svn转到git,看看这个会增强信心)

6. 如果你很懒,不上看上面的东东,那就看这个吧,提供N个懒惰等级。
  Git for the lazy

7. 想写个Version Control System? 好奇git是如何工作的?  想hack git? 看看这个
Git for designers

8. git magic 另一个优秀的git参考书
   中文翻译:git魔法

其它:  git在windows上使用的易用性已经有了巨大的提升, 因为神奇的小乌龟已经拥抱了git , 下载: 。 还有qgit

9. Git Casts 适合喜欢通过看一个个的视频教程来学习的
作者: justinli79    时间: 29-4-2009 17:53
谢谢coredump分享!
作者: coredump    时间: 19-11-2010 11:43
一个很好的从各个方面比较git和其它版本控制系统的网站(svn, perforace, hg, bzr) http://zh-cn.whygitisbetterthanx.com/
作者: key    时间: 19-11-2010 12:02
正好这几天对于git有兴趣
谢谢了
作者: coredump    时间: 19-11-2010 12:13
gerrit http://code.google.com/p/gerrit/
和git接合使用的一个非常好的code review工具
作者: GPS    时间: 19-11-2010 14:49
正在打算从SVN转到GIT呢。打算从community book开始。多谢LZ资料。
作者: emacs    时间: 19-11-2010 16:30
git 的中文翻译应该是“给力”

作者: coredump    时间: 19-11-2010 17:28
原帖由 emacs 于 19-11-2010 15:30 发表
git 的中文翻译应该是“给力”

我都心里翻译成“给他”, 交给他就不操心了
作者: yuba    时间: 22-11-2010 11:11
我写过一个类似的东西,但是没有考虑Tree。不知道Git是怎么计算一个目录的SHA的?
作者: coredump    时间: 22-11-2010 14:45
原帖由 yuba 于 22-11-2010 10:11 发表
我写过一个类似的东西,但是没有考虑Tree。不知道Git是怎么计算一个目录的SHA的?

Tree在Git里是一个单独的类型,文件内容是blob类型,tree的内容就是目录和下面的成员,成员是文件名或者其他tree。 SHA的计算就是sha(header+content), 好像对tree和普通文件计算的方法是一样的,具体细节没研究,这里有一点介绍:http://book.git-scm.com/7_how_git_stores_objects.html
作者: coredump    时间: 22-11-2010 14:54
标题: 回复 #11 coredump 的帖子
关于其它GIT内部实现原理的介绍还有这里:http://progit.org/book/zh/ch9-0.html
作者: yuba    时间: 22-11-2010 16:01
都没有讲清楚

估计类似于tar cf - /dir | shasum,这样的话最深层的文件会被计算很多次checksum

有空看看源码
作者: coredump    时间: 22-11-2010 16:15
原帖由 yuba 于 22-11-2010 15:01 发表
都没有讲清楚

估计类似于tar cf - /dir | shasum,这样的话最深层的文件会被计算很多次checksum

有空看看源码

应该不会这样,我也没看原码,我感觉是直接把文件名或者文件BLOB的sha值作为输入,而不是文件的整个内容。
作者: yuba    时间: 22-11-2010 16:34
Since trees and blobs, like all other objects, are named by the SHA1 hash of their contents, two trees have the same SHA1 name if and only if their contents (including, recursively, the contents of all subdirectories) are identical.

八成是要从目录所包含的文件的内容来计算目录的SHA,而不是从目录所包含的文件的SHA来计算目录的SHA
作者: coredump    时间: 22-11-2010 16:45
原帖由 yuba 于 22-11-2010 15:34 发表
Since trees and blobs, like all other objects, are named by the SHA1 hash of their contents, two trees have the same SHA1 name if and only if their contents (including, recursively, the contents of al ...

从这句话看不出来必须要求文件内容一起计算,如果考虑sha值是及其难发生碰撞的,哪么可以认为文件的sha值和文件内容完全一一对应,那末基于文件的sha作为输入和给予文件内容作为输入,理论上效果相同。
作者: coredump    时间: 22-11-2010 17:25
看了看git源码,如果没理解错的话,所谓tree的内容,就是"tree " + tree size  + "\0"  + tree content.tree content就是指,该tree目录下,各个文件或者目录的名字,权限描述符和相关的sha1值。

四种git object类型(blob, tree, commit, tag)的内容模型:
http://book.git-scm.com/1_the_git_object_model.html
作者: coredump    时间: 22-11-2010 17:28
查找这个话题,发现一个有趣的thread, 在 SHA1被破解后,有人提出git应该转而采用SHA-256, 而Linus认为git采用的SHA1不受这一破解影响,因而不需要转到SHA-256,具体理由我还没看,大概应该是这个git每个object的头部都有size参数?

Starting to think about sha-256? http://kerneltrap.org/mailarchive/git/2006/8/27/211001
作者: yuba    时间: 22-11-2010 17:39
标题: 回复 #18 coredump 的帖子
SHA-256的计算比SHA-1复杂,我测的数据耗时多50%

所以我采用了更轻的MD5,不但速度快,而且CPU占用率低

当然,需要承担问题的另一个方面
作者: mianwo    时间: 23-11-2010 20:43
感谢楼主

我一直用svn,很长一段时间为了解决offline提交的问题我都是把repository放在u盘上,这样无论在公司还是在家都能工作

git以前在做android的时候就看见过,但一直没有留心
看到你的帖子后我好好研究了一下,感觉这东西好像确实不错
现在已经逐渐把我自己的项目从svn转移到git了,这几天一直在试用中
作者: coredump    时间: 23-11-2010 22:36
原帖由 mianwo 于 23-11-2010 19:43 发表
感谢楼主

我一直用svn,很长一段时间为了解决offline提交的问题我都是把repository放在u盘上,这样无论在公司还是在家都能工作

git以前在做android的时候就看见过,但一直没有留心
看到你的帖子后我好好研究了 ...
svn到处都是.svn目录,和CVS一样烦人。而且因为不是真的DRCS, 放在u盘上也很不便利,u盘符号变了或者同步出错, 就是杯具。
作者: ubuntuhk    时间: 9-7-2014 22:58
看到老丐2008年就开始介绍git了,我到最近才开始认真用,越用越爱,赞!
作者: ubuntuhk    时间: 9-7-2014 23:01
说起git,现在不能不提github,非常好用的源码托管网站

http://github.com
作者: ubuntuhk    时间: 9-7-2014 23:15
如何参与github上的开源项目:

1. 注册github账号
https://github.com/join

2. 对感兴趣的项目fork一下
Fork A Repo
  https://help.github.com/articles/fork-a-repo

3. 将自己的修改代码通过pull request提交给原作者进行审核
Using pull requests
  https://help.github.com/articles/using-pull-requests
作者: zymzxq    时间: 9-7-2014 23:21
wohooooooo, 这个要支持!
作者: zymzxq    时间: 9-7-2014 23:22
ubuntuhk 发表于 9-7-2014 22:01
说起git,现在不能不提github,非常好用的源码托管网站

http://github.com

bitbucket, 一直再努力
作者: wiserfirst    时间: 9-7-2014 23:39
zymzxq 发表于 9-7-2014 22:22
bitbucket, 一直再努力

我在用bitbucket,关键是免费可以有非开源的repo
有时间折腾了再搭一个Gitlab给公司项目用
作者: cais    时间: 10-7-2014 00:05
git一直在用。现在有时还用mercurial。
产品方面,Bitbucket跟Stash都在用。不过Stash是要收钱的。以前的公司好像有用过Gitorious。不过没什么印象了。
作者: ubuntuhk    时间: 10-7-2014 00:13
zymzxq 发表于 9-7-2014 22:22
bitbucket, 一直再努力



bitbucket的名气不如github,而且github上的有影响力的开源项目也更多一些,不过二者的用法倒是差不多,bitbucket的免费闭源项目支持值得一赞。
作者: shyaka    时间: 10-7-2014 00:13
据说当年,BitKeeper给Linux代码免费提供版本控制,但Linux社区的牛人中有几个人把BitKeeper玩残了,BitKeeper一怒之下找Linus要收费,Linus没理,3周后写出了GitHub。。。。
作者: ubuntuhk    时间: 10-7-2014 00:17
shyaka 发表于 9-7-2014 23:13
据说当年,BitKeeper给Linux代码免费提供版本控制,但Linux社区的牛人中有几个人把BitKeeper玩残了,BitKee ...



Linus确实厉害,这里谈到有关BitKeeper和Linux之间的一些事情,大家可以八卦一下
《BitKeeper and Linux: The end of the road?》
http://archive09.linux.com/feature/44147
作者: ubuntuhk    时间: 10-7-2014 00:18
cais 发表于 9-7-2014 23:05
git一直在用。现在有时还用mercurial。
产品方面,Bitbucket跟Stash都在用。不过Stash是要收钱的。以前的公 ...



mercurial和git比较有什么区别和特色?cais分享一下。
作者: ubuntuhk    时间: 10-7-2014 03:10
一篇很好的git flow教程,必需要看:
http://nvie.com/posts/a-successful-git-branching-model/
作者: cais    时间: 10-7-2014 20:26
ubuntuhk 发表于 9-7-2014 23:18
mercurial和git比较有什么区别和特色?cais分享一下。

没什么太大的区别吧。
就是用惯了一个再用另一个的时候,经常要抱怨。
作者: cais    时间: 10-7-2014 20:27
相关的资源还有这个https://www.atlassian.com/git/
好像主要是面向svn用户的。
作者: ubuntuhk    时间: 10-7-2014 20:27
cais 发表于 10-7-2014 19:26
没什么太大的区别吧。
就是用惯了一个再用另一个的时候,经常要抱怨。


嗯,有点像切换开发语言,php、perl、javascript
作者: finger|regnif    时间: 10-7-2014 23:49
shyaka 发表于 9-7-2014 21:13
据说当年,BitKeeper给Linux代码免费提供版本控制,但Linux社区的牛人中有几个人把BitKeeper玩残了,BitKee ...
Linus没理,3周后写出了GitHub。。。。

GitHub 。。。。 Linus。。。。
作者: ubuntuhk    时间: 11-7-2014 01:54
finger|regnif 发表于 10-7-2014 22:49
GitHub 。。。。 Linus。。。。


哈,你眼神好尖
作者: coredump    时间: 16-7-2014 09:42
本帖最后由 coredump 于 16-7-2014 08:44 编辑
ubuntuhk 发表于 9-7-2014 21:58
看到老丐2008年就开始介绍git了,我到最近才开始认真用,越用越爱,赞!


UB挖坟技术一流. 不过最近工作的公司不用git,用perforce了,让我很不爽。尝试了下用git-p4本地使用,不过发现git管理超大型项目(文件数量100k+, size 10G+, 还有各种binaries)还是很吃力的(各种优化后git status还需要20多秒...).

Facebook一开始用git,用到瓶颈后也没解决[url=http://thread.gmane.org/gmane.comp.version-control.git/189776]git的性能问题[/url],只好切换到了Mercurial.   Scaling Mercurial at Facebook

管理超大型代码库,除了Perforce外,还有个后起之秀PlasticSCM, 这个算是结合和 Perforce和Git的优点,有Perforce的性能和企业级功能优势,但是还是像git一样是DVCS.
作者: chubbycat    时间: 16-7-2014 09:45

作者: ubuntuhk    时间: 16-7-2014 13:11
coredump 发表于 16-7-2014 08:42
UB挖坟技术一流. 不过最近工作的公司不用git,用perforce了,让我很不爽。尝试了下用git-p4本地使用,不 ...


才刚刚开始熟悉git,你又说它落伍了,哭。。。不过我觉得对于中小项目,git还是非常不错的,而且现在也非常成熟。git管理binary确实是个毛病,有朋友建议用artifactory管理binary文件,git只负责源码管理,这也是一个没办法的办法,让系统复杂度更高了。

老丐,这个话题值得你再开一个帖子,哈。


作者: coredump    时间: 16-7-2014 13:36
ubuntuhk 发表于 16-7-2014 12:11
才刚刚开始熟悉git,你又说它落伍了,哭。。。不过我觉得对于中小项目,git还是非常不错的,而且现在也 ...

同意,不能用git实在不爽。 其实大部分超大型项目都可以用git,只不过要转变使用习惯。比如建立一系列的小git repo, 就像Android一样,这么大的项目也用git管理起来了。另外比较大的binary files,不要放在source control里为好
作者: ubuntuhk    时间: 16-7-2014 13:48
coredump 发表于 16-7-2014 12:36
同意,不能用git实在不爽。 其实大部分超大型项目都可以用git,只不过要转变使用习惯。比如建立一系列的小 ...


对啊,没有binary文件在源码里面,源码再怎么大也大不到哪里去,git本来就不是为binary文件设计的,所以git没有一个管理binary的好机制。

没有万能军刀,只能根据实际情况来选择最适合的工具。
作者: black_zerg    时间: 16-7-2014 14:43
提示: 作者被禁止或删除, 无法发言 本帖最后由 black_zerg 于 16-7-2014 13:46 编辑

I am very interested in git. This is a great post.
作者: ubuntuhk    时间: 20-7-2014 00:15
我觉得还不错的git文档:

  - 入门教程
     用slide的形式,比较浅显移动
       http://www.slideshare.net/icyleaf/git-14214592

  - 简易入门
     一页解释git常用命令,但是最好需要自动动手练一下,开个github账号建立一个helloworld项目吧
        http://www.bootcss.com/p/git-guide/

  - git工作流
      用工作流更好地利用git来管理项目源码
       http://yedingding.com/2013/09/11 ... w-for-startups.html

  - git官方文档
    什么问题搞不明白的,就上大而全的官方网站吧
    http://git-scm.com/book/zh

作者: 蒙面超人    时间: 20-7-2014 23:50
天资愚钝,好多东西不是很明白。可能也是受CVCS毒害太深。初步的认识是GIT没有server的概念,一切都在自己的本地目录做vision control。两个问题是:
假如这个目录挂了或者被删了怎么办?
怎么样将本地目录的更新跟别的开发版本merge呢?
作者: caoglish    时间: 21-7-2014 01:53
linux可以不用,但是git缺少不了。从git就可以看出linus真的是一个不世天才。
作者: finger|regnif    时间: 23-7-2014 20:46
本帖最后由 finger|regnif 于 23-7-2014 17:50 编辑
蒙面超人 发表于 20-7-2014 20:50
天资愚钝,好多东西不是很明白。可能也是受CVCS毒害太深。初步的认识是GIT没有server的概念,一切都在自己的 ...


git 每个人的 repository 都能完整的存储所有信息. 当然如果你只是一个人玩的话, 删除了就没有了.
一个人玩的话可以备份到 github, bitbucket 之类的服务器上, 还能得到一些额外的功能 如 issuer tracker, wiki.

跟别的版本merge的话要看你用的什么了.

两个repositories之间能通信就行, 或者是通过第三方(如github, 如本地的服务器)进行共享.
如你可以在一台机器上有两个repository (c:\repo1, c:\repo2), 然后在repo1中用 git pull c:\repo2 就能直接从repo2 拉取代码.

两台局域网机器之间可以使用文件共享, 或者用一个服务器 client1 push 到 server, client2 pull from server, client 和 server的通信协议可以ssh, http, git, 文件共享.

github: 你发现某个开源项目 openssl 有 bug(通常你不会有权限对他们的代码直接修改), 于是fork一下 openssl 到你的github账号, 在你的开发机上对你的 openssl 项目进行clone从而下载代码到你的机器上. 然后你修复了这个bug 并 push 你的代码到你的 github/openssl. 你创建一个将 你的github中的代码 合并到 openssl  的 pull request. openssl 项目的开发人员将你的pull request merge到他们的代码中.

github: 如果你是openssl的开发人员, 那你可以直接 clone/modify/push, 不需要fork一个到你的账号.  当然你可能需要遵循该项目的一些规则.

取决于不项目的策略, 你可能会使用不同的开发方式: