【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。

news2024/11/15 12:04:22

目录

  • Git下载与安装
  • 设置Git
    • Git的用户设置
  • 使用Git
    • 新增初始Repository
    • 将文件交给Git管控(将文件加入暂存区)
    • 查看Git文件记录
      • 查找commit记录
      • 更改提交commit的记录
      • 撤销提交commit
    • 将某些文件取消Git版控
    • Git中删除或更改文件名
    • Git查看某个文件的某一行代码是谁写的
    • .git目录中有什么?
    • Git资源回收机制
      • Git什么时候会自动触发资源回收机制
  • Git使用分支
    • Git 查看、切换分支
      • 切换分支发生了什么
      • Git更改分支名和删除分支
    • Git合并分支:
      • A合并B 和 B合并A有什么不同?
    • 标签
      • 标签和分支的联系和区别?
    • Git远程连接Github
      • 将内容Push到GitHub
      • Pull下载更新
        • 多人开发时,一定一定要遵循**“先拉后推”**的顺序,先pull在本地解决冲突,然后在push上去。
      • 从服务器上去的Repository
    • PullRequest

Git下载与安装

windows操作系统下载Git,官方下载链接 git官网下载:
选择自己操作系统对应的版本即可,安装时只需要一路Next即可安装完成,安装完成后选择 Git Bash即可打开,输入git --version如果出现相关版本信息,就安装成功了。
在这里插入图片描述
Linux系统安装更简单,只需要apt-get install git或者sudo apt-get install git

打个广告全篇满满都是干货,看完即会,避免再去看书,省时省钱哦~
以下是本文总字数,包学会的。
在这里插入图片描述

设置Git

Git的用户设置

  1. 全局设置Git用户名和E-mail:
git config --global user.name "Eddie Kao"   # Eddie Kao换成自己的名字
git config --global user.name "eddir@qq.com"  #    eddir@qq.com换成自己的邮箱

git config --list  # 检查是否设置成功
  1. 局部设置Git用户,给每个项目设置不同的作者
git config --local user.name "Eddie Kao"   # Eddie Kao换成自己的名字
git config --local user.name "eddir@qq.com"  #    eddir@qq.com换成自己的邮箱

git config --global core.editor emacs # 将基本的vim编辑器改成Emacs
  1. 用户个性化设置(设置Git命令的缩写)
git config --global alias.co checkout  # 设置之后输入git co 等于输入git checkout
git config --global alias.br branch  # 设置之后输入git co 等于输入git checkout

使用Git

在这里插入图片描述
图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。

新增初始Repository

cd /tmp
git init # 对tmp这个目录进行git初始化版本控制
git status # 查看目录下的文件版本控制状态

想要该目录移除管控,则把.git文件删除即可。

将文件交给Git管控(将文件加入暂存区)

git add . # 将这个目录中的所有文件版控
git add --all # 将这个目录中的所有文件版控
git add *.html # 将这个目录中的后缀危.html的文件进行版控

# 将暂存区的文件加入到存储库存档
git commit -m "add html file"

git commit -a -m "add html file" # -a参数表示先add 再commit

查看Git文件记录

git log

git log --oneline --graph # 将输出结果更加精简化

查找commit记录

git log --oneline --author="xxx" # 查找xxx的commit
git log --oneline --grep="LOL" # 查找commit信息中包含LOL的内容
git log -p welcome.html # 查看welcome.html这个文件的commit记录

更改提交commit的记录

git commit --amend -m "Welcome file" # 修改最后一次commit信息

撤销提交commit

git log --oneline  # 查看Git记录

git reset master^
# 或者
git reset HEAD^

" ^ “这个符号表示“前一次”的提交,如果想要撤销前两次的提交,则是” ^^ "
HEAD是一个指标,指向某一个分支,通常当做“当前所在分支”

将某些文件取消Git版控

创建一个.gitignore文件,Git就会自动读取里面的文件,并进行管控:

touch .gitignore
vim .gitignore
# 将内容写入.gitignore
	secret.html
	*.yml
	*.json
	!index.json

则Git将不会把secret.html和所有后缀为yml和后缀为json的文件,但index.json文件除外(!表示除外)

Git中删除或更改文件名

# 删除文件
git rm welcome.html # 删除文件
git rm welcome.html --cached # 不删除文件,只是移除Git版控

# 更改文件名
git mv welcome.html world.html # 更改文件名

Git查看某个文件的某一行代码是谁写的

git blame index.html # 查看index文件的哪一行是谁在什么时候修改的
git blame -L 5,10 index.html # 查看第5~10行的内容

.git目录中有什么?

在Git中,有4种很重要的对象,分别是Blob对象,Tree对象,Commit对象和Tag对象。

  1. Blob对象
    例如:index.html当文件被加入暂存区无误后,Git则会在.git目录中生成一个Blob对象,这个对象会将html文件中的内容按照SHA-1的值进行计算,然后存储html文件的内容,可以使用git cat-file -t xxxx来查看xxx(SHA-1压缩值),用git cat-file -p xxxx来还原压缩值。
    因此,如果创建一个空的目录mkdir config,git’是检测不到这个空目录的,因为空的内容是不可以被压缩,即没有SHA-1值,所有git检测不到空的目录。
  2. Tree对象
    理解思路:Blob对象关注文件本身,Tree关注文件即目录的结构信息,Tree是一个有向无环图结构。
  3. Commit对象
    commit对象记录内容如下:
    a. 某个Tree对象;
    b. 本次commit的时间;
    c. 作者信息和本次commit的人
    d. 本次commit的信息
  4. Tag对象
    必须手动的吧Tag铁在某个Commit上, git tag -a big_treasure -n "tag在这里"使用这个命令后会创造一个 big_treasure的tag对象。
    总体理解思路:
    这4种类把Git中的文件(类似于葡萄一样,把跟拎起来就会把所有的葡萄都串起来)
    commit对象会指向某个Tree对象;
    Tree对象的内容会指向某个或者某些Blob对象或者其他的tree对象;
    除了第一个commit(初始的)对象外,所有的commit对象会指向前一次的commit对象;
    Tag对象会指向某一个Commit对象;
    分支虽然不属于这4种对象之一,但它会指向某个Commit对象;
    往Git服务器上推送之后,在.git/refs下就会多出一个remote目录,里面放的是远端的分支,基本上与本地分支类似,同样也会指向某个Commit对象
    HEAD也不属于这4种对象之一,它会指向某个分支。

Git资源回收机制

通常在Git觉得对象太多时会自动触发回收机制,也可以手动触发git gc回收机制,这样子就会把原本放在.git/objects目录下的全部对象打包到.git/objects/pack目录下。

Git什么时候会自动触发资源回收机制

  1. 当.git/object目录的对象或者打包的packfile数量过多时,Git会自动触发资源回收命令。
  2. 当执行git push命令将内容推送至远端时。
    对于内存空间问题,Git不是很在意,最主要的是版本迭代,因此,能够快速和高校的操作Git才是关键。

Git使用分支

分支其实可以想象成贴纸,贴在某一个Commit上,当做了一次新的commit时,这个新的commit会指向前一个commit(前面说过),分支就会贴到新的commit
Git中的分支不是通过复制目录活文件来进行改动形成的。

Git 查看、切换分支

git branch # 查看当前分支

在这里插入图片描述

git branch cat
git checkout cat # 切换到cat分支

在这里插入图片描述
注意,切换分支时必须该分支存在才行,如果改分支不存在,则会报错。

切换分支发生了什么

切换分支主要做了2件事:

  1. 更新暂存区和工作目录,当切换分支时,会用该分支指向的那个commit内容来“更新”暂存区及工作目录。但在切换分支之前所做的改动则会留在工作目录不收影响,即切换分支并不影响已经在工作目录中的那些改动。
  2. 变更HEAD的位置。除了更新暂存区和工作目录的内容外,HEAD也会指向刚刚切过去的那个分支,即.git/HEAD文件会一起被改动。

Git更改分支名和删除分支

git branch -m cat tiger

参数 -m表示修改分支名,原分支名 想要新修改分支名

git branch -d tiger # 如果想强制删除,则使用-D 参数进行强制删除

Git合并分支:

用master分支来合并cat分支:

# 先切换回master分支
git checkout master
# 使用git merge进行合并
git merge cat # 目前在master分支

A合并B 和 B合并A有什么不同?

从最终结果来看是一样的,但过程会有点区别。
假设master分支创建了dog和cat分支,并且现在正在cat分支:
1. 如果master要合并cat或者dog分支,Git直接使用快转模式进行合并,也就是直接收割cat或dog的成果。(因为cat和dog都是master创建的)

A合并B和B合并A的区别:
从最终结果来说,二者并没有什么区别,只是在合并过程中有区别;
cat和dog分支有相同的来源(master),当cat要合并dog或者dog要合并cat时,Git生成一个额外的Commit来处理,而一般的Commit只会指向某一个Commit,但是这个Commit会指向两个Commit,明确标记来自哪两个分支。
1. 假设想用cat分支来合并dog分支(现在在cat分支上)运行git merge dog
2. Git将生成额外的Commit对象,这个Commit会分别指向cat和dog分支,HEAD随着cat分支往前,而dog分支会停留在原地。(dog合并cat则反之)
二者区别:
1. 合并的分支会继续往前,被合并的分支就会停留在原地,HEAD也会随之指向到合并分支;
2. 为了合并而生成的额外的Commit对象,会记录是谁合并的谁(cat合并dog,则会记录cat在前;dog合并cat,则会记录dog在前)
其实所谓的合并分支,合并的不是分支,其实合并的是:分支指向的那个Commit,分支只是贴纸是没办法合并的。之所以说“合并分支”是比“合并commit”更好理解。

标签

标签是一个指向某个Commit的指示标,通常在开发软件是会完成特定的“里程碑”。
标签分为两种:

  • 轻量标签:只需直接指定要贴上去的那个Commit即可,命令git tag xxxx将xxx贴到当前的Commit上。轻量标签只是一个标签,不含有其他信息。
  • 附注标签:带有信息的标签
git tag tag_name -a -m "test tag"

其中,-a参数就是创建有附注的标签;后面的-m参数则是附注的信息(-d参数是删除标签,例如:git tag -d tag_name

标签和分支的联系和区别?

二者被删除时都不会影响到被指到的对象;
区别:分支会随着Commit移动而移动,但标签不会移动,一旦贴上,就停留在当前位置。因此,分支可以看做会移动的标签

Git远程连接Github

Git是工具,GitHub是网站,GitHub的本体是一个Git服务器。

将内容Push到GitHub

  1. 先在GitHub上创建新项目:在GitHub网站的右上角单击+,选择New respository ,如图所示
    a. Repository name可以随意填写,只要不重复就行。
    b. 存取权限选中Public单选按钮,免费试用。
    c. 单击Create repository按钮,即可增加一个Repository。
    d. 需要填写一个README.md文档(填不填都行)
    将一下流程走完就可以创建新的仓库了。
    在这里插入图片描述
    在这里插入图片描述
  2. 接下来就是我们熟悉的Git命令了
git init # 初始化.git
git add README.md # 添加README.md文档
git commit -m "first commit"
  1. 以上是简单的Git基本招式,接下来准备把内容推送到远端的Git服务器,首先需要设置一个元旦节点:
git remote add origin git@https://github.com/1841302012/yolov5.git

需要说明的是:
a. git remote指令主要进行与远端有关的操作;
b. add指令是指要加入一个远端的节点;
c. 这里的origin是一个代名词,指的是后面那串GitHub服务器的位置;
4. 将内容推送到远端服务器:

git push -u origin master

这个push指令做了:
a. 把master分支推向origin位置;
b. 在origin远端服务器上,如果master不存在,就创建一个名为master的分支;
c. 如果服务器上存在master分支,就会移动分为上的master分支的位置,使它指到当前最新的进度上。
d. -u参数表示upstream,将该分支设置为上游分支,以后的更新就会把这个当做默认值。(如果不设置上游分支,则Git不知道要将新内容提交到哪,就要每次都设置远端分支,比较麻烦)

Pull下载更新

pull命令是将远端代码拉回本机更新,但其实fetch才是下拉的主角。
直接输入命令git fetch,会发现没有任何变化,因为远端的代码并没有发生改变,因此,需要先改变远端代码,才能看到变化。
git pull = git fetch + git commit,git pull命令相当于去线上把内容抓下来冰鞋更新本机的进度。

多人开发时,一定一定要遵循**“先拉后推”**的顺序,先pull在本地解决冲突,然后在push上去。

因为本地计算机的内容可能是比较旧的,应该先拉一份在线版本的内容更新后再推上远程分支。

从服务器上去的Repository

当我们在GitHub上看到很有趣的项目时,如何把它拉到本地呢?

git clone https://github.com/1841302012/yolov5.git

即可把这个项目克隆到本地(clone只有第一次拉项目才使用)
在这里插入图片描述

PullRequest

当你在GitHub看到好的项目,并且想要帮忙开发时,由于该项目是别人的,你没有修改权限。
因此,你可以:
1. 先复制(fock)一份原作者的项目到自己的GitHub账号下;(因此你就有了权限)
2. 改完后再把项目推送上GitHub(Push);
3. 发个PullRequest通知告诉原作者,你修改了什么,做了那些事情;
4. 原作者看到如果觉得可以,就会进行merge,把你的分支合并到他的项目中。

感谢你看到了最后,这就是Git最常用的使用教程,相信你已经学会啦,快去注册GitHub账号试试吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试1、打开软件,测试2、克隆项目,测试 安装完成&#xf…

港股震荡中保持乐观,市场信心回来了!

港股上午盘三大指数集体上涨,恒生科技指数一度冲高至1.54%,最终收涨0.98%,恒生指数上涨1.06%。盘面上,大型科技股多数维持上涨行情,百度、腾讯涨超1.5%,快手、美团小幅上涨,阿里巴巴、京东飘绿&…

Java:Date类

文章目录 Date类常用方法代码演示 SimpleDateFormat常用方法代码演示时间格式常见符号SimpleDateFormat解析字符串为Date对象代码总结 案例:秒杀活动: 黑马学习笔记 这些方法在API文档都能查到 Date类 常用方法 代码演示 package Time;import java.uti…

杰发科技AC7801——Flash模拟EEP内存(2)

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容,等到打印完成 计算符合,从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t,因此最大值是65536,写65536…

mp总结 mybatisPlus

一、准备 1.引入依赖&#xff08;引入后可以不再引mybatis依赖&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> 2.…

Leetcode JAVA刷刷站(95)不同的二叉搜索数 ||

一、题目概述 二、思路方向 为了生成所有由 n 个节点&#xff08;值从 1 到 n&#xff09;组成的不同二叉搜索树&#xff08;BST&#xff09;&#xff0c;我们可以采用递归的方式。核心思想在于&#xff0c;对于每个数字 i&#xff08;从 1 到 n&#xff09;&#xff0c;我们可…

【C语言报错已解决】 `Buffer Overflow`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述&#x1f469;‍&#x1f52c;报错示例&#x1f4da;报错分析&#x1f4da;解决思路 二、解决方法&a…

麒麟V10(x86_64)安装部署MySQL-5.1.70

麒麟V10(x86_64)安装部署MySQL-5.1.70 1. 主机信息 [kalamikysrv1 ~]$ uname -a Linux kysrv1 4.19.90-24.4.v2101.ky10.x86_64 #1 SMP Mon May 24 12:14:55 CST 2021 x86_64 x86_64 x86_64 GNU/Linux [kalamikysrv1 ~]$ [kalamikysrv1 ~]$ uname -m x86_64 [kalamikysrv1 ~…

深度学习模板方法设计模式

文章目录 前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 模板方法设计模式是行为型设计模式&#xff0c;主要是定义算法框架&#xff0c;并将一些步骤的实现延迟到子类&#xff0c;重新定义算法的步骤。 一、介绍 模板设计模式…

项目初始化踩坑记录

dependence not found: D:/yupiProject/yubi-bi-frontend/node_modules/umijs/plugins/node_modules/react-intl 这个没有在github上找到解决方法&#xff0c;于是我在命令行 npm install 执行这个之后&#xff0c;就可以重新运行了 思考过程&#xff1a;突然空了个文件我…

开放式耳机是什么意思?开放式耳机推荐

在探讨音频设备的广阔领域中&#xff0c;开放式耳机以其独特的设计理念和卓越的性能体验&#xff0c;逐渐成为耳机市场上一股不可忽视的力量。顾名思义&#xff0c;开放式耳机是一种采用开放式设计&#xff0c;不堵塞或覆盖耳朵&#xff0c;允许佩戴者同时听到部分外部声音的耳…

Unity滚滚车轮计划 之 新输入系统控制2D角色移动动画(俯视)

本系列的初衷是因为很多时候基础代码不得不重复又重复&#xff0c;所以为了更快更好地学习到新的知识&#xff0c;我就把已经掌握的知识造成自己的轮子吧&#xff0c;等用到的时候直接复制就行了 叠甲&#xff1a;虽然不能保证全是原创&#xff0c;有些写法可能烂大街&#xff…

arm64--内嵌汇编

内嵌汇编代码基本用法 1.作用&#xff1a;对于特定重要和时间敏感的代码进行优化&#xff0c;同时在C语言中访问某些特殊指令&#xff08;例如内存屏障指令&#xff09;来实现特殊功能 2.内嵌汇编代码主要有两种形式 基础内嵌汇编代码&#xff1a;不带任何参数 扩展内嵌汇…

【ES6新特性】介绍ES6新特性的内容,如var,Let,Const声明变量的区别,解构赋值的概念,字符串的扩展,数组的扩展,以及对象的扩展。

目录 1.var&#xff0c;let&#xff0c;const的区别 1.1 var 1.2 let 1.3 const 1.4 区别总结 2.解构赋值 2.1 基本解构化赋值 2.2 数组取值 2.3 对象解构化赋值和取值 2.4 Math对象的解构化使用 3. 字符串扩展 3.1 新增字符串遍历方式 3.2 模版字符串 3.3 字符串…

数据库学习笔记

一、数据库相关概念 主流的关系型数据库管理系统&#xff08;DBMS&#xff09; 关系型数据库以 表格 的形式存在&#xff0c;以 行和列 的形式存取数据&#xff0c;关系型数据库这一系列的行和列被称为表&#xff0c;无数张表组成了 数据库 &#xff0c;常见的关系型数据库有 …

绿色积分引领:我店平台的可持续消费革命

在当今数字化浪潮的推动下&#xff0c;“我店”凭借其创新的环保积分系统&#xff0c;在消费市场中脱颖而出&#xff0c;逐渐改变着市场的结构。本文将详细分析该平台的竞争优势、市场策略以及它如何利用创新手段塑造未来的消费趋势。 一、环保积分&#xff1a;消费体验革新的关…

在ElementUI项目中集成iconfont图标库

在前端项目开发中经常会遇到使用的组件库提供的ICON图标不够用的情况。最常见的解决方案无非就是把设计图的图标切图引入到项目中。还有就是使用svg图标&#xff0c;封装一个渲染组件在项目里面直接引入这个组件。 本文将介绍另一种方法&#xff0c;即集成iconfont图标库的图标…

redis面试(二十二)读锁释放

假设现在已经有各种锁的重入什么的&#xff0c;那如何释放锁&#xff1f; 读锁读锁 假如说&#xff0c;同一个线程多次加读锁&#xff0c;或者不同的线程加了多个读锁 当前的锁结构长这样 anyLock: { “mode”: “read”, “UUID_01:threadId_01”: 2, “UUID_02:threadId_02…

CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(二)

CRUD老生常谈&#xff0c;但是我搜索了一圈&#xff0c;发觉几乎是着重在后端&#xff0c;也就是API部分&#xff01; 无外乎2个思路 1.归总的接口&#xff0c;比如一个接口&#xff0c;实现不同表的CRUD 2.基于各自的表&#xff0c;使用代码生成器实现CRUD 个人来说是推荐2&am…

css设置input单选radio多选checkbox样式

最近接手一个古老的项目&#xff0c;要修改里边的主题颜色&#xff0c;使用css的var方法一路轻松&#xff0c;最后在input的单选radio和多选checkbox被踩了刹车&#xff0c;也是有几年没做这种原始的项目手生了&#xff0c;最后经过几番折腾后&#xff0c;通过input的伪元素将其…