Git 基础详解

news/2024/11/1 23:01:45/

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.ppmy.cn/news/1543710.html

相关文章

Nginx 增加 request_id 以便于 APM调用链跟踪

利用 Nginx 增加 request_id 以便于 APM 跟踪&#xff1a;常用实践指南 应用性能管理&#xff08;APM&#xff09;工具是保障系统健康与性能的关键&#xff0c;而唯一请求标识 request_id 则在其中扮演了至关重要的角色。在本文中&#xff0c;我们将探讨如何在 Nginx 中生成并…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…

Python+Appium+Pytest+Allure自动化测试框架-安装篇

文章目录 安装安装ADT安装NodeJs安装python安装appium安装Appium Server&#xff08;可选&#xff09;安装Appium-Inspector&#xff08;可选&#xff09;安装allure安装pytest PythonAppiumPytestAllure框架的安装 Appium是一个开源工具&#xff0c;是跨平台的&#xff0c;用于…

如何通过自签名证书让本地环境变为 https

生成一个自签名的证书密钥对&#xff0c;并将其存储在一个PKCS12格式的密钥库文件 命令解释 keytool -genkeypair -alias testCert -keyalg RSA -storetype PKCS12 -keystore keystore.p12 -storepass password 将生成的 keystore 文件放在“resources”文件夹中。 keytool…

【Spring源码核心篇-01】精通Spring的bean的生命周期

Spring源码核心篇整体栏目 内容链接地址【一】Spring的bean的生命周期https://zhenghuisheng.blog.csdn.net/article/details/143441012 spring的bean的生命周期 一&#xff0c;spring中bean的生命周期1&#xff0c;生成BeanDefinition1.1&#xff0c;初始化context和BeanFacto…

YOLOv11改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

前言 在目标检测领域,小目标检测一直是一个具有挑战性的问题。YOLO系列算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在YOLOv11中添加小目标检测层,以提高对小目标的检测能力。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、…

CSS3简介(一)

1、CSS3简介 CSS3&#xff08;层叠样式表3级&#xff09;是用于控制网页外观设计的一种样式表语言&#xff0c;它是CSS2的继承者&#xff0c;并且是目前最为先进的版本之一。CSS3为Web设计师提供了更多功能强大的工具来创建更加动态和美观的网站。 以下是一些CSS3的主要特点和新…

安达发|零部件APS车间排程系统销售预测的优点

2024制造业面临着前所未有的挑战与机遇。为了保持竞争力&#xff0c;企业必须确保其生产系统能够高效、灵活地运作。在这方面&#xff0c;采用高级计划与排程系统&#xff0c;特别是零部件APS车间排程系统的预测方法&#xff0c;已成为提升生产效率和响应能力的关键策略。这种系…