LEARN GIT

news2025/1/12 15:46:22

概念

基础概念

  • 本地电脑

    • 代码区:工作区间,放代码的地方

    • 暂存区:git所管理的暂存区域

    • 本地仓库:git所管理的本机的硬盘区域

  • 远程电脑

    • 远程仓库:github、gitee

  • 代码提交管理的过程

    • 代码区------->暂存区------->本地仓库-------->远程仓库

    • 代码区------->暂存区------->本地仓库 :这个过程是不需要联网的。

    • 本地仓库-------->远程仓库:这个过程是需要联网的

git

  • Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目

  • git仓库的任何一个拷贝都可以独立作为一个服务器来使用

  • git中文件状态

    • 未跟踪(untrack):文件为新增加的

    • 已修改(modified):修改了文件,但还没保存到git仓库中。

    • 已暂存(staged):对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中

    • 已提交(committed):表示文件已保存在git仓库中

git存在分支

git 文件四种状态

  • Untracked:未跟踪。此文件在文件夹中,但并没有加入到git仓库,不参与版本控制.通过git add 状态变为Staged.

  • Unmodify:文件已经入库,未修改。即版本库中的文件快照内容与文件夹完全一致.这种类型的文件有两种去处,如果它被修改,而变为Modified.如果使用git rm 移出版本库,则成为Untracked文件.

  • Modified:文件已修改,仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout,则丢弃修改过,返回unmodify状态,这个git checkout即从库中取出文件,覆盖当前修改!

  • Staged:暂存状态。执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态.执行git reset HEAD filename取消暂存,文件状态为Modified

repo

repo是Google开发的用于管理Android版本库的一个工具,repo是用Python对git进行了封装,简化了对多个Git版本库的管理。对于repo管理的任何一个版本库,都需要使用git命令进行操作。

repo需要关注当前git库的数量、名称、路径等,对这些git库进行操作。通过集中维护所有git库的清单,repo可以方便的从清单中获取git库的信息。 这份清单会随着版本演进升级而产生变化,同时也有一些本地的修改定制需求,所以,repo是通过一个git库来管理项目的清单文件的,这个git库名字叫manifests。

repo是一系列脚本的集合,这些脚本也是通过git库来维护的,这个git库名字叫repo。

在客户端使用repo初始化一个项目时,就会从远程把manifests和repo这两个git库拷贝到本地。 repo将自动化的管理信息都隐藏根目录的.repo子目录中。

<manifest>
  <remote name="origin" url="https://github.com/your-repo.git" fetch="refs/heads/*:refs/remotes/origin/*" />

  <default revision="master" remote="origin" sync-j="4" />

  <project name="project1" path="path/to/project1" remote="origin" revision="main" />
  <project name="project2" path="path/to/project2" remote="origin" revision="develop" />
</manifest>
  • <remote>:描述了远程仓库的基本信息。

    • name描述的是一个远程仓库的名称;

    • fetch用作项目名称的前缘,在构造项目仓库远程地址时使用到;

    • review描述的是用作code review的server地址

  • <default>:default标签的定义的属性,将作为<project>标签的默认属性,在<project>标签中,也可以重写这些属性。

    • 属性revision表示当前的版本,也就分支;

    • 属性remote描述的是默认使用的远程仓库名称,即<remote>标签中name的属性值;

    • 属性sync-j表示在同步远程代码时,并发的任务数量,配置高的机器可以将这个值调大

  • <project>:每一个repo管理的git库,就是对应到一个<project>标签,

    • path描述的是项目相对于远程仓库URL的路径,同时将作为对应的git库在本地代码的路径;

    • name用于定义项目名称,命名方式采用的是整个项目URL的相对地址。

Repo 使用

命令

可选项

解释

repo init -u <URL> [<OPTIONS>]

-u

指定manifests这个远程git库的URL,manifests库是整个项目的清单

-m

–manifest-name:指定所需要的manifests库中的清单文件

-b

–manifest-branch:指定manifest.xml文件中的一个版本,“分支”

repo sync [PROJECT_LIST]

-j

开启多线程同步操作,这会加快sync命令的执行速度

-c

–current-branch:只同步指定的远程分支

-d

–detach:脱离当前的本地分支,切换到manifest.xml中设定的分支(当第一次sync完代码后,往往会切换到dev分支进行开发。如果不带该参数使用sync, 则会触发本地的dev分支与manifest设定的远程分支进行合并,这会很可能会导致sync失败)

-f

–force-broken:当有git库sync失败了,不中断整个同步操作,继续同步其他的git库

–no-clone-bundle

在向服务器发起请求时,为了做到尽快的响应速度,会用到内容分发网络(CDN, Content Delivery Network)。同步操作也会通过CDN与就近的服务器建立连接, 使用HTTP/HTTPS的$URL/clone.bundle来初始化本地的git库,clone.bundle实际上是远程git库的镜像,通过HTTP直接下载,这会更好的利用网络带宽,加快下载速度。 当服务器不能正常响应下载$URL/clone.bundle,但git又能正常工作时,可以通过该参数,配置不下载$URL/clone.bundle,而是直接通过git下载远程git库。

repo start <BRANCH_NAME> [<PROJECT_LIST>]

指定的PROJECT的上,切换到<BRANCH_NAME>指定的分支。可以使用–all参数对所有的PROJECT都执行分支切换操作

repo status [<PROJECT_LIST>]

用于查看多个git库的状态

repo upload [PROJECT_LIST]

将本地的代码上传到远程服务器

repo download <TARGET> <CHANGE>

download是从Gerrit下载改动

repo forall [PROJECT_LIST] -c <COMMAND>

-c

对指定的git库执行-c参数制定的命令序列。被执行的命令不限于git命令,而是任何被系统支持的命令,比如:ls 、 pwd 、cp

repo prune [<PROJECT_LIST>]

删除指定PROJECT中,已经合并的分支。

git使用

命令

可选项

解释

git init

在当前目录新建一个仓库

[project-name]

在一个目录下新建本地仓库

git clone [url]

克隆一个远程仓库

git diff

HEAD -- .

查看最新本地版本库和工作区所有文件的区别

HEAD -- [file-name]

查看最新本地版本库和工作区文件的区别

HEAD^ -- [file-name]

查看本地上一个版本和工作区文件的却别

[local branch] origin/[remote branch]

比较本地分支和远程分支的区别

git status

查看所有文件状态

[file-name]

查看指定文件状态

git add

.

将工作区的被修改的文件和新增的文件提交到暂存区,不包括被删除的文件

-u .

将工作区的被修改的文件和被删除的文件提交到暂存区,不包括新增的文件

-A .

将工作区被修改、被删除、新增的文件都提交到暂存区

Git commit

-m [massage]

将暂存区所有文件添加到本地仓库

[file-name-1] [file-name-2] -m [massage]

将暂存区指定文件添加到本地仓库

-am [massage]

将工作区的内容直接加入本地仓库

--amend

快速将当前文件修改合并到最新的commit,不会产生新的commit

--amend -m

修改最新一次commit的信息

git clean

从工作目录中删除所有没有 tracked,没有被管理过的文件

-n

显示将要被删除的文件

-d

删除未被添加到 git 路径中的文件(将 .gitignore 文件标记的文件全部删除)

-f

强制运行

-x

删除没有被 track 的文件

git log

显示所有commit日志

--pretty=oneline

将日志缩写为单行显示

--graph --pretty=oneline --abbrev-commit

查看分支合并情况

--oneline --decorate --graph --all

查看分叉历史,包括:提交历史、各个分支的指向以及项目的分支分叉情况

-3

查看最新3条commit日志数据

git reflog

显示操作本地版本库的命令,包括commit和reset等,在回退版本以后又后悔找不到commit id了可以使用此命令查看历史

git push

将文件添加到远程仓库

-f

强制提交,当我们本地reset到旧的版本时,然后普通push会被拦截,因为此时本地HEAD指向比远程库还要旧

origin [branch-name]

推送当前本地分支到指定远程分支

git checkout

-- [file-name]

用暂存区的文件覆盖掉工作区的文件,如果暂存区没有可更新的就会用commit的文件更新工作区的文件

[branch]

切换分支

-b [new-branch-name]

创建并切换分支

git branch

查看当前分支

[branch-name]

创建分支

-a

查看本地和远程的所有分支

-r

查看远程所有分支

-d [branch-name]

删除一个分支

-D [branch-name]

强制删除一个没有合并的分支

--set-upstream-to=origin/[branch-name] [branch-name]

把本地分支和远程分支进行连接

Git merge

合并本地origin/[branch-name]HEAD->[branch-name]的代码,并同步到工作空间

[branch-name]

用于合并指定分支到当前分支

--quit

退出当前分支合并,当合并后冲突很多,要撤回合并分支就可以用这个命令

--no-ff -m [massage] [branch-name]

不使用Fast forward合并分支,这样会创建新的commit,所以需要massage。这样被合并的分支HEAD指向是会变的。

git switch

[branch-name]

切换到已有分支

-c [branch-name]

创建新分支并切换到该分支

git stash

隐藏当前工作的修改

save message

执行存储时,添加备注,方便查找

list

查看隐藏的工作信息列表

drop

删除隐藏的工作信息

pop

恢复隐藏的工作信息,同时删除隐藏的工作信息

apply [stash@{0}]

恢复指定的隐藏工作信息,但是不会删除隐藏的工作信息

git remote

查看本地添加了哪些远程分支地址

-v

查看本地添加了哪些远程分支地址更详细信息

add origin 远程地址

关联远程仓库

git fetch

拉取远程分支最新的commit到本地仓库的origin/[branch-name]

git pull

从远程仓库拉取代码到工作空间

git pull == git fetch + git merge

git tag

查看所有标签

[version]

给当前最新的commit打上标签

[version] [commit-id]

给指定的commit-id打上标签

-a [version] -m [massage] [commit-id]

给指定的commit-id打上标签并附上说明文字

-d [version]

删除标签

Git reset

原理:

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本

适用场景:

如果想恢复到之前某个提交的版本,且那个版本之后提交的版本都不要了,就可以用这种方法

head说明:

  • HEAD 表示当前版本

  • HEAD^ 上一个版本

  • HEAD^^ 上上一个版本

  • HEAD^^^ 上上上一个版本

  • HEAD~0 表示当前版本

  • HEAD~1 上一个版本

  • HEAD^2 上上一个版本

  • HEAD^3 上上上一个版本

git reset --soft HEAD~n/commit id :

  • 版本库(repository):HEAD 指向指定<commit>

  • 暂存区(index):不重置到指定<commit>,这次<commit>之后的所有变更都撤销到此

  • 工作区(working directory):无变化

git reset --mixed HEAD~n/commit id :

  • 版本库:HEAD 指向指定<commit>

  • 暂存区(index):重置到指定<commit>

  • 工作区(working directory):这次<commit>之后的所有变更都撤销到此

git reset --hard HEAD~n/commit id :

  • 版本库:HEAD 指向指定<commit>

  • 暂存区(index):重置到指定<commit>

  • 工作区(working directory):重置到指定<commit>

  • 注意:工作区未add的修改和暂存区未commit的修改,全部丢弃。(如果想回到最新提交可用 git reflog 查看commit号 然后再利用本命令恢复)

Git revert

原理:

git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西

适用场景:

如果想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法

git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861(不需要的版本号)

重新commit

Git cherry-pick

指定的提交(commit)应用于其他分支

git cherry-pick <commit_id>

配置项:

  • -e:打开外部编辑器,编辑提交信息。

  • -n:只更新工作区和暂存区,不产生新的提交。

  • -x:在提交信息的末尾追加一行(cherry picked from commit …),方便以后查到这个提交是如何产生的。

  • -s:在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

  • -m parent-number:如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。-m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。

git cherry-pick时遇到冲突:

  • 通过git add .将文件标记为已解决,然后可以使用git cherry-pick --continue命令,继续进行cherry-pick操作。

  • 要中断这次cherry-pick,使用git cherry-pick --quit,这种情况下当前分支中未冲突的内容状态将为modified,

  • 要取消这次cherry-pick,则使用git cherry-pick --abort,这种情况下当前分支恢复到cherry-pick前的状态,没有改变。

Git rebase

  • 合并本地的多条提交(commit)记录

每一个的git commit都会形成一个git节点,而如果把这些节点都push到远端,就会使项目的git日志很乱。

git rebase -i HEAD~1

  • 分支合并

切换到feature分支上,执行rebase命令,相当于是想要把master分支合并到feature分支

# 这两条命令等价于

git rebase master feature

git checkout feature git rebase master

当在feature分支上执行git rebase master时,git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交,先提取到。然后将feature分支指向master分支的最新提交上,也就是M。最后把提取的C和D接到M后面,实际是会依次拿M和C、D内容分别比较,处理冲突后生成新的C’和D’。一定注意,这里新C’、D’和之前的C、D已经不一样了,是我们处理冲突后的新内容,feature指针自然最后也是指向D’

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

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

相关文章

关于 RK3568的linux系统killed用户应用进程(用户现象为崩溃) 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/132710642 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

模拟Proactor模式实现 I/O 处理单元

编写main.cpp 1.socket通信 服务器应用程序可以通过读取和写入 Socket 对象 来监听来自客户端的请求并向客户端返回响应 #define MAX_FD 65536 // 最大的文件描述符个数 #define MAX_EVENT_NUMBER 10000 // 监听的最大的事件数量 // 添加信号捕捉 void addsig(int sig, …

【MySQL】索引 详解

索引 详解 一. 概念二. 作用三. 使用场景四. 操作五. 索引背后的数据结构B-树B树聚簇索引与非聚簇索引 一. 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各…

机器学习的特征工程

字典特征提取 def dict_demo():"""字典特征提取:return:"""data [{city: 北京, temperature: 100}, {city: 上海, temperature: 60}, {city: 深圳, temperature: 30}]# data [{city:[北京,上海,深圳]},{temperature:["100","6…

《机器人学一(Robotics(1))》_台大林沛群 第 5 周【机械手臂 轨迹规划】 Quiz 5

我又行了&#xff01;&#x1f923; 求解的 位置 可能会有 变动&#xff0c;根据求得的A填写相应值即可。注意看题目。 coursera链接 文章目录 第1题 Cartesian space求解 题1-3 的 Python 代码 第2题第3题第4题 Joint space求解 题4-6 的 Python 代码 第5题第6题其它可参考代…

leetcode 88:合并两个有序数组 。 双指针解法

题目 算法 双指针 code var merge function(nums1, m, nums2, n) {// 其实就是一个nums1数组从后向前的降序重排&#xff0c;从最后开始&#xff0c;比较nums1有效位置和nums2当前位置数的大小&#xff0c;依次填入&#xff0c;nums2最后若有剩余&#xff0c;则再多一步从后…

9、补充视频

改进后的dijkstra算法 利用小根堆 将小根堆特定位置更改,再改成小根堆 nodeHeap.addOrUpdateOrIgnore(edge.to, edge.weight + distance);//改进后的dijkstra算法 //从head出发,所有head能到达的节点,生成到达每个节点的最小路径记录并返回 public static HashMap<No…

Bytebase 和 GitLab 签署 Technology Partner 技术合作伙伴协议

Bytebase 和 GitLab 签署技术合作伙伴协议&#xff0c;携手为开发者提供流畅的数据库协作开发和管理体验。 GitLab 是世界领先的开源 AI 驱动 DevSecOps 平台&#xff0c;旨在帮助开发者团队更好协作、更高效交付软件。Bytebase 是一款为 DevOps 团队准备的数据库 CI/CD 工具&a…

一文讲解Linux内核内存管理架构

内存管理子系统可能是linux内核中最为复杂的一个子系统&#xff0c;其支持的功能需求众多&#xff0c;如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等&#xff0c;而且对性能也有很高的要求。本文从内存管理硬件架构、地址…

上海控安携汽车网络安全新研产品出席AUTOSEMO“恒以致远,共创共赢”主题研讨会

8月31日&#xff0c;AUTOSEMO“恒以致远&#xff0c;共创共赢”主题研讨会在天津成功召开。本次大会由中国汽车工业协会软件分会中国汽车基础软件生态标委会&#xff08;简称&#xff1a;AUTOSEMO&#xff09;与天津市西青区人民政府联合主办。现场汇聚了100余位来自产学研政企…

单片机-LED介绍

简介 LED 即发光二极管。它具有单向导电性&#xff0c;通过 5mA 左右电流即可发光 电流 越大&#xff0c;其亮度越强&#xff0c;但若电流过大&#xff0c;会烧毁二极管&#xff0c;一般我们控制在 3 mA-20mA 之间&#xff0c;通常我们会在 LED 管脚上串联一个电阻&#xff0c…

unity 控制Dropdown的Arrow箭头变化

Dropdown打开下拉菜单会以“Template”为模板创建一个Dropdown List&#xff0c;在“Template”上添加一个脚本在Start()中执行下拉框打开时的操作&#xff0c;在OnDestroy()中执行下拉框收起时的操作即可。 效果代码如下用于控制Arrow旋转可以根据自己的想法进行修改&#xff…

雷达有源干扰识别仿真

各类干扰信号 基于数字射频存储(DRFM)技术的雷达干扰系统有三种工作方式&#xff1a;转发方式、应答方式和噪声方式&#xff0c;即&#xff0c;对应有三种干扰类型。 噪声干扰 DRFM干扰系统在噪声工作方式下不但可以产生传统噪声干扰&#xff0c;还可以通过将数字噪声调制到干…

网络空间内生安全数学基础(1)——背景

目录 &#xff08;一&#xff09;内生安全基本定义及实现什么是内生安全理论内生安全理论实现方法动态性异构性冗余性 &#xff08;二&#xff09;安全防御和可靠性问题起源内生安全防御、可靠性保证与香农可靠通信 &#xff08;三&#xff09;总结 &#xff08;一&#xff09;…

C语言sizeof()计算空间大小为8的问题

在练习数据结构过程中&#xff0c;定义指针p&#xff0c;并且申请了10个char类型空间&#xff0c;但在计算p所指空间大小时候&#xff0c;发现了一些奇怪的现象。 #include <stdio.h> #include <stdlib.h>int main(){char s[12];printf("the size of memory …

循迹小车原理介绍和代码示例

目录 循迹小车 1. 循迹模块使用 2. 循迹小车原理 3. 循迹小车开发和调试代码 循迹小车 1. 循迹模块使用 TCRT5000传感器的红外发射二极管不断发射红外线当发射出的红外线没有被反射回来或被反射回来但强度不够大时红外接收管一直处于关断状态&#xff0c;此时模块的输出…

node版本问题

服务器下载下来的vue项目启动出现下列问题 npm ERR! path E:\vueEnv\app\node_modules\node-sass npm ERR! command failed npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node scripts/build.js npm ERR! Building: C:\Program Files\nodejs\node.exe E:\vueEnv\ap…

存储空间压缩6倍 ,多点DMALL零售SaaS场景降本实践

&#x1f9d1;‍&#x1f4bc; 作者简介 冯光普&#xff1a;多点 DMALL 数据库团队负责人&#xff0c;负责数据库稳定性建设与 DB PaaS 平台建设&#xff0c;在多活数据库架构、数据同步方案等方面拥有丰富经验。 杨家鑫&#xff1a;多点高级 DBA&#xff0c;擅长故障分析与性能…

java八股文面试[数据库]——分页查询优化

一般性分页 一般的分页查询使用简单的 limit 子句就可以实现。limit格式如下&#xff1a; SELECT * FROM 表名 LIMIT [offset,] rows 第一个参数指定第一个返回记录行的偏移量&#xff0c;注意从0开始&#xff1b; 第二个参数指定返回记录行的最大数目&#xff1b; 如果只给定…

Nomad 系列-快速上手

系列文章 Nomad 系列文章 Nomad 重要术语 Nomad 安装设置相关术语 agent - 代理。Agent 是在 Server&#xff08;服务器&#xff09; 或 Client&#xff08;客户端&#xff09; 模式下运行的 Nomad 进程。client - 客户端。Nomad 客户端负责运行分配给它的任务。它还向服务器…