1.  参考文档

服务架设:

  • 为实现Git服务器端的权限控制,可以使用Gitosis,相关的中文配置文档可以参考有备无患:在 Gentoo 上部署 Git + Gitosis 服务器的笔记
    • Gitorious:更全功能的 git 系统管理软件,自带 Wiki、项目管理、团队管理等模块。
    • RhodeCode:这个主要支持 Code Review ,权限管理和全文检索功能,据说优点是安装部署非常简单。
  • Gerrit:专门在 git 上用的 Web 界面代码 Review 系统,号称是复制了 Google 内部的 Review 流程和支持工具。准备强力关注

公开服务:

  • GitHub 永远是 git 托管的不二王道,我个人认为是现代开发流程管理的必备资源,提供免费的公开项目空间和收费的私人空间。
    • GitHub 使用经验
    • 如果觉得想自己搭建服务器端,又觉得 GitHub Enterprise 太贵,那么可以考虑使用 GitLab ,几乎重新实现了 GitHub 绝大多数的功能。
    • 如果 github 不方便访问,可以用 http://repo.or.cz/ 给自己的项目做一个镜像,以后向镜像上提交就可以了。

2.  安装与部署

2.1  命令行客户端

Mac下可以直接安装二进制包:OSX Installer for Git,当然也有其他的安装办法,有兴趣可以自行搜索。

2.2  图形客户端

随git发行版一般自带gitk和git gui,不过都是用的tk库做的界面,算是可用但不怎么好看。

Mac下我选用的是gitx,基本可以说是gitk的替代品,由于使用操作系统原生界面,用起来舒服很多。

3.  我的git简明用法

说实在这里记录的用法有点儿野路子,基本上是在拿类似Mercurial-hg的用法在用git。没办法,git强大的branch能力有时候实在永不明白,所以其实我这儿是尽量避免去使用branch相关的管理功能。也就是说,这样能用,但应该不是最优的用法。

  1. 用类似git clone REPO a这样的指令建立一个本地版本库,以后不在这个库中做任何修改,仅仅是经常git pull来获取最新的服务器更新。
    • 这样版本库a里面的内容总可以保持与最新的服务器内容一致,方便查看。
  2. 用类似git clone a b这样的指令给本地版本库a建立一个本地镜像b,用作修改,于是版本库b可以不受服务器端内容更新的影响。
    • 在版本库b上做自己的修改、更新,并commit
  3. 在版本库a上做git pull从服务器上获取最新更新。
  4. 在版本库b上做git pull a来开始merge过程。
    1. 冲突的文件会提示出来。
    2. 手工处理这些冲突的文件,其文件内容中 <<<<<<<< ======== >>>>>>>> 所分隔的部分就是冲突的代码,等号上方是本地的修改,等号下方是来自服务器的修改。
    3. 处理好冲突的文件之后,用git update-index指令更新本地索引,这样merge结果才能被commit
    4. 搞定了所有冲突文件,commit这一次的merge
  5. 在版本库a中做git pull b把本地修改弄过来。
  6. 在版本库a里面做git push提交到服务器。

4.  我的 git svn 简明语法

git 可以作为 svn 的客户端使用。比较详细的说明,参考:小试git-svn

  1. git svn clone your_svn_repository_url 检出一个已存在 svn repository (类似于 svn checkout )。
  2. git svn log 查看提交历史日志,加上 -v 选项,还可以提供每次 commit 操作涉及的相关文件的详细信息。
  3. git svn rebase 从中心服务器的 svn repository 获取最新更新,这个在每次把本地修改提交到 svn 服务器之前一般都需要运行一次。git svn 指令下是没有 update 指令的。
  4. git svn dcommit 将本地代码同步到 svn 服务器。加上 -n 选项,则该命令不会真正执行 commit 到 svn 的操作,而是会显示会有哪些本地变动将被 commit 到 svn 服务器。

5.  常用指令

5.1  commit

commit的时候需要加-a参数才会自动把受控的已修改文件包含在本次提交中。

5.2  修改最新一次提交

如果上一次commit的内容有遗漏或是有错误那咋办?如果要修正的正好是最新一次的commit,那么容易了,用git commit --amend指令,就可以将目录下的当前最新内容合并到上一次commit中去,并且可以同时修改上一次commit的注释说明。

5.3  建立临时网络版 git 服务

git 系统自带 daemon 指令,可以在 9418 端口启动一个无认证的 git 服务。客户端可以用类似 git-clone git://IP地址 这样的方式来启动。

5.4  将本地库上传到远程仓库

登录到远程的 git 服务器上,如 home 目录下,mkdir repo 。然后进入abc.git目录。git --bare init ,在服务器端建立一个空的 git 项目。

之后,在本地进入代码仓库所在目录。增加远程仓库:git remote -v 显示项目目前的远程仓库。git remote add origin ssh://127.0.0.1/~/repo 这样就增加了远程仓库 repo 。

最后,commit 提交本地代码,git push origin master 这样就把本地的 git 库上传到了远程服务器的 git 库中了。

5.5  如何合并两个代码仓库

完整说明参考:How do you merge two git repositories?

 git pull url_of_the_other_repo

如果希望被合并的代码库仍然是独立的,可以被独立维护,那么可以用 Submodules 的方式进行合并。通常用于松耦合的代码项目。

5.6  让git自动忽略特定类型的文件

如临时文件,编译出来的二进制文件,通常我们是不希望放进版本库中去的。其中一种方法就是在目录下加入.gitignore文件,比如当前目录下.gitignore文件的内容是这样的:

 
# ignore objects and archives, anywhere in the tree.
*.[oa]
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
这样当前目录下的.o和.a文件都会被自动忽略,.html文件除了foo.html之外,都会被自动忽略。详细用法可以参考man gitignore

如果只是希望在本地仓库忽略特定文件(比如本地配置文件),而不希望影响到全局仓库中的设置,那么可以按照 .gitignore 的语法修改 .git/info/exclude 文件。详细参考 在 git 中忽略文件 gitignore 与 exclude

但以上方法只对还没有被版本库监控的文件起作用。如果一个文件已经纳入版本库管理,那么尽管已经设置 ignore 它,还是会在改动时被标记为 modified 。如果不想用 git rm 指令从版本库中删除文件,就只能用

 git update-index --assume-unchanged <file>
指令强制不提交本地修改。如果想恢复对本地修改的提交,则需要使用
 git update-index --no-assume-unchanged <file>
指令来修改设置。详细参考 GIT: ignoring changes in tracked files

5.7  让git把特定类型文件当作二进制文件处理

把二进制文件当作文本文件来管理有可能造成很大的麻烦,比如对实际文件内容的一点改动就会造成二进制文件多处的细碎修改,于是在提交到版本库的时候,会因为自动diff而无谓消耗大量处理时间。通过在版本库添加.gitattributes文件,可以把特定类型文件当作二进制文件来处理,从而避免无谓的diff操作。比如在文件中这样设置:

 *.foo -crlf -diff -merge
意思就是对*.foo文件不自动做换行符格式转换、不参与diff、不自动进行merge。

在 git 1.6 之后的版本,可以直接使用:

*.foo binary

GlossyBlue theme adapted by David Gilbert
Powered by PmWiki