一、简介
在介绍git
操作命令之前,我们先来了解一段故事!
很多人都知道,Linus 在1991年 创建了开源的Linux
操作系统,此后的三十多年里,Linux 系统不断发展,已然成为全世界最大的服务器系统软件了。
Linus 虽然创建了Linux
操作系统,但是Linux
操作系统的壮大是得益于全世界热心的志愿者参与的,这么多人在世界各地为Linux
操作系统编写代码,那Linux
操作系统的代码是如何管理的呢?
在 2002 年以前,世界各地的志愿者把源代码文件通过diff
的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码!
不过,到了 2002 年,Linux
操作系统已经发展了十年了,代码库之大让 Linus 很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满。
可能有的同学会发出疑问,不是有 CVS、SVN 这些免费的版本控制系统吗?为什么不用它们来托管Linux
操作系统代码?
因为 Linus 本人坚定地反对 CVS 和 SVN,原因是这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。
于是 Linus 选择了一个商业的版本控制系统 BitKeeper,BitKeeper 的东家 BitMover 公司出于人道主义精神,授权 Linux 社区免费使用这个版本控制系统。
随着 Linux 社区对 BitKeeper 版本控制系统的深度了解,原本安定团结的大好局面在 2005 年被打破了,原因是 Linux 社区牛人众多,一名叫 Andrew 的开发者把 BitKeeper 商业授权协议破解了(这么干的其实也不只他一个),之后被 BitMover 公司发现了(监控工作做得不错!),于是 BitMover 公司怒了,要收回 Linux 社区的免费使用权。
Linus 向 BitMover 公司道了歉,保证以后严格管教弟兄们,嗯,想要别人不破解,这其实是不可能的。
之后,Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是我们今天要介绍的 Git!(牛人是怎么定义的,大家可以自行体会一下)
一个月之内,Linux 系统的源码已经由 Git 管理了!
之后的事情,想必估计都知道,Git 迅速成为全世界最流行的分布式版本控制系统,在代码托管方面,基本上是一骑绝尘!
尤其是 2008 年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数的开源项目开始迁移至 GitHub,包括 jQuery、PHP、Ruby等等!
说了这么多,Git 是一款什么样的软件?和 CVS、SVN 这些免费的版本控制系统有什么区别呢?
上文中我们也说到了,Git 其实是一款分布式的版本控制系统,可能你还是不太理解什么叫分布式,我们先聊聊什么是集中式!
集中方的版本控制系统,简单的说,就是当你要干活的时候,用的一般都是自己的电脑,首先要从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
集中式版本控制系统,好处就是统一管理,但是坏处也很明显,必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
分布式版本控制系统,与集中式版本控制系统最大的不同就是:没有中央服务器这个东西。
每个人的电脑上都是一个完整的版本库,可以说每个电脑都是中央服务器,当你工作的时候,不需要联网,可以直接提交工作的内容,如果对方的电脑想要知道你的工作内容,你只需要把对应的工作文件推送过去就可以,对方就可以看到,其他不相关的文件不需要推送给对方!
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
既然git
这么受欢迎,下面我们就开始git
的学习之旅吧!
如果你当前的电脑操作系统是 Linux,安装起来会非常简单,首先试着输入git
,看看系统有没有安装Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
像上面的命令,有很多 Linux 会友好地告诉你 Git 没有安装,还会告诉你如何安装 Git。
按照提示,输入如下命令,即可安装git
!
sudo apt-get install git
如果你正在使用 Mac 做开发,有两种安装 Git 的方法!
一是安装homebrew
,然后通过homebrew
安装Git
,具体方法请参考homebrew
的文档:http://brew.sh/
。
第二种方法更简单,也是推荐的方法,就是直接从AppStore
安装Xcode
,因为Xcode
集成了Git
,不过默认没有安装,你需要运行Xcode
,选择菜单Xcode
->Preferences
,在弹出窗口中找到Downloads
,选择Command Line Tools
,点Install
就可以完成安装了。
Xcode
是Apple
官方IDE
,功能非常强大,是开发Mac
和iOS App
的必选装备,而且是免费的!
在Windows
上使用Git
,就比较傻瓜式了,可以从Git
官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到Git
->Git Bash
,蹦出一个类似命令行窗口的东西,就说明Git
安装成功!
以上全部安装完成后,还需要最后一步设置,在命令行输入:
#配置全局用户名
git config --global user.name "Your Name"
#配置全局邮箱
git config --global user.email "email@example.com"
配置的你用户名和邮箱,因为Git
是分布式版本控制系统,所以,每个机器都必须自报家门!
在上文中,我们对git
的安装进行了一些简单的介绍,等环境准备完成之后,我们就可以开启GIT
之旅!
在上文中,我们有介绍了全局配置用户名和邮箱,假如你的用户和邮箱输入错误了,想修改,怎么办呢?
同样可以用如下的命令,进行修改!
#重新配置用户名
git config --global user.name "zhangsan"
#重新配置邮箱
git config --global user.email "zhangsan@example.com"
同时,还可以通过如下命令查询配置
#查看当前配置
git config --list
如果你想针对某个库,设置用户名和邮箱,直接当前仓库根路径下,通过如下方式可以实现单独配置!
#配置某个仓库的用户名、邮箱
git config user.name "Your Name"
git config user.email "email@example.com"
如果你配置的仓库,用户和密码填错了,可以通过如下命令方式清除,然后重新配置!
git config --system --unset credential.helper
版本库管理是GIT
最重要的核心模块,具体操作如下!
当你想向GIT
里面提交一个文件的时候,首先需要初始化一个版本库
#初始化一个版本库
git init
然后,可以通过如下命令,添加或者修改一个的指定文件!
#添加或者修改一个的指定文件
git add <文件名>
当然,你还可以通过如下命令,添加当前目录下全部的文件!
#添加或者修改的所有文件
git add --all
添加完成之后,还需要提交文件,命令如下
#提交文件
git commit -m <注释>
例如,提交所有的内容提交到版本库!
#例如,提交所有的文件添加修改提交到版本库
git commit -m "注释内容"
有些时候,我们需要通过一下命令,查询当前工作区的信息。
比如,查看当前工作区的状态,这个基本上经常用到!
#查看当前工作区的状态
git status
查询当前版本库的历史提交日志纪录,这个会在版本回滚的时候用到!
#查看历史日志
git log
#查看精简日志
git log --pretty=oneline
查看当前文件的内容!
#查看文件内容
cat <文件名>
查看历史提交的命令!
#查看历史提交的命令
git reflog
查看文件修改内容!
#查看当前文件修改内容
git diff <文件名>
查看工作区和版本库里面最新版本的区别!
#查看当前文件和版本库里面最新版本的区别
git diff HEAD -- <文件名>
如果你想将当前文件回滚到历史上某个时间点提交的文件,可以通过如下命令!
#首先查询你要回滚到历史上某个时间点的版本ID
git log --pretty=oneline
#然后通过如下命令,进行回滚操作
git reset --hard <版本id>
当你修改了某个文件,但是没有提交,想要回滚,怎么处理呢?可以通过如下命令进行撤回!
#撤销某个文件的修改
git checkout -- <文件名>
如果你想全部撤销,可以通过如下命令撤回全部!
#撤销所有修改
git checkout .
当然,如果你不想要某个文件了,可以通过如下方式删除!
#删除指定文件
git rm <文件名>
GIT
的分支管理,非常强大,也是它远胜 CVS、SVN 这些免费的版本控制系统一大神器!
GIT
在初始化版本库的时候,会默认创建一个master
分支,也就是主干分支!
如果你想创建某个分支,可以通过如下命令创建!
#创建分支
git branch <分支名>
比如,创建一个develop
分支!
git branch develop
当执行这个命令之后,GIT
的develop
分支指针会指向到当前分支当前位置!
怎么切换到分支呢?我们可以通过git checkout
命令,实现分支的切换!
#切换分支
git checkout <分支名>
当然,你还可以一步到位,通过如下命令,创建并切换分支!
#创建分支+切换分支
git checkout -b <分支名>
通过下面这个命令,可以查询当前分支!
#查看当前分支
git branch
如果分支切换失败,可以通过git status
命令查询一下为什么会失败,分支切换失败多半是当前工作区的代码没有提交到版本库里面导致,可以检测一下是不是代码都提交到本地版本库!
在平时的开发过程中,我们会经常碰到需要合并分支,比如将develop
分支合并到master
分支,怎么处理呢?
可以通过如下命令,实现快速合并!
#快速合并分支
git merge <分支名>
在合并的时候,可能会出现文件发生冲突的情况,如果出现,就排查修改文件,然后提交!
当然,你还可以通过如下命令,来实现分支合并提交!
#普通模式合并分支+提交
git merge --no-ff -m "merge with no-ff" <分支名>
如果某个分支,你不想要了,想删除,可以通过如下命令实现!
#删除分支
git branch -d <分支名>
如果删除过程中,出现报错,可以下面这个命令,强行删除!
#强行删除分支
git branch -D <分支名>
最后,你可以通过下面这个命令,查询当前版本分支的变动情况!
#查看分支合并图
git log --graph
标签管理,也是git
最最核心的功能!通过标签,我们可以很快的定位到仓库中某个版本,并进行代码回滚!
可以通过如下命令创建某个标签,比如v1.0
标签。
#创建标签
git tag v1.0
查看标签情况
#查看所有的标签
git tag
如果你想看某个标签,具体的详情,可以通过如下命令!
#查看标签信息
git show <标签名>
如果你不想要了,可以通过如下命令,删除标签!
#删除标签
git tag -d <标签名>
当然,如果你想针对某个历史版本,打标签,可以通过如下方式实现!
#查看历史版本id
git log --pretty=oneline --abbrev-commit
#对某个版本ID,打上标签,名称v0.9
git tag v0.9 <版本id>
我们还可以将标签推送到远程分支,命令如下:
#推送全部标签到远程库
git push origin --tags
删除远程标签库
#删除本地标签
git tag -d v0.9
#推送到远程分支
git push origin :refs/tags/<标签名>
GIT
还为我们提供了一个巨大的利器,我们可以通过配置忽略文件,将当前目录中某些文件忽略掉,不提交到版本库里面,具体怎么操作呢?
.gitignore
文件,内容自己定义,比如下面这个内容,就是小编定义的忽略文件,/target/
!.mvn/wrapper/maven-wrapper.jar
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
*.class
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
/build/
### mac ###
.DS_Store
file/
logs/
*/target
target/
然后,执行如下命令,让忽略文件生效!
#清除缓存
git rm -r --cached .
#添加所有文件
git add .
#提交到版本库
git commit -m "update .gitignore"
#提交到远程分支(如果有的话)
git push
以上介绍的基本上都是本地仓库的操作,如果我们需要与其他的电脑协助工作,怎么处理呢?
如果我们本地没有仓库,我们可以直接从远程分支里面拉取一个版本库同步到本地,命令如下。
#从远端服务器创建主分支
git clone <url>
我们可以通过如下命令,查询远程分支的详情
#查看远程库
git remote -v
如果你是通过git init
方式初始化了本地仓库,想与远程分支关联,可以通过如下命令实现!
#添加远程地址
git remote add origin <url>
如果你填写错了,想删除,可以通过如下命令删除,再重新添加!
#删除远程提交地址
git remote rm origin
如果你之前没有推送内容到远程库,可以通过如下命令推送
#首次推送到远程库并创建分支
git push -u origin <分支名> (第一次将内容推送到master分支)
后期推送到远程分支,可以这样操作
#后期推送到远程分支
git push origin <分支名>
#可以简写,快速推送
git push
有时候,我们还需要查询远程分支的情况,可以通过如下命令操作:
#查看远程的所有分支
git branch -a
有时候,我们还需要从远程服务器拉取某个指定的分支到本地,可以通过下面这个命令完成:
#从远程服务器拉取某个指定的分支到本地,并创建分支
git checkout -b <分支名> origin/<分支名>
大部分的情况下,当远程服务器更新了版本库,通知我们也要更新时,通过如下方式,即可将远程的版本库最新的内容同步到我们本地电脑版本库里面。
#拉取远程分支内容,并同步到本地版本库
git pull
有时候,需要设置本地分支与远程分支的链接,可以通过下面这个命令完成:
#设置本地分支与远程分支的链接
git branch --set-upstream dev origin/dev
有时候,我们需要删除没有untracked
的文件,可以通过下面这个命令完成:
#删除没有untracked的文件
git clean -d -xf
版本同步的时候,如果大家都修改了同一个文件,难免会发生冲突。
比如,当修改的文件未提交,直接远程拉取代码会发生冲突,改怎么办呢?
可以这样处理
#先将本地修改存储起来
git stash
#暂存了本地修改之后,就可以pull了
git pull
#还原暂存的内容
git stash pop stash@{0}
此时系统会提示如下类似的信息:
Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c
意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。
然后打开冲突的文件,进行修改,修改完毕之后,执行如下命令进行提交!
git add .
git commit -m "注释"
git push
当然,还可以进行强制更新操作,覆盖本地代码,命令如下!
#下载远程库内容
git fetch --all
#不做任何的合并,git reset 会把HEAD指向刚刚下载的最新的版本
git reset --hard origin/master
git
中电脑与电脑之前的连接,支持的模式有两种:HTTP
和SSH
,其中HTTP
的传输会比较慢,才能SSH
方式进行互推,效率会非常高!
因此,在实际的使用过程总,推荐使用SSH
模式与远程服务器建立连接!
例如与GitHub
的连接,具体的操作配置方式如下!
在当前电脑用户主目录下,看看有没有.ssh
目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可以直接跳过。
如果没有,打开Shell
(Windows
下打开Git Bash
),创建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个 Key 也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是 SSH Key 的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
登陆 GitHub,打开Account settings
,SSH Keys
页面:
然后,点Add SSH Key
,填上任意Title
,在 Key 文本框里粘贴id_rsa.pub
文件的内容:
点Add Key
,你就应该看到已经添加的 Key !
至此,本地与远程服务器的连接配置已经完成,剩下的就是直接远程服务器拉取代码,然后提交的时候git push
就可以了!
本文主要围绕GIT
的背景和常用的操作命令做了一些介绍,可能有些地方介绍的比较粗陋、不完美,希望老铁们能批评指出!
1、廖雪峰 - GIT 教程