git 入门使用教程
git 入门使用教程
Git简介
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
- 引用官方的话,Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。
- 引用廖雪峰老师的话,它能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以。
版本控制
版本控制就是一种用于管理项目、文件、目录等的一种技术手段,他可以实现对内容
历史控制
,就如同下图中的手动版本控制。通过版本控制技术,我们可以有效的实现对内容的查看历史记录、备份以及恢复文件等操作。可以简单的认为是一个版本管理器。
通过Git可以实现以下功能:
- 对文件的备份、历史记录的操作,起到保护作用
- 跨区域协同开发,协同办公,减轻负担
- 跟踪和记录项目开发过程
Git的诞生
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
随后,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
Git&SVN
git就是分布式的版本控制系统。所有
的版本信息仓库都同步到了本地
,用户可以离线查看左右版本记录,也可以离线在本地提交,工作时直接在本地编辑,联网时再推送至云端。git通过仓库来存放和管理这些文件,git仓库可以分为:
-
本地仓库:开发人员本地的git仓库
-
远程仓库:远程服务器上的git仓库
SVN是集中式版本控制的代表。项目的所有版本
数据都保存在服务器
上,开发者工作时需要从服务器获得最新版本到本地,然后进行修改或编辑。开发者离线时不能查看历史版本或在不同不同分支工作。
安装Git
linux系列安装git很简单,执行一条命令即可。更多其它版本安装请查看官方文档:https://git-scm.com/downloads
Debian/Ubuntu
sudo add-apt-repository ppa:git-core/ppa
sudo apt update; apt install git
Fedora
yum install git # (up to Fedora 21)
dnf install git # (Fedora 22 and later)
Arch Linux
pacman -S git
openSUSE
zypper install git
centos/RHEL
yum install -y git
Windows
直接下载(淘宝镜像),傻瓜式安装即可。
工作区域
git含有4个工作区域,3个本地工作区域(工作区
、暂存区
、资源库
)和一个远程仓库
。
- 工作区:平时存放代码的位置,也就是我们的项目目录。
- 暂存区:
.git
文件中的index
文件就暂存区。用与临时存放改动的文件,也叫stage。 - 版本库:本地存放所有版本数据的地方,位置位于工作区根目录下的
.git
目录中,版本库中存放了很多配置信息、日志信息和文件版本信息等。 - 远程仓库:在服务器端托管代码的地方
git的工作流程:
- 在工作目录中添加、修改文件,进行项目开发
- 将需要进行版本管理的文件放入暂存区(
git add .
),便于后期将文件推送至本地仓库 - 将暂存区的文件提交到本地Git仓库(
git commit
) - 将文件推送到远程仓库(
git push
)
全局设置
当安装完Git之后,首先要做的就是设置用户名和email地址,每次的git提交都会使用该信息。该信息并不要求必须是我们github/gitee的用户名和邮箱,可以任意指定。
查看配置信息
# 查看系统git配置信息
git config --system --list
# 查看用户git配置信息
git config --global --list
设置用户信息
# 用户名
git config --global user.name "xcy.小相"
# 邮箱
git config --global user.email "xc2532800855@163.com"
文件状态
- Untracked:未跟踪状态。表示该文件存在于工作目录中,但是并没有添加到git库,不参与版本控制。通过
git add
命令将文件添加到暂存区中,即状态变为staged
。 - Unmodify:文件已入库但未修改状态。该文件最终有两种去处:被修改(Modified),通过
git rm
移出版本库(Untracked)。 - Modified:文件已入库且已修改状态。该文件最终有两种去处:通过
git add
进入暂存(staged)状态,使用git checkout
命令丢弃修改返回到unmodify状态。 - staged:已暂存状态,执行
git commit
命令则将修改同步到库中。这时库中的文件和本地文件又变为一致,文件状态变为Unmodify状态。
创建仓库
要使用Git管理项目,我们首先需要有一个Git仓库。创建Git仓库的方式通常有两种:直接在本地初始化一个仓库,克隆远程仓库至本地。
创建本地仓库
创建一个项目目录,切换到项目根目录下执行下面的命令即可:
git init
执行之后可以看到文件根目录下有一个.git目录,该目录包含关于版本等的所有信息,则说明创建成功。
克隆远程仓库(常用)
克隆一个项目和它的整个代码历史(版本信息)
git clone [远程仓库地址]
本地操作
远程操作
基本操作
合并冲突
git merge 用来做分支合并,将其他分支中的内容合并到当前分支中。比如分支结构如下:
当前分支是master
$ git checkout master
把issueFix中的内容Merge进来:
$ git merge issueFix
如果没有冲突的话,merge完成。有冲突的话,git会提示那个文件中有冲突,比如有如下冲突:
<<<<<<< HEAD:test.c
printf (“test1″);
=======
printf (“test2″);
>>>>>>> issueFix:test.c
可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时检出的分支)中的内容,下半部分是在 issueFix 分支中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来解决:
printf (“test2″);
这个解决方案各采纳了两个分支中的一部分内容,而且删除了 <<<<<<<
,=======
,和>>>>>>>
这些行。在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决(resolved)。因为一旦暂存,就表示冲突已经解决。
分支操作
命令 | 作用 |
---|---|
git branch -r | |
git branch 分支名称 | 新建一个分支 |
git checkout 分支名称 | 切换到指定分支 |
git merge 分支名称 | 合并到指定分支 |
git branch -d 分支名称 | 删除某个分支 |
git push 仓库别名 --delete 分支名称 | 删除远程仓库的某个分支 |
标签操作
git的标签,使得是某个分支某个特定时间点的状态,类似快照。通过标签,可以很方便的切换到标记时的状态。开发人员通常使用这个功能来发布节点(v1.0,v2.0)
命令 | 作用 |
---|---|
git tag | 列出所有的标签 |
git tag 标签名称 | 创建一个新标签 |
git push 仓库别名 标签名称 | 将标签推送至远程仓库 |
git checkout -b 分支 标签名称 | 检出标签到一个新的分支 |
忽略文件
git默认是将本地工作目录中的所有文件都提交,即将所有文件都纳入版本控制中。但有时因为部分原因我们需要忽略部分文件,不纳入版本控制之中。这时,我们就可以通过.gitignore
文件来进行忽略设置。
在主目录下下创建.gitignore文件:
- 号开头的内容会被忽略掉,相当于注释内容
- 可以使用linux通配符。
- 以!开头表示例外规则,将不会被忽略
- 名称最前面添加路分隔符
/
,表示忽略根路径下的某文件 - 名称的最后面天添加路径分隔符
/
,表示忽略所有文件名为该名称的文件
# 忽略所有的后缀名为md的文件
*.md
# readme.md除外的文件全部被忽略
!readme.md
# 忽略路径为/files文件及其子目录中的内容
/files
# 忽略所有名为files下的所有文件
files/
9. 使用码云
- 生成本地秘钥:
ssh-keygen -t rsa -C "xc2532800855@163.com" -f ~/.ssh/git_rsa
- 配置多秘钥管理
c d / . s s h / cd ~/.ssh/ cd /.ssh/ vim cofig
# 输入以下内容
Host gitee
HostName gitee.com
User git
Identityfile ~/.ssh/git_rsa
$ sudo chmod +600 ./config
- 在gitee 中创建仓库
- 克隆仓库到本地
~/Study/Git/gitCode » git clone https://gitee.com/xcyxiaoxiang/git-study.git
正克隆到 'git-study'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (6/6), 13.26 KiB | 905.00 KiB/s, 完成.
~/Study/Git/gitCode » ls
git-study
~/Study/Git/gitCode » cd git-study
~/Study/Git/gitCode/git-study(master) » ls
LICENSE README.en.md README.md