初识git

一、初识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_rsaid_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,在后台页面找到删除按钮再删除。

从远程库克隆

  • 首先,登陆GitHub,创建一个新的仓库,名字叫gitskills,我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件在这里插入图片描述

  • 远程库已经准备好了,下一步是用命令git clone克隆一个本地库:

$ 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教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值