Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
什么是版本控制?
版本控制是一种在开发过程中用于管理文件、目录、工程等内容的修改,方便查看历史记录,备份,恢复以前版本的软件工程技术。
Git总的来说技术支持管理多人协同开发项目的技术
下载地址https://git-scm.com/downloads
这里不详细演示下载详情,记住你的安装路径
安装完后,在开始栏有Git Bash(采用Linux命令)、Git CMD(Win命令)、Cit GUI(图形界面),一般使用Git Bash。
使用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本地有3个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。
如果加上git的远程仓库(Remote Directory)就可以分为四个工作区。
工作区域提交与撤回命令
上面这个图展示了工作区、版本库中的暂存区和版本库之间的关系
图中左侧为工作区(我们可以看到的目录),右侧为版本库(.git)。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。下图是HEAD存放的内容。
图中的 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 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
git add
一般使用:git add .
提交本工作区所有修改/新增文件到暂存区
git status
查看提交状态,显示有变更的文件。
在提交之前,你需要先把你的用户名和邮箱设置一下
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 “不经过暂存区提交到本地” ,这样就提交到本地了
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名和远程分支名一样可以写成:
git push <远程主机名> <本地分支名>
例如:git push origin master 将本地的 master 分支推送到 origin 主机的 master 分支。注意他只会提交当前工作区的分支。什么是分支,下面会继续讲述。
在这里各位可能有一个疑问,git怎么就找到我们远程仓库对应的地址的呢?
打开.git文件夹,找到config文件,这个url就是你的git要提交的远程仓库的地址。branch "main"就是main分支。
下面是本次操作流程的示意图:
文件的4种状态
之前提到的版本控制,是对文件的控制,对文件进行修改提交等操作,当了解到这个文件处于什么状态才能熟练控制各个文件。
Untracked
:未跟踪状态,此文件在工作区中,但是并没有加入到版本控制库中(.git文件),可以通过git add .
命令转为Staged
状态。Unmodify
:未修改状态,文件已经入版本控制库并且库中的内容快照与工作区的内容完全一致。此时可以通过在工作区修改文件将其变为Modified
状态,或者使用git rm
移除版本库,此时变为Untracked
状态Modified
:已修改状态,文件在版本库中且库中的内容快照与工作区的内容不同。可以通过git add .
命令转为Staged
状态,使用git checkout
则丢弃修改,返回到Unmodify
状态(这个丢弃修改就是把库中的快照覆盖工作区的文件,慎用)。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目录下的文件及文件夹
一般使用GitHub,或者Gitee时候提交任务我们都不使用账号密码验证,一般都是以公密钥配对的方式提交,实现免密登录,首先需要生成你的公钥代码如下:
//在生成公钥前你需要设置你的用户名和邮箱
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
//然后使用下面这条命令
ssh-keygen -t rsa -C "邮箱[email protected]"
//注意:这里的 邮箱[email protected] 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
//现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。
现在ssh公钥生成了怎么样查看你的公钥放在哪呢?输入以下命令
其中箭头指向的文件夹就是你的公钥存放的位置,打开文件夹,找到id_rsa.pub复制里面所有的内容。
来到你Gitee的设置,找到SSH公钥
把你的公钥粘贴上去,输入标题,确定即可。
此时你会收到Gitee发来的邮箱,提醒你绑定了公钥。
接下来来到Git命令行验证一下是否链接到了Gitee。输入:
ssh -T git@gitee.com
有yes就输yes,直到看到 Hi 你的用户名! …的就可以 了。
同样来到你的GitHub设置
找到
点击New SSH key 粘贴你的复制的密钥添加标题确认即可,
然后加入git命令行输入以下命令验证
ssh -T git@github.com
详细见我这一篇博客:使用idea操作git
操作Gitee同理,直接从上述链接的4.将GitHub上的仓库克隆到你的Idea开始,把这个链接改成Gitee的即可
分支是Git的难点,比如在一个稍微大一点的项目中可以看到,还可能有v3.0 ,v4.0等等
可以详细参考的这篇博客
顾名思义,分支就是从主线上分离出来进行另外的操作,而又不影响主线,主线又可以继续干它的事,是不是有点像线程,最后分支做完事后合并到主线上而分支的任务完成可以删掉了。这样是不是很方便,主线继续做它的事,分支用来解决临时需求,二者互不相干。
git的分支功能特别的强大,它不需要将所有数据进行复制,只要重新创建一个分支的指针指向你需要从哪里开始创建分支的提交对象(commit),然后进行修改再提交,那么新分支的指针就会指向你最新提交的这个commit对象,而原来分支的指针则指向你原来开发的位置,当你在哪个分支开发,HEAD就指向那个分支的最新提交对象commt。没弄清楚没关系,先有这么一个概念,后面慢慢就会弄清的。
#列出本地所有分支,带*的是当前分支
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操作这篇博客主要是我用来记录我操作的过程以免遗忘,如果各位有什么疑问欢迎骚扰,有时间我会回复。