快速上手GIt,版本控制

快速上手Git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

版本控制

什么是版本控制?

版本控制是一种在开发过程中用于管理文件、目录、工程等内容的修改,方便查看历史记录,备份,恢复以前版本的软件工程技术。

Git总的来说技术支持管理多人协同开发项目的技术

Git环境配置

下载Git

下载地址https://git-scm.com/downloads

这里不详细演示下载详情,记住你的安装路径

快速上手GIt,版本控制_第1张图片

认识Git

安装完后,在开始栏有Git Bash(采用Linux命令)、Git CMD(Win命令)、Cit GUI(图形界面),一般使用Git Bash。

快速上手GIt,版本控制_第2张图片

使用Git的基本Linux命令

指令 含义 指令 含义
cd … 回退上级目录,直接cd进入默认目录 cd 目录 改变目录
pwd 显示当前路径 ls (-l) 显示本目录所有文件,加上ll显示详细
clear 清屏 reset 重新初始化终端/清屏
mkdir 目录 创建文件夹 rm 文件名 删除文件
rm -r 目录 删除一个文件夹 mv 文件名 目录 移动文件到指定目录
touch 文件名 新建文件 history 查看历史命令
exit 退出 命令 # #是注释

常见的Git配置命令

命令 含义 命令 含义
git config -l 查看配置列表 git config --system -l 查看系统配置列表
git config --global user.email “邮箱” 配置邮箱 git config --global -l 查看本地配置列表(自己配的)
git config --global user.name “用户名” 配置用户名 git config --list 效果对于git config -l

git config --system -l 系统配置文件位于:你git安装目录下的 …\Git\etc\gitconfig 下

git config --global -l 查看本地配置文件位于:你用户目录下比如我的是 C:\Users\Dell\gitconfig

你配置的环境都在全局配置下,可以在任意一个文件夹使用

Git的设计理论

工作区域

Git本地有3个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。

如果加上git的远程仓库(Remote Directory)就可以分为四个工作区。

  • 工作区:存放项目文件的地方。
  • 暂存区:临时存放项目文件的改动信息,一般存放在 .git 目录下的 index 文件(.git/index)中,只是一个文件。
  • 仓库区(本地仓库、版本库):本地安全存放数据的位置,里面存放着提交到所有版本的数据,其中HEAD指向最新放入仓库的版本,在.git隐藏文件夹下的HEAD
  • 远程库(Remote):托管代码的服务器,服务器安全存放数据的位置,里面存放着提交到所有版本的数据。GitHub、Gitee
  • **版本库:**工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库,需要打开显示隐藏文件才能看到。

快速上手GIt,版本控制_第3张图片

工作区域提交与撤回命令

快速上手GIt,版本控制_第4张图片

上面这个图展示了工作区、版本库中的暂存区和版本库之间的关系

  • 图中左侧为工作区(我们可以看到的目录),右侧为版本库(.git)。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。

  • 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。下图是HEAD存放的内容

    快速上手GIt,版本控制_第5张图片

  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。

  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中

  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

  • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。–撤回

  • 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。

  • 当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

  • 当执行 git checkout HEAD . (.代表全部)或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

    版本库(.git文件隐藏文件)结构如下

快速上手GIt,版本控制_第6张图片

Git的执行流程

1、初始化一个git仓库

git init

Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。

在当前目录生成.git文件,那么这个目录就是我们的工作区,.git文件就是我们的版本库

git init 目录

在指定目录生成.git文件

或者我们可以远程克隆一个git仓库

git clone [directory]

克隆仓库到[directory]目录,默认克隆到当前目录。例:git clone git://github.com/schacon/grit.git

2、提交修改/新增文件到暂存区

git add

一般使用:git add .提交本工作区所有修改/新增文件到暂存区

git status

查看提交状态,显示有变更的文件。

3、提交暂存区到本地仓库

在提交之前,你需要先把你的用户名和邮箱设置一下

git config --global user.name “你的github用户名”

git config --global user.email “你的邮箱”

–global是全局配置,设置后下次就不用再设置了

git config --global -l

上述指令查看你的设置成功了没有

git commit -m [message]

把暂存区的文件提交到本地仓库,其中[message]是提交描述,例如:git commit -m “第一次提交”

如果你想直接提交到本地仓库而不经过暂存区可以直接使用:

git commit -am [message]

例如:git commit -am “不经过暂存区提交到本地” ,这样就提交到本地了

4、提交本地仓库到远程仓库

git push <远程主机名> <本地分支名>:<远程分支名>

如果本地分支名和远程分支名一样可以写成:

git push <远程主机名> <本地分支名>

例如:git push origin master 将本地的 master 分支推送到 origin 主机的 master 分支。注意他只会提交当前工作区的分支。什么是分支,下面会继续讲述。

在这里各位可能有一个疑问,git怎么就找到我们远程仓库对应的地址的呢?

打开.git文件夹,找到config文件,这个url就是你的git要提交的远程仓库的地址。branch "main"就是main分支。

快速上手GIt,版本控制_第7张图片

下面是本次操作流程的示意图:

快速上手GIt,版本控制_第8张图片

Git的文件操作

文件状态

文件的4种状态

之前提到的版本控制,是对文件的控制,对文件进行修改提交等操作,当了解到这个文件处于什么状态才能熟练控制各个文件。

  • Untracked:未跟踪状态,此文件在工作区中,但是并没有加入到版本控制库中(.git文件),可以通过git add .命令转为Staged状态。
  • Unmodify:未修改状态,文件已经入版本控制库并且库中的内容快照与工作区的内容完全一致。此时可以通过在工作区修改文件将其变为Modified状态,或者使用git rm移除版本库,此时变为Untracked状态
  • Modified:已修改状态,文件在版本库中且库中的内容快照与工作区的内容不同。可以通过git add .命令转为Staged状态,使用git checkout则丢弃修改,返回到Unmodify状态(这个丢弃修改就是把库中的快照覆盖工作区的文件,慎用)。
  • Staged:暂存状态,文件在版本控制库中,同时这个文件也可能是未修改状态也可能是已修改状态。使用git commit命令将暂存区同步到本地仓库中,(未修改状态的文件是无法提交的)或者执行git reset HEAD暂存区的目录树会被 master 分支指向的目录树所替换,但是工作区不受影响

查看文件状态

git status

忽略文件

有时候我们不想把某些文件纳入版本控制库中,比如数据库文件,临时文件,设计图文件等等

在主目录下建立“.gitignore”文件,文件内容填写忽略信息,规则如下:

  • 忽略文件中的空行或以"#"开头的行

  • 使用Linux通配符忽略文件。例:*(任意多字符),?(单字符),[](方框内的字符如:[abc]),{String1,String2...}(花括号内字符串)

  • 不忽略文件,最前面加上"!"

  • 如果名称最前面是一个"/",表示要忽略的文件在此目录下,不忽略子目录文件

  • 如果名称最后面是一个"/",表示要忽略的是此目录下该名称的子目录,而非文件(不加"/"表示都忽略)

    #表注释
    *.txt   # 忽略所有 .txt 结尾的文件
    *.class  # 忽略所有 .class 结尾的文件 可以理解为字节码文件
    !lib.txt  # lib.txt 不忽略 优先级略高 *
    /temp  # 忽略temp文件 
    temp/  # 忽略temp目录下的文件及文件夹
    

配置SSH公钥

一般使用GitHub,或者Gitee时候提交任务我们都不使用账号密码验证,一般都是以公密钥配对的方式提交,实现免密登录,首先需要生成你的公钥代码如下:

//在生成公钥前你需要设置你的用户名和邮箱
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
    
//然后使用下面这条命令
ssh-keygen -t rsa -C "邮箱[email protected]"
//注意:这里的 邮箱[email protected] 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
//现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。

按照提示完成三次回车,即可生成 ssh key。快速上手GIt,版本控制_第9张图片

现在ssh公钥生成了怎么样查看你的公钥放在哪呢?输入以下命令

快速上手GIt,版本控制_第10张图片

其中箭头指向的文件夹就是你的公钥存放的位置,打开文件夹,找到id_rsa.pub复制里面所有的内容。

快速上手GIt,版本控制_第11张图片

给Gitee配置公钥

来到你Gitee的设置,找到SSH公钥

快速上手GIt,版本控制_第12张图片

快速上手GIt,版本控制_第13张图片

把你的公钥粘贴上去,输入标题,确定即可。

此时你会收到Gitee发来的邮箱,提醒你绑定了公钥。

接下来来到Git命令行验证一下是否链接到了Gitee。输入:

ssh -T git@gitee.com

有yes就输yes,直到看到 Hi 你的用户名! …的就可以 了。image-20211102095634120

给Github配置公钥

同样来到你的GitHub设置

快速上手GIt,版本控制_第14张图片

找到

快速上手GIt,版本控制_第15张图片

点击New SSH key 粘贴你的复制的密钥添加标题确认即可,

然后加入git命令行输入以下命令验证

ssh -T git@github.com

快速上手GIt,版本控制_第16张图片

使用IDEA操作Github/Gitee

详细见我这一篇博客:使用idea操作git

操作Gitee同理,直接从上述链接的4.将GitHub上的仓库克隆到你的Idea开始,把这个链接改成Gitee的即可

Git的分支

分支是Git的难点,比如在一个稍微大一点的项目中可以看到,还可能有v3.0 ,v4.0等等

快速上手GIt,版本控制_第17张图片

可以详细参考的这篇博客

Git的分支是什么

​ 顾名思义,分支就是从主线上分离出来进行另外的操作,而又不影响主线,主线又可以继续干它的事,是不是有点像线程,最后分支做完事后合并到主线上而分支的任务完成可以删掉了。这样是不是很方便,主线继续做它的事,分支用来解决临时需求,二者互不相干。

git的分支功能特别的强大,它不需要将所有数据进行复制,只要重新创建一个分支的指针指向你需要从哪里开始创建分支的提交对象(commit),然后进行修改再提交,那么新分支的指针就会指向你最新提交的这个commit对象,而原来分支的指针则指向你原来开发的位置,当你在哪个分支开发,HEAD就指向那个分支的最新提交对象commt。没弄清楚没关系,先有这么一个概念,后面慢慢就会弄清的。

GIt分支的命令

#列出本地所有分支,带*的是当前分支
git branch

#列出远程所有分支
git branch -r

#新建一个分支,而这个分支的指针就指向最新的commit对象,也就和HEAD指向同一对象
git branch 分支名

#切换到这个分支
git branch 分支名

#合并指定分支到当前分支
git merge 分支名

#删除分支
git branch -d 分支名

#删除远程分支
git branch -dr 分支名
#或 origin是主机名
git push origin -delete 分支名  

推荐大家详细看一下可以详细参考的这篇博客

写在后面:

感谢你看到这个,笔者目前也是一个还有很多知识需要学习的学生,希望我们一起进步。

对于Git操作这篇博客主要是我用来记录我操作的过程以免遗忘,如果各位有什么疑问欢迎骚扰,有时间我会回复。

你可能感兴趣的:(git,github,linux)