简要介绍
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命令组合来实现,易让人混淆