【Git】git的简单使用

news2025/5/19 11:16:08

文章目录

  • 1. 基础概念
  • 2. 简单使用
    • 2.1 git配置
      • 2.1.1 git的配置文件
      • 2.1.2 .gitignore文件
    • 2.2 创建仓库
      • 2.2.1 创建本地仓库
      • 2.2.2 github创建远程仓库
      • step1:github新建一个代码仓
      • step2:创建密钥
      • 远程仓库相关指令
      • 2.2.3 本地仓库 关联 远程仓库
    • 2.3 分支
      • 2.3.1 常用指令
      • 2.3.2 变基
    • 2.4 提交
      • 查看本地仓状态
      • 添加到暂存区
      • 提交到本地仓
      • 查看历史记录
    • 2.5 差异
      • 2.5.1 git diff常用指令
    • 2.6 拉取&推送
    • 2.7 版本穿梭
        • hard模式
        • mixed模式
        • soft模式
        • 操作示例
    • 2.8 撤销提交revert
    • 2.9 stash
    • 2.10 cherry-pick
    • 2.11 submodule子模块
      • 2.11.1 why need submodule?
      • 2.11.2 submodule的使用
        • 1. 创建submodule
        • 2. 获取submodule
        • 3. 子模块内容更新
          • 情况1:子模块有未跟踪的内容变动
          • 情况2:子模块有版本变化
          • 情况3:子模块远程有更新
        • 4. 删除子模块
      • 2.11.3 summary
  • 参考内容

1. 基础概念

【工作区】 -- git add -> 【缓存区】 -- git commit -> 【本地版本库】 -- git push -> 【远程仓库】

  • Branch:分支是从主线分离出去的“副本”,可独立操作互不干扰。仓库初始化就有一个默认主干分支master;
  • HEAD:HEAD指向当前活动分支的最新版本/最新提交
  • Tag:标签是指某个分支某个特定时间点的状态,可理解为提交记录的别名,常用来标记版本;
  • origin/master:表示远程仓库(origin)的master分支
  • origin/HEAD:表示远程仓库(origin)的最新提交位置。
    P.S.
    标签、分支、HEAD都是对提交记录的“指针”引用,即指向这些提交。
  • 提交记录之前也存在“指针引用”,每个提交会指向上一个提交;
  • Tag标签:对某一提交的固定“指针”引用;
  • 分支:指向某一提交记录的“指针”引用,“指针”位置可变,如提交、回滚等;
  • HEAD:指向当前活动分支(最新提交)的一个“指针”引用。

每个提交都有一个唯一的标识,主要是提交的hash值,即commitid。标识唯一提交的两种方式:

  • commitid:一个40位编码,在指令中使用可只输入前6位;
  • HEAD~n
    • HEAD表示当前分支的最新版本;
    • HEAD^表示上一个版本,HEAD^^表示上上个版本;
    • HEAD~HEAD~1表示上一个版本,以此类推,HEAD^10表示最近的第10个版本。(有点儿像数组的下标)
    • HEAD@{1}在 git reflog 日志中标记的提交记录索引。

2. 简单使用

2.1 git配置

2.1.1 git的配置文件

git的三个主要配置文件:

  1. 系统全局配置(–system):包含适用于系统所有用户和所有仓库的配置信息。路径:git的安装目录\Git\etc\gitconfig;
  2. 用户全局配置(–global):当前系统用户的全局配置。路径:用户目录C:\UseR\[username]\.gitconfig;
  3. 仓库配置(–local):仓库的特定配置。路径:仓库目录下.git/config
    这三个配置文件的优先级:3>2>1
git config # 输入该命令回车后,会显示可用的选项

# 查看
git config user.name # 查看用户名
git config user.password # 查看用户密码
git config user.email # 查看用户邮箱

# 设置
# --global              use global config file
git config --global user.password "newPassword" # 设置全局新密码

2.1.2 .gitignore文件

在工作区根目录下创建.gitignore文件,文件中配置无需进行版本管理的文件、文件夹。P.S..gitignore文件本身是纳入版本管理的。

2.2 创建仓库

2.2.1 创建本地仓库

git init # 在当前目录初始化创建仓库

创建完后会多出一个.git目录,这就是本地仓git的工作场所。

# 克隆远程仓库
git clone [url]

2.2.2 github创建远程仓库

step1:github新建一个代码仓

在这里插入图片描述

在这里插入图片描述

step2:创建密钥

在本地创建一个ssh key,然后在github账号中输入后,本地电脑即和github账号关联起来了,这样就可以很方便的通过git bash上传代码等操作。

  1. 本地创建密钥
    ssh-keygen -t rsa -C "这里输入自己的邮箱"
    # 回车后会打印Create directory的字样,后边儿跟的就是密钥的储存位置
    
  2. 进入密钥的存储路径,打开id_rsa.pub或id_rsa文件,复制其中的密钥
  3. 在github上输入刚刚复制的密钥
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

远程仓库相关指令

git remote -v # 查看所有远程仓库的详细信息
git remote show [remote] # 显示某个远程仓库的信息
git remote add [name] [url] # 增加一个新的远程仓库,并命名
git remote rename [old] [new] # 修改远程仓库名称
git remote rm [remoteName] # 删除远程仓库

2.2.3 本地仓库 关联 远程仓库

将本地的Git仓库推送到远程仓库的两种方式_git如何把本地仓库的代码推送到新建的远程仓库-CSDN博客

git init

2.3 分支

2.3.1 常用指令

git branch [-v] # 列出所有本地分支,加参数-v显示详细信息
git branch -r # 列出所有远程分支
git branch -a # 列出所有本地分支和远程分支,用不同颜色区分
git branch [branchName] # 新建一个分支,但仍停留在当前分支上
git branch -d [branchName] # 删除指定分支,-D 强制删除
git checkout [branchName] # 切换到指定分支并更新工作区
git checkout . # 撤销工作区的(未暂存)修改,把暂存区恢复到工作区
git checkout HEAD . # 撤销工作区、暂存区的修改,用HEAD指向的当前分支最新版本替换
git checkout -b [branchOld] [branchNew] # 从本地branchOld分支上创建一个branchNew分支,并切换到新分支
git branch [branchName] [commitid] # 新建一个分支,并指定commitid
git branch --track [branchName] [branchRemote] # 新建一个分支,并于指定的远程分支建立关联
git checkout -b [branch1] remote [branch1] # 从远端remote的 branch1 分支创建本地的branch1分支
git branch --set-upstream [branch] [remoteBranch] # 在现有分支branch和指定的远程分支remoteBranch之间建立跟踪关联
git merge [branchName] # 合并指定分支到当前分支
git merge --no-ff [branch] # 合并branch分支到当前分支,--no-ff参数表示禁用快速合并模式,会产生一个新的合并提交记录
git push origin --delete [branchName] # 删除远程分支
git rebase master # 变基,将当前分支变基合并到master分支

2.3.2 变基

git rebase详解(图解+最简单示例,一次就懂)-CSDN博客

整理提交记录:git rebase -i使用示例:

# 想要合并前2个提交记录为1个
git rebase -i HEAD~2
# 将后边的pick 改为 s
pick db38d7e commit 1
pick 13bbbeb commit 3
改为:
pick db38d7e commit 1
s 13bbbeb commit 3
保存退出后,修改提交记录

2.4 提交

查看本地仓状态

git status

# 输出示例
PS E:\workspace\proj-main> git status
On branch git_test 
Changes not staged for commit: 
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   main.c

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .vscode/
        proj-sub/

no changes added to commit (use "git add" and/or "git commit -a")

添加到暂存区

git add [filename] # 一次性添加所有修改到暂存区:git add .

提交到本地仓

提交之后会生成一个commitid,也即形成了一个历史版本

git commit -m "此次的提交说明"

查看历史记录

git reflog # 查看精简历史记录
git log # 查看详细的历史记录

2.5 差异

2.5.1 git diff常用指令

git diff # 查看暂存区和工作区的差异
git diff [file] # 指定文件,暂存区和工作区的差异
git diff --cached # 查看已暂存的改动,即比较暂存区和新版本HEAD
git diff --cached [file] # 同上,指定文件
git diff --staged # 查看已暂存的改动,即比较暂存区和新版本HEAD
git diff --staged [file] # 同上,指定文件
git diff HEAD # 查看已暂存+未暂存的所有改动,即与最新版本HEAD进行比较
git diff HEAD~ # 同上,与上一个版本比较
git diff [commitid1] [commitid2] # 比较两次提交之间的差异
git diff [branch] # 查看工作区和分支之间的差异

2.6 拉取&推送

git fetch [remote] # 获取远程仓库的所有变动到本地仓库,但不会自动合并,需要手动合并
git pull [remote] [branch] # 拉取远程仓库的变化,并与本地版本合并
git pull # 同上,针对当前分支
git pull --rebase # 使用rebase的模式进行合并
git push # 推动当前分支到远程仓库
git push [remote] [branch] # 推动本地当前分支到远程仓库的指定分支
git push [remote] all # 推动所有分支到远端
git push -u # -u表示与远程分支建立关联,第一次执行时使用,后续不再需要

2.7 版本穿梭

在这里插入图片描述

git reset
hard模式
git reset --hard [commitid]

hard模式会在重置HEAD(HEAD指向当前提交)和branch的同时,也会重置暂存区和工作区中的内容。即hard模式下,缓存区和工作区中的内容会被完全重置为 HEAD指向的新位置的内容。

mixed模式
git reset --mixed [commitd]

mixed是 git reset的默认参数,即如果不加参数则默认是mixed模式。
mixed模式下,保留工作区内容,重置暂存区内容。

soft模式
git reset --soft [commitid]

soft模式下,会保留工作区的内容,并将因重置HEAD所带来的新的文件差异放入暂存区。

操作示例
# 当前的提交,HEAD此时指向的commitid 为 2d14ccd
PS E:\workspace\proj-main> git reflog
2d14ccd (HEAD -> git_test) HEAD@{0}: commit: commit 3
08cb34a HEAD@{1}: commit: commit 2
db38d7e HEAD@{2}: commit: commit 1

soft

PS E:\workspace\proj-main> git reset --soft db38d7e
PS E:\workspace\proj-main> git status
On branch git_test
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   main.c

reset到commit1,reset的内容被放入本地仓(commit1的内容覆盖本地仓),而暂存区中依然是commit3的内容。即reset的内容仅覆盖本地仓,保留暂存区和工作区的内容:
在这里插入图片描述

mixed:
reset到commit1,reset的内容被放入暂存区(commit1的内容覆盖本地仓和暂存区),而工作区中依然是commit3的内容。

在这里插入图片描述

hard:reset到commit1,reset的内容被放入工作区(即commit1的内容不仅覆盖了本地仓和暂存区,还覆盖了工作区的内容)main.c的内容直接被commit1的修改覆盖。
在这里插入图片描述

2.8 撤销提交revert

revert用于撤销某一次历史提交,其基本原理是产生一个新的提交,用原提交的逆向操作来完成撤销操作。

git revert [commitid] 

2.9 stash

git stash可以把当前工作区、暂存区未提交的内容先“隐藏”起来。这样就可以在未提交修改的情况下切换分支。

git stash # 把未提交的内容隐藏起来,包括未暂存和已暂存,等以后恢复现场后继续工作
git stash list # 查看所有被隐藏的内容列表
git stash pop # 恢复被隐藏的内容,同时删除隐藏记录
git stash save "message" # 同git stash,同时可以备注说明“message”
git stash apply # 恢复被隐藏的文件,但不删除隐藏记录
git stash drop # 删除隐藏记录

2.10 cherry-pick

cherry-pick可以复制一个指定的提交到当前分支,不管这个提交在哪个分支。

git cherry-pick [commitid]

2.11 submodule子模块

2.11.1 why need submodule?

较复杂的项目,可能会将代码根据功能拆分为不同的子模块主项目对子模块有依赖关系,但并不关心子模块的内部开发流程细节。通常情况下,不会将所有源码放在一个代码仓中管理。

git 的 submodule 功能,就提供了单独管理子模块并建立当前项目与子模块之间的依赖关系的功能。

2.11.2 submodule的使用

假设主项目为 proj-main, 子模块项目为proj-sub,它们分别管理在不同的代码仓。
假设地址分别为:

https://github.com/zjy/proj-main.git
https://github.com/zjy/proj-sub.git
1. 创建submodule
git submodule add [submodule_url]

在主项目下执行上述命令,可以在项目中创建一个子模块。
执行完后,主项目仓中会多出两个文件.gitmodulesproj-sub

# .gitmodules文件中包含了子模块的相关信息,例如
[submodule "proj-sub"]
path = proj-sub
url = https://github.com/zjy/proj-sub

此时.git/config文件中也会多出一些信息,.git/modules文件夹下也会多出一份内容。

此时可以git commit -m "add submodule proj-sub提交一次,表示引入了某个子模块。提交后主项目仓中会显示出子模块文件夹,并带上其所在仓库的版本号。

2. 获取submodule

clone主项目代码到本地,并不会拉取到子模块中的实际代码。

若希望在clone的时候也拉取到子模块的代码,可以在clone的时候加上参数:此时proj-main/proj-sub 目录下有子项目代码,并固定在某个git提交的版本上

git clone https://github.com/zjy/proj-main --recurse-submodules

方法二:在主项目下执行:会根据主项目的配置信息,拉取更新子模块的代码

git submodule init
git submodule update
# 这两个命令可以合并执行
git submodule update --init
# 如果主项目依赖多个子模块,可以在后边儿跟上要更新的子模块名称,例如
git submodule update --init ./proj-sub-1
3. 子模块内容更新

子模块是单独管理的。对于主项目而言,子模块内容变动通常分为:

情况1:子模块有未跟踪的内容变动

如果要修改子模块的代码内容,则在子模块文件夹下,按照子模块内部的版本控制体系提交代码。(推头文件)

提交完后,主项目的状态则进入情况2:子模块发生版本变化

情况2:子模块有版本变化

子模块版本变化时,在主项目中使用git status查看仓库状态时,会显示子模块有新提交。
此时可以使用git add/commit 将其添加到主项目的代码提交中,实际的改动就是子模块文件所表示的版本信息。

- Subproject commit commit_id_old
+ Subproject commit commit_id_new

通常当子项目更新后,主项目修改其所依赖的版本时,会产生类似这种的commit提交信息。

情况3:子模块远程有更新

通常情况下,子模块负责维护自己的版本升级后,推送到远程仓库,并告知主项目可以更新对子模块的版本依赖。

关于git submodule update 更新子模块代码,是当当前主项目文件夹下的子模块内容当前主项目记录的子模块版本不一致时,会参考后者进行更新。
但情况3,后者当前主项目记录的子模块版本还没有变化,因此主项目看来当前一切正常。

此时,需要在主项目下进入子模块拉取新版代码,进行升级操作:

cd proj-sub
git pull origin master

之后,子模块目录下的代码版本会发生变化,转到情况2进行主项目的提交。

# 若主项目的子项目太多,可以用如下命令执行
git submodule foreach 'git pull origin master'
4. 删除子模块

卸载子模块:

git submodule deinit proj-sub # 卸载子模块,若加上参数--force,则子模块工作区内即使有本地修改,也会被移除
git rm proj-sub

执行git submodule deinit命令的实际效果,是在.git/confg中删除了如下内容:

[submodule "proj-sub"]
url = https://github.com/zjy/proj-sub

执行git rm proj-sub的实际效果是移除了proj-sub文件夹,并自动在.gitmodules中删除以下内容:

[submodule "proj-sub"]
path = proj-sub
url = https://github.com/zjy/proj-sub

此时,主项目中关于子模块proj-sub的信息已经基本删除,可以提交代码。

2.11.3 summary

git submodule,主项目仓库并不会包含子模块的文件,而是保留一份子模块的配置信息和版本信息,作为主项目版本管理的一部分。

参考内容

  • Git代码管理完整流程(没有废话) - lycheezhang - 博客园
  • Git入门图文教程(1.5W字40图)🔥🔥–深入浅出、图文并茂 - 安木夕 - 博客园
  • Git中submodule的使用 - 知乎

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

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

相关文章

[Web 安全] Web 信息收集 —— 信息收集流程

&#x1f31f; 想系统化学习 Web 渗透&#xff1f;看看这个&#xff1a;[Web 安全] Web 安全攻防 学习手册 提示&#xff1a;本章不涉及任何具体信息收集技术&#xff0c;仅仅是讲解收集这些信息我能干啥&#xff0c;以及如何才能比较全面的收集信息。 0x01&#xff1a;信息收…

内部聊天软件,BeeWorks-安全的企业内部通讯软件

企业在享受数据便利的同时&#xff0c;如何保障企业数据安全已经成为无法回避的重要课题。BeeWorks作为一款专为企业设计的内部通讯软件&#xff0c;通过全链路的安全能力升维&#xff0c;为企业提供了一个安全、高效、便捷的沟通协作平台&#xff0c;全面保障企业数据安全。 …

应用篇02-镜头标定(上)

本节主要介绍相机的标定方法&#xff0c;包括其内、外参数的求解&#xff0c;以及如何使用HALCON标定助手实现标定。 计算机视觉——相机标定(Camera Calibration)_摄像机标定-CSDN博客 1. 原理 本节介绍与相机标定相关的理论知识&#xff0c;不一定全&#xff0c;可以参考相…

【UE5 C++】“ProceduralMeshComponent”的使用记录

效果 如下所示&#xff0c;通过“ProceduralMeshComponent”创建了一个自定义形状的Mesh&#xff0c;并且该Mesh包含碰撞信息&#xff0c;然后2s后更新Mesh形状。 步骤 1. 在“xxx.Build.cs”中引入“ProceduralMeshComponent”模块 2. 新建一个Actor类&#xff0c;这里命名为…

(leetcode算法题)309. 买卖股票的最佳时机含冷冻期

按照题目要求&#xff0c;研究对象是最后一天结束后获得的最大利润 那么就可以把问题拆分成 第 1 天结束后获得的最大利润&#xff0c; 第 2 天结束后获得的最大利润&#xff0c; 第 i 天结束后获得的最大利润&#xff0c; 由于规则中强调不能同时参与多笔交易&#xff0c…

Chrome漏洞可窃取数据并获得未经授权的访问权限

在发现两个关键漏洞后,谷歌发布了Chrome浏览器的紧急安全更新。这些漏洞可能允许攻击者窃取敏感数据并未经授权访问用户系统。 这些缺陷被识别为CVE-2025-3619和CVE-2025-3620,在Windows和Mac的135.0.7049.95/.96之前影响Chrome版本,影响Linux的135.0.7049.95/.96。该更新将在…

.net core 项目快速接入Coze智能体-开箱即用-全局说明

目录 一、Coze智能体的核心价值 二、开箱即用-效果如下 三 流程与交互设计 为什么要分析意图&#xff0c;而不是全部交由AI处理。 四 接入前的准备工作 五&#xff1a;代码实现----字节Coze 签署 JWT和获取Token .net core 项目快速接入Coze智能体-开箱即用 .net core快…

风丘年度活动:2025年横滨汽车工程展览会

| 展会简介&#xff1a; 2025年横滨汽车工程展览会&#xff0c;是由日本汽车工程师学会&#xff08;JSAE&#xff09;精心主办的一场行业盛会。预计届时将汇聚超550家参展商&#xff0c;设置1300个展位&#xff0c;展览面积超过20000平方米。展会受众广泛&#xff0c;面向汽车…

Redis线上操作最佳实践有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【Redis线上操作最佳实践有哪些?】面试题。希望对大家有帮助&#xff1b; Redis线上操作最佳实践有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在使用 Redis 时&#xff0c;尤其是在生产环境中&#xff0c;合理…

Redis——五种数据类型

目录 前言 1.String 1.1RAW编码 1.2EMBSTR编码 1.3 INT编码 2.List 3.Set 3.1 InSet编码转化成Dict编码 4.ZSet 4.1结合SkipList和HT实现 4.2使用ZipList实现 4.3编码转换 4.4 ZipList排序功能 5.Hash 5.1Hash底层存储结构 6.Redis数据结构和数据类型关系图 前言…

Godot学习-创建简单动画

文章目录 1、准备工作Godot资源 2、创建项目3、创建结点4、创建动画1、创建动画2、添加轨道3、创建关键帧3.1 第一个关键帧3.2 第二个关键帧 5、加载后自动播放6、动画循环7、轨道设置1、轨道更新模式2、轨迹插值3、其他属性的关键帧4、编辑关键帧5、使用 RESET 轨道6、洋葱皮 …

论文阅读VACE: All-in-One Video Creation and Editing

code&#xff1a;https://github.com/ali-vilab/VACE 核心 单个模型同时处理多种视频生成和视频编辑任务通过VCU&#xff08;视频条件单元&#xff09;进行实现 方法 视频任务 所有的视频相关任务可以分为4类 文本生视频 参考图片生视频 视频生视频 视频mask生视频 VCU …

JavaSE学习(前端初体验)

文章目录 前言一、准备环境二、创建站点&#xff08;创建一个文件夹&#xff09;三、将站点部署到编写器中四、VScode实用小设置五、案例展示 前言 首先了解前端三件套&#xff1a;HTML、CSS、JS HTML&#xff1a;超文本标记语言、框架层、描述数据的&#xff1b; CSS&#xf…

前端渲染pdf文件解决方案

一、前言 在当今数字化信息传播的时代&#xff0c;PDF文档作为一种常见的文件格式扮演着重要的角色。对于前端开发者而言&#xff0c;实现在网页上渲染和展示PDF文件是一项常见但也具有挑战性的任务。幸运的是&#xff0c;现在有一个强大的工具——react-pdf-viewer&#xff0c…

Kubernetes(K8S)内部功能总结

Kubernetes&#xff08;K8S&#xff09;是云技术的最核心的部分&#xff0c;也是构建是云原生的基石 K8S K8S&#xff0c;是Kubernetes的缩写&#xff0c;是Google开发的容器编排平台&#xff0c;现在由云原生计算基金会&#xff08;CNCF&#xff09;进行维护。 K8S&#xff…

【计算机网络】3数据链路层①

这篇笔记专门讲数据链路层的功能。 2.功能 数据链路层的主要任务是让帧在一段链路上或一个网络中传输。 2.1.封装成帧(组帧) 解决的问题:①帧定界②帧同步③透明传输 实现组帧的方法通常有以下种。 2.1.1.字符计数法 原理:在每个帧开头,用一个定长计数字段来记录该…

Nginx底层架构(非常清晰)

目录 前言&#xff1a; 场景带入&#xff1a; HTTP服务器是什么&#xff1f; 反向代理是什么&#xff1f; 模块化网关能力&#xff1a; 1.配置能力&#xff1a; 2.单线程&#xff1a; 3.多worker进程 4.共享内存&#xff1a; 5.proxy cache 6.master进程 最后&…

Docker 设置镜像源后仍无法拉取镜像问题排查

#记录工作 Windows系统 在使用 Docker 的过程中&#xff0c;许多用户会碰到设置了国内镜像源后&#xff0c;依旧无法拉取镜像的情况。接下来&#xff0c;记录了操作要点以及问题排查方法&#xff0c;帮助我们顺利解决这类问题。 Microsoft Windows [Version 10.0.27823.1000…

Edge 浏览器推出 Copilot Vision:免费实时解析屏幕内容;Aqua Voice:极速 AI 语音输入工具丨日报

开发者朋友们大家好 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看…

async-profiler火焰图找出耗CPU方法

事情起于开发应用对依赖的三方包&#xff08;apache等等&#xff09;进行了升级后&#xff08;主要是升级spring&#xff09;&#xff0c;CPU的使用率较原来大幅提升&#xff0c;几个应用提升50%-100%。 查找半天&#xff0c;对比每次版本的cpu火焰图&#xff0c;看不出有什么…