从零开始的Git教程
0x00. 什么是Git
Git是当今最先进的分布式版本管理系统,是Linus花了两周时间自己用C写成的。相比集中式管理系统SVN,Git可以离线管理你的代码,不用依赖于网速。而且,Git有相当强大的分支管理,这是其他代码管理系统所不具备的。Git 中所有数据在存储前都计算校验和,保证了数据的完整与唯一性。
0x01. Git的安装
windows下的Git
mac下的Git
linux下的Git
0x01. Git的仓库结构
说起Git不得不说下Git的仓库结构,Git由本地三级仓库和远程仓库组成,它们分别是:
- 本地三级仓库
- 工作目录 —— 也就是我们使用
git init初始化仓库的地方,在编辑器可直观显示与修改 - 版本库 —— 也就是我们用
git init初始化仓库时生成的.git文件夹 版本库相当于一个文件的数据库,记录了文件的历史版本- 缓存区 —— 缓存区介于本地仓库与工作目录之间,用于提交代码和解决冲突
- 本地仓库 —— 用于提交本地代码 是远程代码与本地代码的中转枢纽
- 工作目录 —— 也就是我们使用
- 远程仓库 —— 用于把本地代码存放到服务器
以上结构可以用下面的图来说明
0x02. Git的基本操作
1.初始化Git仓库 git init
新建一个文件夹并进入,然后进行Git的初始操作,初始化代码仓库 git init
此时会在当前目录生成一个隐藏文件夹.git 说明我们已经创建成功了
2.添加文件或目录到缓存区 git add
先用markdown创建一个readme文件 echo # readme > README.md
之后用 git add README.md 把文件加入到缓存区,注意此时代码只是在缓存区,而没有到了你的本地仓库中。当然你也可以使用 git add a.txt b.txt 提交几个文件 或者 git add ./* 把所有文件提交到缓存区。
3.把缓存区中的代码提交到本地仓库 git commit
在我们把代码添加到缓存区中后,应该立刻进行提交操作 git commit -m 'commit message' -m 参数为提交添加注释,你也可以使用 git commit -am 'commit message' 同时执行 git add ./* 与 git commit -m 'commit message' 操作,当我们完成commit操作,Git会自动为我们创建一个master分支,有关分支的概念,我们接下来会说。
4.查看缓存区和工作目录的区别 git diff
当我们提交了代码后,我们想要查看版本库中的文件和工作目录中的文件有什么区别该怎么办?这时使用 git diff HEAD -- <filename>可以查看目标节点的版本库文件与工作目录文件的区别,例:git diff HEAD^ -- a.txt 查看上一个节点的a.txt与工作目录里a.txt的区别。
5.查看Git当前的状态 git status
使用git status可以查看当前工作区的状态:和版本库一致,本地已修改但未添加和提交,已经添加但是没有提交。
6.撤销修改 git checkout
git checkout是一条危险的命令,它会重写我们的工作区目录,所以使用时一定要慎重。当我们把工作区的一个文件改坏了时,此时千万不要commit,可以使用git checkout -- [filename]来从版本库还原当前文件。 git checkout的功能不止于此。它还可以切换分支和生成分支还有从目标分支还原文件
(1) 切换分支 当我们有俩个以上分支时,可以使用git checkout branchname切换分支,有关分支(branch)的概念,接下来会介绍。
(2) 生成分支我们还可以直接从当前分支直接拉出一个新的分支git checkout -b [newbranchname],这时会直接生成并跳转到新的分支,而不需要我们费劲的使用两步操作git branch [branchname]与git checkout [branchname] 。
(3) 从目标分支还原文件 如果你需要从某个分支的某个节点还原一个文件,直接使用git checkout [branchname]~n [filename] 语法中的~n为目标分支要回退的版本数。
7.删除文件 git rm
当我们发现版本库中有我们错误提交的文件,比如重要的数据库配置文件,这时我们可以使用git rm实现删除操作。 git rm [filename]可以把版本库中某个文件删除。
8.查看Git日志 git log
在实际的开发中,我们难免会犯错,所以放我们希望看到自己或者同事的提交记录时,可以用git log查看git日志
9.回退Git版本 git reset
如图,我们在进行了三次 commit 后,主分支的结构如下,头指针指向了修改代码这个版本,关于分支、头指针的概念我们接下来会讲到,这里简单理解为每执行一次 commit 仓库的代码更新一次,头指针指向当前更新的版本。这时,我们突然发现我们的修改的代码把我们之前重要的代码给覆盖了,这时我们需要回滚操作。
Git中有俩种回滚指令 一种是:git reset 另一种是: git revert ,这俩种回滚有什么区别呢?
(1) git reset
-
原理
当我们执行了
git reset回退了一个版本的时候,我们的master分支结构会如下图所示:
可与看出git reset操作会让我们的分支节点返回前一个提交的节点上。- 语法
git reset (--mixed/--soft/--hard) HEAD (file)git reset (--mixed)此方式为默认方式,当选择--mixed参数时,工作目录里的代码不会回滚,但是缓存区index和本地仓库里commit会回滚。git reset --soft只回退本地仓库commit,而缓存区index与工作目录并不会回滚。git reset --hard会同时回滚工作目录,缓存区index与本地代码仓库commit,请谨慎使用,所有add了而未commit的源码会消失。
git reset HEAD^ 把头指针回退一个版本 git reset HEAD^^ 回退俩个版本,回退几个就加几个^。要是一百个版本怎么办?使用git reset HEAD~100
git reset HEAD^ a.txt 只回退a.txt
git reset 1094adb 把Git回退到commit_id为1094adb的版本
(2) git revert
git revert与git reset的区别在于git revert会把代码回滚到前一个节点的状态,但是HEAD头指针却向前移动。
使用git revert后发现master分支的节点反而向前移动了,此时节点b’的状态与b完全一致。
10.远程仓库操作 git remote
当我们在远程服务器搭建了远程仓库时,这时就需要使用git remote来管理远程仓库或者建立本地库与远程库之间的联系了。
(1) 查看当前绑定的远程分支 git remote 你也可以带上- v参数git remote -v列出远程分支详细信息
(2)
-
克隆远程仓库
git clone -
把本地代码提交到远程仓库
git push
0x0n. Git连接远程仓库
Git连接Github(ssh push远程仓库)
step1. 创建ssh
$ ssh-****** -t rsa -C [email protected]
成功后会在 C://Users/主机名/.ssh 文件夹下面生成俩个文件id_rsa(私匙)id_rsa.pub(公匙)step2. 绑定公匙
https://github.com/settings/keysstep3. 测试ssh key
$ ssh -T [email protected]如果出现 You’ve successfully authenticated, but GitHub does not provide shell access. 则表明绑定成功step4. 创建本地仓库 建立master分支
$ git init在目标目录创建仓库$ echo # read me > README.MD建立markdown文件$ git add ./*全选文件$ git commit -m 'first commit'第一次提交 建立本地master分支step5. 设置远程仓库源 第一次push
$ git remote add origin [email protected]:yourname/profilename.git添加github远程仓库源$ git push --set-upstream origin master给master分支上传到远程仓库,此后可以直接push pull不需要再绑定源
Git连接Gitlab(http clone远程仓库)
step1. 配置本地的账号邮箱
$ git config --global user.name "Your Name"$ git config --global user.email "[email protected]"step2. 创建存放代码的文件夹
$ mkdir dir$ cd dirstep3. 登陆gitlab 并找到项目代码的http拉取地址 在bash上
clone$ git clone http://gitlab.gitlab.net/gitlab.git
第一次连接会要求输入账号和密码
-step4. 查看所有远程分支并切换dev 分支 $ git branch -a $ git checkout dev