IT笔记 · 2013年12月7日

git的使用与介绍

简要介绍

git就是个版本控制工具,可以点此查看git的维基百科介绍。
第一次接触git这类版本控制工具的,可以看这篇文章:git-the simple guide-no deep shit,可以选择各种语言显示。下面是摘要:

  • 创建新仓库:进入一个新文件夹, git init
  • 检出仓库,本地:git clone /path/to/repository 远程:git clone username@host:/path/to/repository
  • 本地工作流:工作目录(working dir)->缓存区(index)->提交结果(HEAD)
  • 添加到本地缓存区(index): git add <pathfile>
  • 提交改动到本地HEAD:git commit -m "改动说明"
  • 推送到远端仓库:git push origin master master可换成指定分支名
  • 本地与远端仓库建立关系:git remote add origin <server>
  • 本地创建名为“feature_x”的分支并切换:git checkout -b feature_x
  • 查看本地分支情况:git branch
  • 切换分支:git checkout 分支名
  • 删除分支:git branch -d 分支名
  • 本地分支推送到远端:git push origin 分支名
  • 合并远端仓库到本地*:git pull
  • 合并其他分支到当前分支:git merge <branch>
  • 查看差异:git diff <source_branch> <target_branch>
  • 查看提交记录:git log
  • 给提交日记贴标签:git tag 1.0.0 1b2e1d63ff 1.0.0为标签内容, 1b2e1d63ff为log里的md5数值开头
  • 替换改动(HEAD->working dir):个git checkout 文件名
  • 内建图形化git:gitk
  • 彩色git输出:git config color.ui true
  • 查看提交记录只显示一行注释:git config format.pretty oneline
  • 交互地添加文件至缓存区:git add -i

从SVN到GIT

大家也许注意到了上面粗体的本地字样,这是熟悉svn的我刚使用git时吸取的教训。添加本地字样就是要让看这篇文章的人能避免我当初的困惑与混淆,简单得说,就是不要随意搜索网上的git命令来使用, git与svn是不同的,虽然某些命令比如add,commit看起来像是一样的。如果你使用过svn,这有一篇文章很好得展示了git与svn的不同,当时我就是看了这篇文章才恍然大悟。文章后的评论也很精彩。这里简要列下文章内容:  

  • git是分布式的,而svn不是:这点详细看文章,git与svn平常使用中的差别,原因就在于此
  • GIT把内容按元数据方式存储,而SVN是按文件
  • GIT分支和SVN的分支不同
  • GIT没有一个全局的版本号,而SVN有:这是git的一个弱点
  • GIT的内容完整性要优于SVN
  • 这点是我想加上的:git 有三重机制(working dir – index – HEAD),处理合并更灵活,git的分支管理也更为灵活,具体可以查看git 分支相关命令说明。

如何在工作环境中使用git

从与svn的区别来看,有人可能注意到了,虽然git有各种各样的好处,足够灵活,但相比较下,svn 更为简单,更能迅速得让一个团队掌握并进行协作工作。在强调协作关系、严谨与安全性的工作环境中,灵活的git就得需要一些约束与规则,才好使用。这篇文章详细讲述了使用git进行开发的流程:A successful Git branching model

在这篇文章所讲流程的基础之上,开发了git flow工具, 使用这个工具可以方便得用git来管理开发协作

这里有个图文并茂详细介绍git-flow使用的文章: git-flow备忘清单

  • 备忘:wins安装git flow时,所需要的gnuwin32可由此下载
  • git flow 的finish操作似乎并不能主动删除远程仓库的分支。

以下是个人觉得工作环境中可能要用到的部分指令

2014-01-11更新

  • 查看本地未commit的改动:git status
  • 查看所有分支情况:git branch -a
  • 查看某个提交的改动:git show hash 其中hash为git log显示的哈希值,取前面几位就行
  • 删除远程仓库分支:git push origin --delete branchname 或者 git push origin:branchname
  • 获取远端仓库信息并删除本地的无远程仓库分支对应的分支:git fetch -p
  • 默认push并不会把标签也push到远端,需要手动git push tagname或者使用git push --tags来更新全部标签到远端
  • 无日记撤消上一次commit,谨慎使用git reset --hard HEAD^
  • 修改最新一次commit的注释信息:git commit --amend 此命令也可把暂存stash未提交部分并入最新一次提交
  • 撤销git add暂存的改动:git reset HEAD <file/dir>
  • 使用最新一次commit内容覆盖本地修改:git checkout <file/dir>
  • 查看远程仓库信息:git remote -v 更详细的是git remote show origin origin可以是其它仓库名
  • 本地分支重命名:git branch -m branchname newname

教程

GIT的缺点

  • git的命令繁复,难以望文生义,知道一个命令后不能轻易推导出反向命令
  • git的命令缺乏正交性,一个实际动作经常需要几个命令组合
  • 同一个动作可以有多种git命令组合来实现,易让人混淆