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 fategit add file.txt
git commit -m "master提交fate分支对file.txt的修改"

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

发生冲突

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

 提交解决冲突后的文件

git merge fatevim 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界面来进行相关操作

初始化本地仓库

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

关联远程仓库



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


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

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

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

相关文章

Yarn介绍 | 组成 | 工作流程

1、理论 Apache YARN&#xff08;Yet another Resource Negotiator的缩写&#xff09;是Hadoop集群的资源管理系统&#xff0c;负责为计算程序提供服务器计算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等计算程序则相当于运行于操作系统之上的应用…

第十讲 MySQL为什么有时候会选错索引?

第十讲 MySQL为什么有时候会选错索引&#xff1f; 一、问题引入 在 MySQL 中&#xff0c;索引选择由优化器负责&#xff0c;其目标是以最小代价执行语句&#xff0c;但有时会选错索引&#xff0c;导致执行速度变慢。 二、案例分析 案例一 建表与数据插入 创建表t&#xff…

uniapp开发【选择地址-省市区功能】,直接套用即可

一、效果展示 二、代码 <template><view><view class="user_info"><view class="item"

如何获取当前数据库版本?

要获取当前数据库的版本&#xff0c;您可以使用以下几种方法之一&#xff0c;具体取决于您使用的数据库管理系统&#xff08;DBMS&#xff09;&#xff1a; 1. 使用SQL命令查询 大多数DBMS都提供了可以直接在SQL命令行界面或管理工具中执行的命令来获取版本信息。 对于安装在…

《Web性能权威指南》-WebRTC-读书笔记

本文是《Web性能权威指南》第四部分——WebRTC的读书笔记。 第一部分——网络技术概览&#xff0c;请参考网络技术概览&#xff1b; 第二部分——无线网络性能&#xff0c;请参考无线网络性能&#xff1b; 第三部分——HTTP&#xff0c;请参考HTTP&#xff1b; 第四部分——浏览…

高效水电管理:Spring Boot在大学城的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学城水电管理系统的相关信息成为必然。开…

C#中,Thread和Task的区别

在C#中&#xff0c;Thread和Task都是用于实现多线程编程的重要概念&#xff0c;但它们之间存在一些关键的区别。以下是对这两者的详细比较&#xff1a; 一、基于不同的.NET框架 Thread&#xff1a;是基于Windows操作系统提供的API实现&#xff0c;它允许开发者直接创建和管理…

(linux驱动学习 - 12). IIC 驱动实验

目录 一.IIC 总线驱动相关结构体与函数 1.i2c_adapter 结构体 2.i2c_algorithm 结构体 3.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_adapter 4.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_numbered_adapter 5.删除 I2C 适配器 - i2c_del_adapter 二.IIC 设…

selenium操作已开启的浏览器,方便调试

一、谷歌浏览器配置&#xff1a; 在所安装的谷歌下面&#xff0c;执行下面命令&#xff0c;打开谷歌浏览器&#xff0c;用来selenium的操作&#xff1a; 注意事项&#xff1a;端口需要不被占用&#xff0c;--user-data-dir"D:\workspace\chrome-data"这个路径需要有…

特殊矩阵的压缩存储

一维数组的存储结构 ElemType arr[10]; 各数组元素大小相同&#xff0c;且物理上连续存放。 数组元素a[i]的存放地址 LOC i * sizeof(ElemType)。&#xff08;LOC为起始地址&#xff09; 二维数组的存储结构 ElemType b[2][4];二维数组也具有随机存取的特性&#xff08;需…

Maven(21)如何使用Maven进行代码检查?

Maven提供了多种方式来进行代码检查&#xff0c;包括使用静态代码分析工具如Checkstyle、PMD和FindBugs。以下是如何使用这些工具进行代码检查的详细步骤和代码示例&#xff1a; 步骤 1: 添加插件依赖 首先&#xff0c;你需要在pom.xml文件中添加相应的插件依赖。以下是一个包…

JavaCV学习第一课

1、 JavaCV [1] 是一款基于JavaCPP [2]调用方式&#xff08;JNI的一层封装&#xff09;&#xff0c;由多种开源计算机视觉库组成的包装库&#xff0c;封装了包含FFmpeg、OpenCV、tensorflow、caffe、tesseract、libdc1394、OpenKinect、videoInput和ARToolKitPlus等在内的计算…

vue2开发 对接后端(go语言)常抛异常情况以及处理方法汇总

背景 在Vue2开发中&#xff0c;与后端&#xff08;Go语言&#xff09;接口对接时出现异常通常是由于前后端之间的数据交互出现了问题。常见的异常包括数据格式不匹配、请求方法不匹配、请求头部信息错误、跨域请求问题等。 常见异常 如出现报错提示&#xff1a; json : can…

SQLite 语法

SQLite 语法 SQLite 是一种轻量级的数据库管理系统&#xff0c;它遵循 SQL&#xff08;结构化查询语言&#xff09;标准。SQLite 的语法相对简单&#xff0c;易于学习和使用。本文将详细介绍 SQLite 的基本语法&#xff0c;包括数据定义语言&#xff08;DDL&#xff09;、数据…

河南高校大数据实验室建设案例分享

泰迪智能科技在与中国各地高校的合作中积累了丰富的经验&#xff0c;尤其是在大数据和人工智能领域。过去多年里与河南省内多所高校在大数据领域进行了积极的探索和建设&#xff0c;形成了一系列具有特色的大数据实验室。这些实验室不仅促进了高校内部的科研创新&#xff0c;也…

VulkanTutorial(12·recreation swap chain,Vertex buffers)

Swap chain recreation 我们要优化程序&#xff0c;因为window surface&#xff08;窗口大小&#xff09;可能会发生变化&#xff0c;导致swapchain不再兼容&#xff0c;当这个事件发生时&#xff0c;我们应该重新创建swapchain 实例 我们写新的recreateSwapChain和cleanupS…

qt QPicture详解

1、概述 QPicture类是Qt框架中的一个重要图形类&#xff0c;它主要用于记录和回放QPainter的绘图指令。这个类能够跨平台、无分辨率依赖地绘制图形&#xff0c;非常适合用于实现打印预览和图像操作等场景。QPicture可以将绘图操作序列化为一种独立于平台的格式&#xff0c;保存…

获取vue.config.js里代理的路径

vue.config.js 主要用于配置 Vue CLI 的构建和开发服务器选项&#xff0c;不能直接拿到里面的值&#xff0c;如果是自己重新写的config&#xff0c;引入到页面就可以拿到 下面说&#xff0c;我的解决办法&#xff0c;如果有更好的&#xff0c;一定要给我说啊 在public目录下创…

【数据结构】宜宾大学-计院-实验六

实验 6 栈和队列&#xff08;综合实验&#xff09; 实验目的&#xff1a;实验内容&#xff1a;进制转换问题&#xff1a;第1题测试结果&#xff1a;第1题代码实现&#xff1a; 括号匹配问题&#xff1a;第2题测试结果&#xff1a;第2题代码实现&#xff1a; 回文字符串问题&…

Day22 opencv图像预处理

图像预处理 在计算机视觉和图像处理领域&#xff0c;图像预处理是一个重要的步骤&#xff0c;它能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法&#xff0c;常见的操作包括图像空间转换、图像大小调…