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 branch
、git checkout
和git 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 commit
、git status
就有些可能拼错了,要是能简写就好了!
不要998,不要798,一条命令就能搞定,比如:1
git config --global alias.ci commit
好了,现在敲git ci
就等同于git commit
。当然还有别的命令可以简写,很多人都用co
表示checkout
、st
表示status
、br
表示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使用教程