Git使用教程

Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git是目前最流行最先进的分布式版本控制系统。最近在微博上看到了一些介绍Git使用的文章,又有一个学弟问我怎么使用Git,其实我也只是会一些最基本的功能,所以就花点时间整理一下。

说到Git那必须得说说SVN,同为版本控制系统,它们俩之间有什么不同呢?

Git与SVN的最大区别就是前者是分布式版本控制系统,而后者是集中式。

集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。如果是局域网还可以,宽带够大速度够快,如果在互联网下如果网速慢,呵呵你就纳闷了。

Git是分布式版本控制系统,那么它是没有集中管理的服务器,每个人的电脑就是一个完整的版本库,这样工作的时候就不要联网,因为版本库都在自己的电脑上。

Git在Windows、Linux和Mac三大平台上都有客户端,可以在这儿下载Git下载,我的笔记本是Windows7 64位的系统,安装完成后在开始菜单有个Git文件夹,这个文件夹下有两个快捷方式Git Bash和Git GUI,前者是命令行模式的客户端,后者是图形操作界面的客户端,我们使用Git Bash来举例子。

版本库英文名为repository,可以简单的理解为一个目录,这个目录里的文件都可以被Git管理起来,每个文件的增添、修改和删除都能被Git跟踪,以便任何时候都能追踪历史。

简单配置相关信息

因为Git是分布式版本控制系统,所以,每个用户都要说明你的名字和Email地址。

  • git config --global user.name [username]
  • git config --global user.email [email]

初始化一个版本库

初始化一个版本库使用git init命令

在某个文件夹下执行git init命令,就可以把该文件夹作为版本库,打开文件夹可以看到一个隐藏的.git文件夹,没事不要动这里面的文件!

把文件添加到版本库

把文件添加到版本库要使用git add命令

  • git add somedir(添加somedir这个目录,目录下的所有文件也都被加入)
  • git add somefile(添加somefile这个文件)
  • git add .(将所有文件添加到版本库)
  • git add -u(将所有文件(文件夹)添加到版本库,同时将已删除的文件(文件夹)从版本库中删除)

把文件从版本库中删除

把文件从版本库中删除要使用git rm命令

  • git rm –r *(从版本库中删除当前目录下的所有文件和子目录)
  • git rm somefile(从版本库中删除文件somefile,包含本地目录和index中的此文件记录)
  • git rm --cached somefile(从版本库中删除文件somefile,不会删除本地目录文件,只删除index中的文件记录;将已经git add的文件remove到cache中,这样commit的时候不会提交这个文件,适用于一下子添加了很多文件,却又想排除其中个别几个文件的情况)

提交当前工作目录的修改内容

提交当前工作目录的修改内容使用git commit命令

一般用git commit -m "commit information"这个命令提交,引号中的commit information为此次提交的注释说明,每一次提交,Git就会为全局代码建立一个唯一的commit_id,用户可以通过git reset命令恢复到任意一次提交时的代码。

查看版本库的状态

查看版本库的状态使用git status命令

查看版本库的状态可以得知哪些文件发生了变化,哪些文件还没有添加到git版本库中等等。建议每次commit前都要通过该命令确认版本库状态。

查看历史日志

查看历史日志使用git log命令

查看历史日志,包含每次的版本变化,每次版本变化对应一个前文中提到的唯一的commit_id。

使用git log --pretty=oneline命令可以将每次commit的记录打印成一行,内容更加精简,更清晰的看commit时填写的注释说明。

版本回退

版本回退使用git reset命令

git reset命令比较复杂,它的命令形式:git reset [--mixed | --soft | --hard] [<commit-ish>]

  • 使用命令git reset --hard commit_id使我们可以在版本的历史之间穿梭。
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

查看尚未缓存的改动

查看尚未缓存的改动使用git diff命令。该命令把本地当前的代码和index(最近一次git add)中的代码进行比较

分支管理

与分支管理相关的命令有git branchgit checkoutgit merge

分支的删除和查看通过git branch命令来执行

  • git branch查看本地分支
  • git branch -a查看本地和远程的所有分支
  • git branch -r查看远程分支
  • git branch -d删除本地分支

分支的创建和切换通过git checkout命令来执行

  • git checkout –b newbranch创建一个新分支,并切换到该分支上
  • git checkout branchname切换到已创建的branchname分支上
  • git branch -r查看远程分支
  • git branch -d删除本地分支

分支的合并通过git merge命令来执行

  • git merge somebranch将somebranch分支合并到当前分支

远程推送代码

远程推送代码使用git push命令

  • git push origin master表示将代码推送到远程的master分支上。

远程拉取代码

远程拉取代码使用git pull命令

  • git pull origin master表示将远程master分支上的代码拉取到本地,并和本地的master分支合并。
  • git fetch origin master git merge origin/master同上。
  • git fetch origin master git rebase origin/master同上。

添加远程库

添加远程库使用git remote命令

以Github为例,我在我的Github上创建一个空的版本库test,输入git remote add origin git@github.com:zhujun24/test.git命令(zhujun24是Github用户名,注意替换成自己的)。这样就把本地版本库与Github上的远程库关联上了。当我们再用git push origin master命令时,本地版本库的master分支代码就推送到Github远程库上去了,可以在Github上查看到你推送的代码了。

Git多人协作和分支管理有一些惯用的原则

  • 本地的分支推送到远程的分支,保证本地和远程的同名分支相同。
  • 开始Coding前先从远程分支上把最新的代码git pull到本地,结束Coding前先本地分支上把最新的代码git push到远程。
  • 开发时,在开发分支在写代码,保证本地的master分支不被污染。在实际开发中,我们应该按照几个基本原则进行分支管理:
    • 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
    • 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本。
    • 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
      所以,团队合作的分支看起来就像这样:
      分支管理策略

工作区和暂存区

  • 工作区:就是你在电脑里能看到的目录,一般指本地版本库(隐藏目录.git除外)的目录。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
工作区和暂存区

  • 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  • 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

基本的Git用法先说到这儿,接下来说一些小技巧。

SSH

git push向Github远程推送代码的时候,我们每次都要输入用户名和密码,很麻烦,有了SSH我们就可以不用每次都输入用户名和密码了,SSH公钥是让Git服务器验证你的电脑是被认证的,本地配置SSH避免了每次git要求你输入用户名和密码这些认证信息。具体怎么配置SSH可以参考Github的方法Generating SSH keys

git ignore

git ignore 顾名思义,忽略的意思,我们可以用它来忽略一些文件,Git就不会追踪这些文件了。

在仓库目录下新建一个名为.gitignore的文件(因为是点开头,没有文件名,没办法直接在windows目录下直接创建,必须通过右键Git Bash,按照linux的方式来新建.gitignore文件)。输入:

1
vim .gitignore

这样我们就在根目录下新建了一个.gitignore的文件,接下来就可以用记事本等来编辑了。关于怎么写.gitignore自行搜索吧。

git设置命令简写

有时候容易输错命令,尤其是对于一些英语不太好的同学。git add还是不容易出错的,git commitgit status就有些可能拼错了,要是能简写就好了!

不要998,不要798,一条命令就能搞定,比如:

1
git config --global alias.ci commit

好了,现在敲git ci就等同于git commit。当然还有别的命令可以简写,很多人都用co表示checkoutst表示statusbr表示branch等。

有个丧心病狂的人干了件丧心病狂的事,把log写成这样就像下图中显示的那样:

1
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

不要激动

这篇博客参考一下资料:
21分钟入门Git
Git廖雪峰的Git教程
Git使用教程

Fork me on GitHub