Git 基础详解

1. 基本概念 

Git是一个免费、开源的 `分布式版本控制系统`,可以高效处理小到大型的各种项目。

1.1 版本控制

版本控制:它是一种用于追踪和记录文件、目录、项目或软件的变化,以便将来查阅、比较、修订不同版本文件的系统

版本控制系统(VCS)是实现版本控制的一组工具,它们允许用户:

  1. 提交(Commit):将更改保存到版本库中,每次提交都会创建一个新的版本或快照。
  2. 分支(Branch):创建项目的一个副本,以便在不干扰主项目的情况下进行开发。
  3. 合并(Merge):将不同分支上的更改合并到一起,通常是在完成一个功能或修复一个错误后。
  4. 打标签(Tag):为特定的版本或提交点添加标签,以便将来可以轻松引用它们。
  5. 查看历史(History):查看项目的更改历史,了解谁在何时进行了哪些更改。
  6. 回滚(Rollback):将项目恢复到之前的状态,如果当前状态存在问题或不符合预期。

版本控制有两种主要类型:集中式版本控制和分布式版本控制。

  • 集中式版本控制所有的更改都集中存储在一个服务器上,团队成员通过客户端连接到服务器来提交和获取更改。如 CVS和SVN

  • 分布式版本控制每个团队成员都有一个完整的代码仓库副本,包括所有的文件修订版本和历史记录。如 Git。

两者相较之下,分布式版本控制提供了更高的灵活性和安全性,因为即使中央服务器出现问题,团队成员仍然可以从自己的本地仓库中恢复数据。

总之,对于小型团队和简单项目集中式版本控制更合适,而对于大型项目或需要高度灵活性和协作的团队,分布式版本控制工具则更具优势。


1.2  Git 仓库 

Git仓库是Git版本控制系统的核心,它用于存储和管理项目的代码、文件以及版本历史记录。Git仓库可分为本地仓库和远程仓库。

1. 本地仓库

Git的本地数据管理分为三个区域:工作区,暂存区,版本库(或称本地仓库)

工作区(生产):当前开发的目录,是存放项目文件的地方。(也就是你敲代码的区域)

暂存区(缓存修改,等待一次性提交):stage/ index。也称为索引区或暂存区,用于临时存放被修改但尚未提交到本地仓库的文件。

版本库(提交更新版本):保存项目的所有版本,包括提交的历史记录和分支信息。


2. 远程仓库

Git远程仓库是存储在服务器上的Git仓库副本,通常托管在代码托管平台(GitHub、Gitee等)上。它允许开发者将本地代码与远程仓库同步,从而实现协作和备份。


3. Git基本工作机制


2. 基本使用

2.1 安装Git

官方网址:Git

git 命令大全,参考:Git - Reference (git-scm.com)

文件编辑器命令,参考: 下方 “5. Git bash指令和vim编辑


2.2 创建仓库

创建仓库一般有两种方式:

  • 一种是通过指令 git init   直接创建本地仓库。
  • 另一种是通过 指令 git clone <git 仓库地址>  从远程服务器上克隆一个已经存在的仓库
git init                              使用当前目录作为 Git 仓库,
git init <目录>                       使用我们指定目录作为Git仓库。

git clone  <git仓库地址>              克隆远程仓库到当前目录
git clone  <git仓库地址>  <本地目录>  克隆远程仓库到指定目录

2.3 配置仓库

git config --list		显示当前git信息(wq退出)

编辑配置文件
git config -e           针对当前仓库 
git config --global     针对系统上所有仓库

设置代码提交的用户信息
git config --global  user.name “your name”
Git config --global  user.email 邮箱

2.4 暂存文件

git add         添加文件到暂存区
git status		查看仓库当前状态,显示所有变更文件
git rm --cached <file> 把文件从暂存区域移除,而工作区仍保留,即仅是从跟踪清单中删除

注意:如果没有设置-m选项,默认打开vim。(编辑器填写提交信息)

示例: 

添加file.txt到暂存区

 移除对file.txt的跟踪


2.5 提交版本

git commit		                 提交暂存区到本地仓库
git commit -m [message]          提交暂存区到本地仓库,message 可以是一些备注信息
git commit [file1] [file2] ... -m [message]  提交指定文件

git log                          查看历史提交记录
git log --oneline                以简洁的一行格式显示提交信息。

 提交暂存区的file.txt

 

working directory clean说明我们在最近一次提交之后,没有做任何改动

查看提交信息


2.6 版本回退

git reset [--soft | --mixed | --hard] [HEAD]
mixed 默认参数,丢弃暂存区,保留工作区的修改内容

HEAD:            指向当前版本
HEAD~1 或 HEAD^:指向上一个版本
HEAD~2:         指向上上一个版本

回退到上个版本并且不丢弃工作区和暂存区的内容

git reset --soft HEAD~3   # 回退到上上上一个版本
git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。
git reset --hard origin/master    # 将本地的状态回退到和远程的一样

注意:谨慎使用 –-hard 参数,它会删除回退点之前的所有信息。


2.7 比较文件

git diff		                        默认比较:工作区与暂存区差异
git diff --cached 或 git diff --staged  显示暂存区和上一次提交(commit)的差异
git diff [版本ID]...[版本ID]            显示某两次提交之间的差异

修改file2.txt后,比较暂存区和工作区的区别

比较上个版本和这个版本的差异:git diff HEAD~2  HEAD

  • HEAD:代表当前分支的最新提交。
  • HEAD~1 或 HEAD^:代表当前分支的最新提交的前一个提交(即父提交)。
  • HEAD~2:代表当前分支的最新提交的前两个提交(即祖父提交)。

2.7 删除文件

git rm <file>             将文件从暂存区和工作区中删除
git rm --cached <file>    将文件从暂存区中删除,而保留工作区
git rm –r *               进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f

强行从暂存区和工作区中删除修改后的 file2.txt 文件:


2.8 撤销文件更改

git restore <file>       将指定文件恢复到最新的提交状态,丢弃所有未提交的更改

git restore --staged <file>    如果你已经使用 git add 将文件添加到暂存区,但希望撤销这些更改

git restore .  还原所有未提交的更改,包括工作目录和暂存区的更改(使用这个命令要谨慎,因为它会清除所有未提交的修改)

3. 分支操作

Git 分支允许你在主代码线(通常是 master 或 main 分支)之外进行开发,而不影响主代码线的稳定性和完整性。

一个分支代表一条独立的开发线使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

作用:提高团队协作的效率,减少冲突和错误的影响,让团队中的每个人都能进行独立的开发和测试

注意:分支开发完后:不会影响master分支

3.1 基本指令

git branch (branchname)         创建分支
git switch -c <new-branch-name> 创建并切换到新的分支

git switch <branch-name>        切换分支
git branch                      列出分支
git branch -d (branchname)      删除分支

创建分支xuetao ,并切换过去 

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。 


3.2  合并冲突

git merge <branchname>   将其他分支合并到当前分支

当多个分支修改了同一部分代码,在进行分支合并时,就会产生冲突。这个时候就需要认为来检查解决冲突。 

当合并过程中出现冲突时,Git 会标记冲突文件,你需打开冲突文件,按照标记解决冲突,手动解决冲突。

在分支的工作区修改文件file.txt,(vim:在编辑模式下编辑文件)

fate分支修改文件并提交

xuetao分支修改并提交

查看master分支下,主分子看不到其他分支的提交,说明其他分支的开发不影响主分支

在master分支下,将fate分支合并到master分支

git merge fate

git add file.txt
git commit -m "master提交fate分支对file.txt的修改"

在master分支下,将xuetao分支合并到master分支

发生冲突

通过编辑器打开冲突文件file.txt来手动解决冲突        vim file.txt

 提交解决冲突后的文件

git merge fate

vim file.txt             手动解决冲突
git add file.txt
git commit -m "master合并了xuetao分支,解决了冲突,并提交"

注意:合并分支后,要对合并后的文件进行提交。解决冲突后要提交所有暂存区内容,而不能只提提交部分文件(会报错)

3.3 终止合并

如果需要,也可以终止合并:git merge --abort


4. 远程仓库

远程仓库平台:

Gitee - 基于 Git 的代码托管和研发协作平台

GitHub: Let’s build from here · GitHub   ,需要挂梯子

4.1 基本使用

本地仓库关联远程仓库

git remote add origin <远程URL>            关联
git push               推送
git pull               拉取

从创建本地仓库到关联远程仓库

git 全局配置

设置代码提交的用户信息
git config --global  user.name “your name”
Git config --global  user.email 邮箱

创建仓库

mkdir remote_repo
cd remote_repo
git init 
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin <远程URL>
git push -u origin "master"

已有仓库

cd existing_git_repo
git remote add origin <远程URL>
git push -u origin "master"

本地推送文件成功:

服务器上的远程仓库查看:


4.2 关于公私钥配置

在Git中,公私钥配置通常用于通过SSH(Secure Shell)协议安全地与远程仓库进行通信,而无需在每次操作时输入用户名和密码。

检查本地主机是否已经存在ssh key

cd ~/.ssh
ls
//看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key

 

生成密钥对

  • 打开终端或Git Bash,输入命令,
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa 表示使用RSA算法
-b 4096 表示密钥长度为4096位
-C 后跟的是你的邮箱地址,用于标识这个密钥

回车后,系统会提示你输入保存密钥的文件名和位置。通常,它会默认保存在 ~/.ssh/ 目录下,并命名为 id_rsa(私钥)和 id_rsa.pub(公钥)。

配置公钥

  • 添加公钥到远程服务器或代码托管平台(公钥通常保存在 ~/.ssh/id_rsa.pub 文件中)
cd ~/.ssh
cat id_rsa.pub //获取ssh key公钥内容(id_rsa.pub)

如下图

 

把公钥添加到gitHub等代码托管平台

使用私钥进行认证

  • 配置SSH客户端:确保你的SSH客户端(通常是Git自带的)知道要使用哪个私钥。

如果你只生成了一个密钥对,并且它保存在默认位置(~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub),则无需进行额外配置。
如果你生成了多个密钥对,或者将密钥保存在了非默认位置,你可能需要编辑 ~/.ssh/config 文件来指定每个密钥对应的远程主机或服务。

测试连接

  • 使用命令 ssh -T username@hostname来测试连接

将 username 和 hostname 替换为你的远程服务器或代码托管平台的用户名和主机名。

如果一切正常,你应该能够成功连接到远程服务器而无需输入密码。 

注意之后在clone仓库的时候要使用ssh的url,而不是https!


4.3 远程仓库指令

git remote add <别名> <url>    关联远程仓库
git clone <url>                克隆远程仓库

git remote -v          查看关联的所有远程仓库
git remote rm  <别名>  删除远程仓库

分支相关

git clone -b <分支名><url>           克隆远程仓库的指定分支

git branch -r                         查看远程分支
git push origin --delete <branchname> 删除远程分支

git push 远程仓库别名/分支名          推送到指定分支

git merge origin/master              将远程分支合并到本地分支

拉取远程分支 git fetch  <远程仓库别名>        

用于从远程仓库获取最新的历史记录和数据,但不会自动合并或修改你当前的工作。这个命令主要用于同步远程仓库的变化到你的本地仓库中,以便你可以查看有哪些更新,或者决定如何将这些更新合并到你的工作中。

拉取远程最新代码:git pull 

默认情况下,git pull 会从当前分支的远程跟踪分支(通常是 origin/当前分支名)拉取代码,并尝试将这些更改合并到你的本地分支中。

如果你想要从特定的远程分支拉取代码,你可以指定远程仓库名和分支名,如下所示

git pull origin branch-name       
origin 远程仓库的默认名称
branch-name 是你想要从中拉取代码的远程分支的名称

注意事项
冲突解决:如果拉取下来的代码与你的本地更改存在冲突,Git将暂停合并操作,并要求你解决这些冲突。

更新本地分支:有时,你可能想要将远程分支的最新更改拉取到你的本地分支,但不立即合并。在这种情况下,你可以使用 git fetch 命令来更新你的远程跟踪分支,然后手动合并或使用其他Git命令来处理这些更改。

检查远程分支:如果你不确定远程仓库上有哪些分支,可以使用 git branch -r 命令来查看远程跟踪分支。

配置上游跟踪:如果你刚开始在一个新的分支上工作,并希望该分支跟踪远程仓库中的相应分支,你可以使用 git branch --set-upstream-to=origin/branch-name 命令来设置上游跟踪。之后,你就可以直接使用 git pull 而不必指定远程分支名了。

拉取和合并分开进行:虽然 git pull 是 git fetch 和 git merge 的组合,但你也可以分开执行这两个命令以获得更多控制。首先运行 git fetch 来获取远程更改但不合并它们,然后你可以使用 git merge 或其他Git命令(如 git rebase)来合并这些更改。

注意:不存创建远程仓库分支的命令,因为远程仓库中的分支只是一个对本地分支引用历史的跟踪。所以要在远程仓库中创建一个新的分支,你应该在本地创建一个分支,然后将其推送到远程仓库。


5. Git bash指令和vim编辑

5.1 Git bash常用指令

mkdir + <文件名> 创建目录

touch 创建文件

cat 查看文件内容(一次性将内容全部显示)

less 查看文件内容(显示部分信息)--再次输入‘回车’一行一行显示,‘空格’一页一页显示 ,‘b’一次向上走一页

cp( copy )复制文件如复A文件夹下的所有子文件、目录到 B 文件夹  cp -r A/* B

echo ‘内容’ > 文件名 (输出内容到文件中,每次输入都是覆盖原来的文件)

echo ‘内容’ >>文件名(输出内容到文件中,每次输入都是追加新内容)

q 退出

pwd创建版本库显示当前目录

ls ( list ) 查看当前目录下的内容

ll 列出的内容更为详细ll 列出的内容更为详细

ls -al 包括隐藏文件和以 开头的文件

clear 清屏


5.2 vim打开、修改、保存文件

一、vim 有两种工作模式:

1.命令模式:接受、执行 vim操作命令的模式,打开文件后的默认模式;

2.编辑模式:对打开的文件内容进行 增、删、改 操作的模式;

3.在编辑模式下按下ESC键,回退到命令模式;在命令模式下按i,进入编辑模式

二、创建、打开文件:

1.输入 touch 文件名 ,可创建文件。

2.使用 vim 加文件路径(或文件名)的模式打开文件,如果文件存在则打开现有文件,如果文件不存在则新建文件。

3.键盘输入字母i进入插入编辑模式。

三、保存文件:

1.在编辑模式下编辑文件

2.按下ESC键,退出编辑模式,切换到命令模式。

3.在命令模式下键入"ZZ"或者":wq"保存修改并且退出 vim。

4.如果只想保存文件,则键入":w",回车后底行会提示写入操作结果,并保持停留在命令模式。

四、放弃所有文件修改:

1.放弃所有文件修改:按下ESC键进入命令模式,键入":q!"回车后放弃修改并退出vim。

2.放弃所有文件修改,但不退出 vi,即回退到文件打开后最后一次保存操作的状态,继续进行文件操作:按下ESC键进入命令模式,键入":e!",回车后回到命令模式。


6. VS code 关联远程仓库

虽然通过 bash终端,我们可以使用指令来关联远程仓库,并完成相关操作。但VS code提供了更形象,简单的UI界面来进行相关操作

初始化本地仓库

添加文件到暂存区,以及提交暂存到版本库的功能

关联远程仓库



并且下方会自动显示你的提交记录


 若有错误或描述不当的地方,烦请评论或私信指正,万分感谢 😃

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博通网络交换芯片

参考视频&#xff1a;不懂网络芯片秒怂? 航家带你提逼格 | #1 博通Trident芯片系列_哔哩哔哩_bilibili

Java入门十三——继承(super)

大家好&#xff0c;今天怒更两篇hhhhh&#xff0c;干货满满&#xff01; 一、继承 今天我们要讲的内容是继承~这次我们依然拿动物举例&#xff01; 首先&#xff0c;我们创建了一个鸟类&#xff08;不是骂人啊&#xff0c;就是bird鸟类&#xff09; public class bird {publ…

操作系统学习笔记-3.1内存管理

文章目录 内存的地址绝对装入静态重定位动态重定位 链接覆盖和交换1. 覆盖&#xff08;Overwrite&#xff09;在内存管理中的作用2. 交换&#xff08;Swap&#xff09;在内存管理中的作用 连续分配管理方式固定分区分配的关键概念优点缺点示例动态分区分配的关键概念优点缺点示…

练习LabVIEW第四十题

学习目标&#xff1a; 用labvIEW做一个循环闪烁指示灯&#xff0c;要能够在前面板调节周期和占空比。 开始编写&#xff1a; 前面板 一个布尔指示灯一维数组&#xff0c;两个数值输入控件&#xff1b; 程序框图 添加一个while循环&#xff0c;循环内添加初始化数组&…

Unity 打包AB Timeline 引用丢失,错误问题

1、裁剪 在 link.xml 添加 <assembly fullname"Unity.Timeline" preserve"all"/> 上面这一步我其实做了&#xff0c;但还是不行&#xff0c;各种搜索&#xff0c;不得解&#xff0c;还有创建一个空的Timeline 放到 Resources目录下的&#xff0c;也…

206面试题(28~46)

206道Java面试题&#xff08;28~46&#xff09; 28.Array和ArrayList有什么区别&#xff1f; 一、基本性质 Array(数组) Array是一种固定大小的数据结构。 用于存储多个相同类型的元素。 创建时需要指定数组的大小&#xff0c;且长度定义完后不能改变。 ArrayList(动态数组)…

Echarts使用柱状图实现横向数据展示,实现为每个柱子设置不同的颜色

这里使用echarts柱状图实现横向数据展示&#xff0c;同时给每个柱子设置不同的颜色&#xff0c;给柱子设置背景颜色等 话不多说直接上图吧 这里直接贴上代码&#xff1a; option {backgroundColor: "#1C162E", //背景颜色tooltip: {show: false},legend: {show: …

接口测试(十一)jmeter——断言

一、jmeter断言 添加【响应断言】 添加断言 运行后&#xff0c;在【察看结果树】中可得到&#xff0c;响应结果与断言不一致&#xff0c;就会红色标记

一文详解开源ETL工具Kettle!

一、Kettle 是什么 Kettle 是一款开源的 ETL&#xff08;Extract - Transform - Load&#xff09;工具&#xff0c;用于数据抽取、转换和加载。它提供了一个可视化的设计环境&#xff0c;允许用户通过简单的拖拽和配置操作来构建复杂的数据处理工作流&#xff0c;能够处理各种数…

Oracle 11g DataGuard GAP处理

1 说明 在Oracle Data Guard中&#xff0c;GAP是指在备库无法接收到一个或多个来自主库的归档日志文件时发生的情况&#xff0c;会导致数据保护和实时数据复制的能力受到影响。 Oracle Data Guard架构日志同步有三个阶段&#xff1a; 日志发送&#xff1b;日志接收&#xff…

jmeter结合ansible分布式压测--1数据准备

一、搭建ansible环境 ansible是基于python开发&#xff0c;通过ssh连接客户机执行任务。ansible可以批量系统配置、批量程序部署、批量运行命令等。 1、安装yum install ansible 2、检查ansible的版本:ansible --version 二、利用ansible在其他机器上准备压测数据 1、本地准…

Vue:计算属性

Vue&#xff1a;计算属性 计算属性getset 在模板中&#xff0c;有时候填入的值要依赖于多个属性计算得出。 例如使用姓和名拼出全名&#xff1a; 以上效果可以通过以下代码实现&#xff1a; <div id"root">姓&#xff1a;<input type"text" v-m…

PHP不良事件上报系统源码,医院安全不良事件管理系统,基于 vue2+element+ laravel框架开发

不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…

PL端:LED闪烁

实验环境 vivado2024.1 实验任务 LED闪烁 引脚关系 硬件配置 新建一个vivado实验 创建 Verilog HDL 文件点亮 LED 点击 Project Manager 下的 Add Sources 图标&#xff08;或者使用快捷键 AltA&#xff09; 编辑led.v module led(input sys_clk,input rst_n,outp…

摘要、数字签名、对称加密、非对称加密综合应用示例以及技术原理说明

图&#xff1a;介绍了数字信封的安全传输过程 关键术语 散列&#xff1a;Hash&#xff08;哈希&#xff09;&#xff0c;一般翻译做散列、杂凑&#xff0c;是把任意长度的输入&#xff08;数据信息&#xff09;通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值…

美股集体收跌:汇盈策略股票交易特朗普、哈里斯概念股一同上涨

查查配分析随着美国大选进入最后倒计时,三大指数在多数投资者保持观望的状态下集体收跌。美债收益率集体回落,十年期美债收益率跌超8个基点至4.29%。 截至周一收盘,标普500指数跌0.28%,报5712.69点;纳斯达克指数跌0.33%,报18179.98点;道琼斯工业指数跌0.61%,报41794.6点。 汇…

力扣最热一百题——验证二叉搜索树

目录 题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 二叉搜索树的要求 解法一&#xff1a;采用中序遍历 中序遍历的定义 为什么二叉搜索树的中序遍历是严格递增的 二叉搜索树&#xff08;BST&#x…

golang 实现 bitcoin内核:编码实现椭圆曲线上的点

比特币在很大程度上依赖于一个称为椭圆曲线的数学对象&#xff0c;如果没有这个数学结构&#xff0c;比特币就像海滩上的城堡&#xff0c;随时可能崩溃。什么是椭圆曲线&#xff0c;它的方程是这样的&#xff1a;y^2 x^3 ax b&#xff0c;它的形状就像下面这样&#xff1a; …

[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的DjangoVue3在线考试系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的DjangoVue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 本论文提出并实现了一种基于Python…

API网关 - JWT认证 ; 原理概述与具体实践样例

API网关主要提供的能力&#xff0c;就是协议转换&#xff0c;安全&#xff0c;限流等能力。 本文主要是分享 如何基于API网关实现 JWT 认证 。 包含了JWT认证的流程&#xff0c;原理&#xff0c;与具体的配置样例 API网关认证的重要性 在现代Web应用和微服务架构中&#x…