一、初识git
1.git概念
- git是一个开源的分布式版本控制系统,用来处理各种项目的版本管理;其是一个工具,是一个shell(命令处理器,读入并解释输入的命令的程序)命令
- git有一个中心服务器控制的最新版本代码,且每个开发者还有个本地仓库,在开发过程中先将代码提交到本地仓库,再推送到中心服务器上
2.git优点:
- 分布式的版本管理:每个用户都依赖于中心服务器来实现交互,但不会被中心服务器限制;如果中心服务器出现差错,先提交到本地仓库,当中心服务器修复之后,再将自己仓库的东西推送到中心服务器。
- git强调个体,并对公共服务期的压力不会太大,大小项目都可管理;同时拥有良好的分支机制
- 和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库
3.git缺点:
- git版本之间的兼容性不好,可能再上个版本的项目内容放到另外一个git版本会出错
4.git、CVS、SVN的区别
- CVS、SVN是集中式版本控制系统,其是将代码提交到远程服务器上(提交时必须连网),git提交代码在本地,故不需要连网
- CVS、SVN的完整代码仓库(代码和各个历史版本的信息)在中心服务器上,若中心服务器挂了,里面的完整的代码仓库也挂了,无法再提交代码。
- 但每一个git客户端(git节点)都含有一个完整的代码仓库,即使某一个git节点挂掉了,可以从其他git节点clone一个代码仓库,其代码、版本信息都还是完整的
- 即:git的每一个节点相当于SVN的中心服务器,包含完整的代码仓库
二、git基本原理
1.git的分层结构
- git的工作共分为四层:有三层是在本地的,即git仓库
git仓库包括工作目录、暂存区、本地仓库;其中工作目录是用来执行命令的(即执行一切文件操作的地方),暂存区和本地仓库都是在.git目录,用来存储数据
2.git的对象
- git是一套内容寻址的文件系统,其存储的是
key-value 键值对,根据key值查找value,其根据指针寻址,且这些指针存储在git的对象中 - git有3种对象:
----commit对象:记录每次提交到本地仓库的文件快照,第一次提交的内容会用一个commit来记录,第二次提交时,会有另外一个commit对象来记录,且该commit对象会指向上一次提交的commit对象,多次提交后就会形成一个链表,head对象指向最近的一个提交的commit对象 ----tree对象记录了文件快照中的各个目录和文件的结构关系 ----blob对象对应文件快照中那些发生变化的文件内容
三、git使用
1.git安装
在git官网下载安装包,安装完成后,还需要进一步设置,在命令行输入
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为git是分布式版本控制系统,每个机器需要有一个识别标志:名字和邮箱地址
git config 命令的--global 参数,用了这个参数,表示这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
2.git操作
简单总结:
- 工作区(Working Directory):电脑上能看到的目录
- 版本库(Repository):工作区有一个隐藏目录
.git ,这是git的版本库,里面存放了很多东西,有暂存区(index或stage),git自动创建的第一个分支master,指向master的一个指针HEAD - 暂存区:版本库的一个区域
具体操作:
- 第一步使用
git add 命令将文件从工作区添加到版本库中的暂存区,且git add 命令可多次使用 - 第二步使用
git commit 提交代码,将暂存区的所有内容提交到当前分支
需要提交的文件修改都放到暂存区,然后一次性提交暂存区的所有修改到当前分支
(1)git命令
创建版本库repository
$ mkdir repositoryname
$ cd repositoryname
$ pwd
pwd 命令用于显示当前目录。
mkdir 同dos命令 指定目录不存在则创建目录
cd 同dos命令 打开相应目录
通过git init 命令把这个目录变成Git可以管理的仓库(初始化一个仓库)
$ git init
Initialized empty Git repository in 当前目录
新建仓库之后会看到当前目录下出现.git 目录,这个目录是Git来跟踪管理版本库的
添加文件到仓库
- 第一步使用命令
git add + 文件名(带扩展名),将文件添加到仓库: - 第二步,使用命令
git commit 将文件提交至仓库
-m 后面输入的是本次提交的说明,可以输入任意内容, 提交成功会有提示: 1 file changed 即一个文件被改动 ? 2 insertions 插入了两行内容
git常用命令
git status :查看代码仓库状态,当文件修改过但未提交,会有提示;状态值: uncommited:已有的,刚被修改尚未提交的;untracked:未跟踪的,不参与版本控制git diff :查看修改内容,但要在git add 命令之前使用,如果添加到commit缓存后,git diff 命令就失效了git diff 版本1 版本2 [文件] :文件是可选的参数,不带[文件]的参数是比较所有的不同修改;带[文件]参数的,只可查看某个文件的不同git log :查看commit历史git reflog :查看命令历史git reset --hard HEAD^ :回溯版本,用git log或者git reflog看下历史版本,然后用git reset 命令回退版本;git是用HEAD来表示当前分支中的当前版本;在git中,(HEAD)表示当前版本,HEAD^表示上一版本,HEAD~n 上n个版本
撤销修改,有三种情况
- 场景1:改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file 或者 手动修改。
- 注意
-- ,后续的版本分支也是git checkout 命令,它没有 -- ,该方法能复原全部文件,本质上git checkout -- file 是把版本库的file替换成工作区的file; - 而手动复原只修改文件的而一部分
- 场景2:改乱了工作区某个文件的内容,且添加到了暂存区,想丢弃修改
- 先用
git reset HEAD file 命令,回到场景1,是把缓存区中的file文件删去,对工作区后续做的修改并没有影响 - 再按场景1 进行后续操作
- 场景3:已经提交不合适的修改到版本库时,想撤销该次提交,如果没有推送到远程仓库,可以通过版本回退撤销
(2)远程仓库github
远程仓库
由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要设置。
Secure Shell (安全外壳协议,简称 SSH )是一种加密的 网络传输协议 ,可在不安全的网络中为网络服务提供安全的传输环境 。. SSH通过在网络中建立 安全隧道 (英语:secure channel) 来实现SSH客户端与服务器之间的连接 。
第1步:创建SSH Key。在电脑C:\Users\用户目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa 和id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,无需设置密码
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容: 点“Add Key”,你就应该看到已经添加的Key:
GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送
添加远程库
- 登陆GitHub,然后,在右上角找到“
Create a new repo ”按钮,创建一个新的仓库: - 在
Repository name 填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库: - 在GitHub上的这个learngit仓库还是空的,在本地的learngit仓库下运行命令(即关联一个远程库):添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
$ git remote add origin git@github.com:softgx/learngit.git
请千万注意,把上面的michaelliao替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库
- 下一步用
git push 命令,实际上是把当前分支master推送到远程。 - 关联后,使用命令
git push -u origin master 第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master 推送最新修改;
删除远程库
- 使用前,先用
git remote -v 查看远程库信息 - 用git remote rm 命令进行删除
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
从远程库克隆
$ git clone git@github.com:softgx/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
注意把Git库的地址换成自己的,然后进入gitskills目录看看,已经有README.md文件了:
$ cd gitskills
$ ls
README.md
ps:
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。 Git支持多种协议,包括https,但ssh协议速度最快。
分支管理
分支管理原理参考下面的教程
创建与使用分支
-
查看分支:git branch -
创建分支:git branch <name> -
切换分支:git checkout <name> 或者git switch <name> -
创建+切换分支:git checkout -b <name> 或者git switch -c <name> -
合并某分支到当前分支:git merge <name> -
删除分支:git branch -d <name>
合并分支冲突
- 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
- 用
git log --graph 命令可以看到分支合并图。
分支管理策略
上面知识点的代码
可参考:git教程
|