Git基本知识及MAC安装使用

转自http://xenojoshua.com/2012/02/git-basic-knowledge-mac-installation-using/

0. 写在最前基本上所有的经验都来自一本很好的书:Pro Git。网上能直接看到内容,点这里,我给出的链接是英文的,最下面的链接能直接转成中文的。

此外,git官方的guide也值得一读,地址在这里,这篇文章里不单有很详细的设定细节(主要看这个),还有几篇简单的tutorial。

最后,还有一本中文的好书,Git权威指南,官网在这里。我在网上找到了第一篇,第1 篇:初识Git。这篇文章好在从很多实用场景的方面来比较了老式VCS工具,例如SVN和GIT之间的差别。从而阐明了Git优秀在什么地方。这里我备份了一份,以防万一。

Edit 2013-05-15:最近感觉自己写的这篇文章过于基础,很多git的优势和特性都没有解释清楚,特地撰文一篇作为补充:Git Introduction

1. 优势

简单罗列下使用Git的优势:

  • 版本保存为快照,而非差异记录,细节保存完全。
  • 所有数据都要进行checksum,并将此结果作为数据的唯一标识和索引,时刻保持数据完整性。
  • 几乎所有操作都在本地,速度快,且不受环境影响。
  • 不单单文件保存在本地,连历史数据都保存在本地,即便查找日志也无需服务器介入。
  • 创建branch以及切换branch非常方便快捷,并不是维护多个拷贝,而是由git内部的机制处理。

其实我觉得第一点和第四点作为一个VCS,都会做到,这其实并没有什么。关键还是后面吸引人,特别是第四点,大大提升了集团工作的效率。有兴趣的读者可以到“写在最前”部分给出的链接里的PDF中找到更多细节。

2. 软件安装(MAC)

MAC上的Git安装还真是出人意料的简单,下两个binary文件,然后就完成了。当然,设置稍嫌麻烦,需要在命令行下执行点命令。

Git本体的下载:http://code.google.com/p/git-osx-installer。然后还有GUI软件GitX需要下载:http://gitx.frim.nl/

Update 2012-11-21:这篇文章读的人比较多,我这里更新下,我已经很久没在用GitX这个GUI工具了,MAC上最好的GIT免费GUI工具是SourceTree(没有之一)。此外,最好的GIT代码开源网站是GitHub,最好的GIT代码私有库是BitBucket

设置方面其实有篇很好的官方guide,大家可以在这里参考。关于SSH的设置稍微复杂了点,这里就不赘述了,见前述的guide。完成之后还需要额外设置下账户信息,之后的使用就畅通无阻了:

git config --global user.name "显示名称,e.g. Jonathan Dai"
git config --global user.email "联系用email,不影响账户使用"
git config --global github.user 你的git账户名
git config --global github.token 账户设置页面上能找到的API Token

当然,如果你需要在某个项目中使用不同的用户名、邮件地址或其他任何设定的话,可以进入该项目的目录,并去除–global参数进行设定,不带–global的设定会自动作为最优先设定使用。

3. 关于本地仓库和远程仓库

3.1 本地仓库和远程仓库的关系

在前面所列举的Git的优势之中,有一条是说git在本地也能很好运作,无需远程服务器连接。要做到这点,git会在你clone项目的时候将所有的远程数据加载到本地仓库中。

在用户工作的时候,从本地仓库修改文件(modified),写入git的暂存区域(staged),将暂存区域的内容提交到本地仓库(committed)。这一系列的工作都是在用户本机的本地仓库上进行的。当你将本地的仓库push到远程服务器上的仓库之前,远程仓库里是没有你的工作成果的。我第一次使用git的时候就很惊奇地发现为啥我committed的变动在github网站上查不到。后来才知道还需要将本地的仓库push到远程服务器上。这里简单介绍下相关的几个命令:

  • fetch:获取远程仓库当前最新代码,并不进行自动合并,必须手动执行。
  • pull:获取远程仓库当前最新代码,并自动进行合并。
  • push:将本地仓库中的数据推送到远程仓库,git push [remote-name] [branch-name]。e.g. git push origin master。

3.2 理解Git项目中的remote

在项目文件夹下执行git remote -v,你会看到当前项目下所有的remote的信息。一个新接触Git的人一开始肯定搞不明白remote是怎么回事,看仔细了其实也就明白了。其实remote就是远程仓库。这里你需要明白的是远程仓库这个概念不单单只是github提供给用户的官方代码仓储,同时也是多人协同工作的一种方式。当多人同时对一个项目进行工作的时候,对于其他的项目组成员来说你当前的本地仓库就是一个远程仓库。

相信很多人在第一次使用git的时候是使用git clone 命令从github上一个已经创建好的项目中拉代码到本地。这个时候,其实你已经创建出第一个remote出来了。这个被clone出来的remote仓库就直接被命名为origin。

举个例子来说,当前有个项目叫app,存放在company仓库下,参与项目的有jonathan,craig,bobby。作为程序员jonathan,项目app就可能有下述几个远程仓库:

  • origin git@github.com:company/app.git (SSH登陆链接,company账户,主仓库)
  • craig git://github.com/craig/app.git (craig在他本地创建的工作branch)
  • bobby git://github.com/bobby/app.git (bobby在他本地创建的工作branch)

这里只有origin这个远程仓库jonathan是拥有写权限的,其他只有读权限。

要添加远程仓库,执行:git remote add [shortname] [url]。记得,这个时候数据还没有被加载到本地,需要执行git fetch [shortname],来加载。使用git remote rename [old-name] [new-name]来进行重命名,使用git remote rm [shortname]来删除。

4. Git里的分支管理

4.1 Git分支管理的原理

git分支管理的原理其实是依赖于git进行版本管理的原理的,具体的细节大家可以看这里。我这里简单举个例子来描述下,git的分支管理里的branch和文件的关系就像是c程序里的指针和内存的关系。c程序里的可能会有多个指针指向同一个内存地址,git里也是这样的,多个branch同时使用的其实是一份代码文件,而我们创建和切换branch也只是创建或者切换一个“指针”而已。所以它的速度才可以这么快。

4.2 Git分支管理的优势

毋庸置疑的高效,这个完全没有也不需要有争议。老式的VCS全部都是基于文件进行版本和分支管理的,而git则是基于其自身的版本管理快照机制进行的。一个创建和管理分支需要维护文件,而另一个则只需要创建一个虚拟的“指针”,高下立判。

4.3 Git分支管理的使用和几个细节

  • 列出所有branch:git branch。
  • 创建branch:git branch hotfix。
  • 切换branch:git checkout hotfix,这里用的是checkout,稍微有点奇怪,千万记住。
  • 删除branch:git branch -d hotfix。

关于merge和conflict可以看这里

这里还有一点需要说下,一般来说一个项目刚创建,默认的branch的名字是master。而git还有一个当前正在使用分支的概念,因为所有的分支都是工作在一份代码基础上的,所以我们不能通过文件位置的不同来区分分支,所以git创建了一个虚拟分支“HEAD”,HEAD指向的分支就是用户当前checkout正在使用的。

当你本地的暂存空间里有未提交的内容的时候,git不会让你切换到其他的branch上,这个时候,我们有两种解决方法,一种是创建一个临时branch,commit临时内容到这个branch,等以后回来了再拿下来,并删除临时branch。另一种则是使用git的储藏功能:git stash,所有的临时内容就被存储起来了。你可以使用git stash list来列出你所有暂存了的临时内容。使用git stash apply [stash-name, leave it empty to use lastest one],来恢复你暂存的临时内容。使用git stash pop来恢复暂存内容,并删除暂存记录。使用git stash drop [stash-name]来删除暂存内容。

5. 其他

5.1 标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。 git push origin [tagname]。使用–tags标签表示推送所有本地新增标签,git push origin –tags。

5.2 checkout

Git里的checkout有一个很有意思的用法,就是回滚未提交的文件修改:git checkout — 文件名。这一点和一般的VCS完全不同,用的时候千万小心。

5.3 为什么我一开始没感受到Git的好处

因为我的工作实在是太基础了,很多在版本控制中经常遇到的问题,特别是团队合作问题和工程量级导致的问题我都没遇到过。所以我一开始是不太容易理解Git的很多方便特性。

广告


JackSun

JackSun

I'm a coder.

You may also like...

Leave a Reply

Your email address will not be published.