【Git】版本控制系统Git命令详解

2024.06.06 2024.06.06\ 2024.06.06 

Resources

强推:Pro Git - Book (git-scm.com).中文版.

强烈推荐网址:https://learngitbranching.js.org/?locale=zh_CN.

LearnGit Game:

基础(Git 主要命令)

Git Commit(提交)

提交记录保存的是你的目录下所有文件的快照

提交记录尽可能地轻量,因此将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。

保存了提交的历史记录。这也是为什么大多数提交记录的上面都有 parent 节点。

Git Branch(分支)

只是简单地指向某个提交记录 —— 仅此而已。

因为即使创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。

使用分支其实就相当于在说:“我想基于这个提交以及它所有的 parent 提交进行新的工作。”

Git Switch(切换分支)

在 Git 2.23 版本中,引入了一个名为 git switch 的新命令,最终会取代 git checkout,因为 checkout 作为单个命令有点超载(它承载了很多独立的功能)。

创建:git branch <name>

创建同时切换分支:git checkout -b <your-branch-name>

Git Merge(合并)

在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个 parent 节点。翻译成自然语言相当于:“我要把这两个 parent 节点本身及它们所有的祖先都包含进来。”

切换分支:用 git checkout bugFix 命令切换到该分支。【*标识当前分支】

合并:git merge <name>。【示例里为什么还要合并回去?,保证两个分支都为最新的同步241227即答】

Git Rebase(合并)

取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

合并至:git rebase <main>。若初始在 bugFix上。【也可以 rabase 两个名称】

流程:创建并转到分支 bugFix,同时 main 有新提交,然后在 bugFix 上 rebase 到 main。

高级(Git 的超棒特性)

分离 Head

一种状态。在Git树上移动。如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看。

HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。

分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。

执行命令:git checkout c1.【从指向 main 到指向 c1

相对引用 (^与~)

引用提交记录 如C1 的方式。

在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用 git log 来查看提交记录的哈希值。

比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入fed2 而不是上面的一长串字符。

正如我前面所说,通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!

相对引用非常给力,这里我介绍两个简单的用法:

  • 使用 ^ 向上移动 1 个提交记录【main^^相当于 main 的爷爷节点,^2是 parent2】
  • 使用 ~<num> 向上移动n个提交记录,如 ~3 【默认为1】

强制移动分支:git branch -f a b 移动 a 到 b。

撤销变更

和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。

两种方法:一是 git reset(远程无效,仅自己),还有就是 git revert

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

(译者注:在 reset 后, C2 所做的变更还在,但是处于未加入暂存区状态。)

新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

流程:git reset HEAD^checkout pushedrevert pushed

移动提交记录(自由修改提交树)

要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。

看起来挺复杂, 其实是个很简单的概念。

git cherry-pick【抓取任何】

抓过来放到当前分支下:git cherry-pick c2 c4

知道这些提交记录的哈希值 如 c2 时, 用 cherry-pick 再好不过。【最简单】

交互式的 rebase -i

若 hash 值未知。

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

当 rebase UI界面打开时, 你能做3件事:

  • 调整提交记录的顺序(通过鼠标拖放来完成)
  • 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
  • 合并提交。

流程:git rebase -i HEAD~4

杂项(Git 技术、技巧与贴士大集合)

本地栈式提交

流程:checkout main, cherry-pick c4rebase -i HEAD~3, rebase bugFix main

提交的技巧
  • 先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前
  • 然后用 git commit --amend 来进行一些小修改【修改最前端的记录
  • 接着再用 git rebase -i 来将他们调回原来的顺序
  • 最后我们把 main 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!

技巧1流程:rebase -i HEAD~2, commit --amend, rebase -i HEAD~2, rebase HEAD main

技巧2流程:git checkout main, cherry-pick c2, commit --amend, cherry-pick c3

Git Tags

有没有什么可以永远指向某个提交记录的标识呢,比如软件发布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性,有没有比分支更好的可以永远指向这些提交的方法呢?

就像是提交树上的一个锚点,标识了某个特定的位置。

把 v1 标签打在 c2 上:git tag v1 c2

流程:checkout c2, tag v1 c2, tag v0 c1

Git Describe

一个命令用来描述离你最近的锚点(也就是标签),它就是 git describe <ref>

它输出的结果是这样的:

<tag>_<numCommits>_g<hash>

tag 表示的是离 ref 最近的标签, numCommits 是表示这个 reftag 相差有多少个提交记录, hash 表示当前提交记录哈希值的前几位。

ref 提交记录上有某个标签时,则只输出标签名称。

流程:rebase main bugFix, rebase bugFix side, side another, another main

a远程仓库

远程仓库并不复杂, 在如今的云计算盛行的世界很容易把远程仓库想象成一个富有魔力的东西, 但实际上它们只是你的仓库在另个一台计算机上的拷贝。你可以通过因特网与这台计算机通信 —— 也就是增加或是获取提交记录

话虽如此, 远程仓库却有一系列强大的特性

  • 首先也是最重要的的点, 远程仓库是一个强大的备份。本地仓库也有恢复文件到指定版本的能力, 但所有的信息都是保存在本地的。有了远程仓库以后,即使丢失了本地所有数据, 你仍可以通过远程仓库拿回你丢失的数据。
  • 还有就是, 远程让代码社交化了! 既然你的项目被托管到别的地方了, 你的朋友可以更容易地为你的项目做贡献(或者拉取最新的变更)

现在用网站来对远程仓库进行可视化操作变得越发流行了(像 GitHub), 但远程仓库永远是这些工具的顶梁柱, 因此理解其概念非常的重要!

Git Clone

技术上来讲,git clone 命令在真实的环境下的作用是在本地创建一个远程仓库的拷贝(比如从 github.com)

远程分支 o/master

本地仓库多了一个名为 o/main 的分支,即为远程分支。

<remote name>/<branch name>】这个分支就叫 main,远程仓库的名称就是 o (其实默认为 origin

远程分支反映了远程仓库(在你最后一次和它通信时)的状态

远程分支有一个特别的属性,在你切换到远程分支时,自动进入分离 HEAD 状态Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。

Git Fetch

从远程仓库获取数据。同时更新远程分支。【可以理解为单纯的下载操作】

git fetch 通常通过互联网(使用 http://git:// 协议) 与远程仓库通信。

git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。

理解这一点很重要,因为许多开发人员误以为执行了 git fetch 以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件。

Git Pull

可以像合并本地分支那样来合并远程分支。也就是说就是你可以执行以下命令:

  • git cherry-pick o/mainrebasemerge

由于先抓取更新再合并到本地分支这个流程很常用,因此 Git 提供了一个专门的命令来完成这两个操作。它就是我们要讲的 git pull

  • git pull 就是 git fetch 和 git merge 的缩写!

Version Control(Git

Version control systems (VCSs) are tools used to track changes to source code (or other collections of files and folders).

追踪源代码改动.

现代的版本控制系统可以帮助您轻松地(甚至自动地)回答以下问题:

  • Who wrote this module?
  • 这个文件的这一行是什么时候被编辑的?By whom? Why was it edited?
  • 最近的1000个版本中,when/why 导致了单元测试失败?

Because Git’s interface is a leaky abstraction, learning Git top-down (starting with its interface / command-line interface) can lead to a lot of confusion.

抽象泄露问题,导致自顶向下很难学。

而优雅的底层设计则非常容易被人理解。自底向上。

目的:搞懂 Git 的数据模型。

Git’s data model

Snapshots

In Git terminology, a file is called a “blob”, and it’s just a bunch of bytes. A directory is called a “tree”, and it maps names to blobs or trees.【文件称 blob,目录称 tree】

A snapshot is the top-level tree that is being tracked.【快照是追踪最顶层的目录】

Modeling history: relating snapshots

历史记录建模。For many reasons, Git doesn’t use a simple model like this.【Git 没有采用】

Git calls these snapshots “commit”s.【快照 = 提交】

箭头:it’s a “comes before” relation, not “comes after”。

o <-- o <-- o <-- o <---- o^            /\          v--- o <-- o

the os correspond to individual commits (snapshots).【提交不可更改】

Data model, as pseudocode

It’s a clean, simple model of history. 历史模型的伪代码。

// 文件就是一组数据  a file is a bunch of bytes
type blob = array<byte>// 一个包含文件和目录的目录  a directory contains named files and directories
type tree = map<string, tree | blob>// 每个提交都包含一个父辈,元数据和顶层树  a commit has parents, metadata, and the top-level tree
type commit = struct {parent: array<commit>author: stringmessage: stringsnapshot: tree
}

24.07.16 − − E n d . 24.07.16--End. 24.07.16End.

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

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

相关文章

【网络编程】之TCP实现客户端远程控制服务器端及断线重连

【网络编程】之TCP实现客户端远程控制服务器端及断线重连 TCP网络通信实现客户端简单远程控制主机基本功能演示通信过程代码实现服务器模块执行命令模块popen系列函数 客户端模块服务器主程序 windows作为客户端与服务器通信#pragma comment介绍 客户端使用状态机断线重连代码实…

Git快速入门

文章目录 Git简介准备工作常用的Linux命令git配置 git工作原理git项目创建和克隆git基本操作命令git忽略文件配置ssh远程连接 IDEA集成Gitgit分支&#xff08;多人开发&#xff09;公司中用到的&#xff08;很清楚&#xff09; Git 简介 Git就是版本控制的工具 下面这个叫手动…

Redis 的几个热点知识

前言 Redis 是一款内存级的数据库&#xff0c;凭借其卓越的性能&#xff0c;几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识&#xff0c;但其中的热点知识并不多。今天&#xff0c;『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…

深入解析Java虚拟机(JVM)的核心组成

深入解析Java虚拟机&#xff08;JVM&#xff09;的核心组成 Java虚拟机&#xff08;JVM&#xff09;作为Java语言跨平台的核心实现&#xff0c;其架构设计精妙而复杂。理解JVM的组成部分&#xff0c;是掌握Java内存管理、性能调优和问题排查的关键。本文将从四大核心模块剖析J…

GIT工具学习【2】:分支

1.什么是分支 新建一个分支&#xff0c;可以认为把当前项目copy了一份&#xff0c;不太严谨&#xff0c;没毛病&#xff0c;里面虽然文件内容和名字相同&#xff0c;其实互相没有关系。 2.什么是合并分支 就是把两个分支&#xff08;项目文件夹&#xff09;合并在一起 git m…

40岁开始学Java:Java中单例模式(Singleton Pattern),适用场景有哪些?

在Java中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。以下是详细的实现方式、适用场景及注意事项&#xff1a; 一、单例模式的实现方式 1. 饿汉式&#xff08;Eager Initialization&#xff09; …

Linux常见基本指令(一)

目录 前言 1、ls指令 2、用户相关指令 3、pwd指令 4、cd指令 相对路径与绝对路径 5、创建、删除文件和目录相关的指令 创建相关的指令 删除相关的指令 6、拷贝、移动和重命名 cp指令 mv指令 前言 学习Linux的过程中一定要多自己动手&#xff0c;Linux的指令繁多&a…

测试金蝶云的OpenAPI

如何使用Postman测试K3Cloud的OpenAPI 1. 引言 在本篇博客中&#xff0c;我将带你逐步了解如何使用Postman测试和使用K3Cloud的OpenAPI。内容包括下载所需的SDK文件、配置文件、API调用及测试等步骤。让我们开始吧&#xff01; 2. 下载所需的SDK文件 2.1 获取SDK 首先&…

Tomcat

1.Tomcat是什么&#xff1f; Tomcat 是一个开源的、轻量级的 Servlet 容器&#xff0c;也被称为 Web 服务器&#xff0c;由 Apache 软件基金会的 Jakarta 项目开发&#xff0c;在 Java Web 开发领域应用广泛。 1&#xff09;Servlet 容器&#xff1a;Servlet 是 Java 语言编写…

【windows driver】 开发环境简明安装教程

一、下载路径 https://learn.microsoft.com/en-us/windows-hardware/drivers/other-wdk-downloads 二、安装步骤&#xff1a; 1、安装Visual Studio IDE 笔者建议安装最新版本&#xff0c;可以向下兼容。发文截止到目前&#xff0c;VS2022是首选&#xff0c;当前笔者由于项…

长时间目标跟踪算法(3)-GlobalTrack:A Simple and Strong Baseline for Long-termTracking

GlobalTrack的原始论文和源码均已开源&#xff0c;下载地址。 目录 背景与概述 1.1 长期视觉跟踪的挑战 1.2 现有方法的局限性 1.3 GlobalTrack的核心思想 算法原理与架构 2.1 全局实例搜索框架 2.2 Query-Guided RPN&#xff08;QG-RPN&#xff09; 2.3 Query-Guided RCNN&a…

使用mermaid查看cursor程序生成的流程图

一、得到cursor生成的流程图文本 cursor写的程序正常运行后&#xff0c;在对话框输入框中输入诸如“请生成扫雷的代码流程图”&#xff0c;然后cursor就把流程图给生成了&#xff0c;但是看到的还是文本的样子&#xff0c;保留这部分内容待用 二、注册一个Mermaid绘图账号 …

MacOS本地部署Deepseek,不联网也可以使用AI,保护隐私

苹果笔记本本地部署deepseek主要用到Ollama与open-webui 1. 安装Ollama “Ollama” 是一个轻量级的 AI 模型运行时环境&#xff08;runtime&#xff09;&#xff0c;旨在简化在本地部署和使用大语言模型&#xff08;LLM&#xff09;的过程。它由 Vicarious 公司开发&#xff…

unity学习62,尝试做第一个小游戏项目:flappy bird

目录 学习参考 1 创建1个unity 2D项目 1.1 2D项目模板选择 1.1.1 2D(built-in-Render pipeline) 1.1.2 universe 2D 1.1.3 这次选择 2D(built-in-Render pipeline) 1.2 创建项目 1.2.1 注意点 1.2.2 如果想修改项目名 2 导入美术资源包 2.1 下载一个flappy bird的…

基于Matlab的多目标粒子群优化

在复杂系统的设计、决策与优化问题中&#xff0c;常常需要同时兼顾多个相互冲突的目标&#xff0c;多目标粒子群优化&#xff08;MOPSO&#xff09;算法应运而生&#xff0c;作为群体智能优化算法家族中的重要成员&#xff0c;它为解决此类棘手难题提供了高效且富有创新性的解决…

使用DiskGenius工具来实现物理机多硬盘虚拟化迁移

使用DiskGenius工具来实现物理机多硬盘虚拟化迁移 概述准备工作注意事项实操过程记录1、Win7虚拟机&#xff0c;安装有两个硬盘&#xff08;硬盘0和硬盘1&#xff09;&#xff0c;各分了一个区&#xff0c;磁盘2是一块未使用的磁盘2、运行DiskGenius程序&#xff0c;记录现有各…

win本地vscode通过代理远程链接linux服务器

时间&#xff1a;2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…

yolo初体验

看别人说的好简单,3行代码完成yolo11: from ultralytics import YOLO model YOLO("yolo11x.pt")##第一次运行自动下载 model.predict(source"0",showTrue) 当然代码没错:但是环境不好配: 首先:pip install ultralytics 会主动下载依赖 pytorch pandas-…

TCP 连接故障排查与 SYN 洪泛攻击防御

1 SYN 洪泛攻击防御 1.1 SYN Flood是什么&#xff1f; SYN Flood是互联网上最原始、最经典的DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击之一&#xff0c;旨在耗尽可用服务器资源&#xff0c;致使服务器无法传输合法流量。 SYN…

ArcGIS Pro应用指南:如何为栅格图精确添加坐标信息

一、引言 在地理信息系统中&#xff0c;栅格图是一种重要的数据类型。 然而&#xff0c;有时我们从网络上获取的栅格图并不包含坐标信息&#xff0c;这使得它们难以与其他带有坐标信息的数据进行集成和分析。 为了解决这一问题&#xff0c;我们需要对栅格图进行地理配准&…