Git 基础指令

news2024/12/26 22:50:08

Git 基础指令

本章涵盖了我们在使用 Git 完成各种操作时将会用到的各种基本命令。 在学习完本章之后,我们应该能够配置并初始化一个仓库(repository)、开始或停止跟踪(track)文件、暂存(stage)或提交(commit)更改。

获取 Git 仓库

通常有两种获取 Git 项目仓库的方式:

  1. 将尚未进行版本控制的本地目录转换为 Git 仓库。
  2. 从其它服务器 clone 一个已存在的 Git 仓库。

在本地目录初始化 Git 仓库

直接在需要进行版本控制的文件夹中执行 git init 命令。

该命令将创建一个名为 .git 的子目录,这个子目录含有我们初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的核心。 但是,在这个时候,我们仅仅是做了一个初始化的操作,我们的项目里的文件还没有被跟踪。

clone 现有的仓库

如果我们想获得一份已经存在了的 Git 仓库的拷贝,比如说,我们想为某个开源项目贡献自己的一份力,这时就要用到 git clone 命令。

Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成我们的工作所需要文件。 当我们执行 git clone 命令的时候,默认会将远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。

克隆仓库的命令是 git clone <url> 。 比如,要克隆 react,可以用下面的命令:

git clone https://github.com/facebook/react.git

这个命令会在当前目录下创建一个名为 react 的目录,并在这个目录下初始化一个 .git 文件夹, 从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。 如果我们进入到这个新建的 react 文件夹,我们会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。

如果我们想在克隆远程仓库的时候,自定义本地仓库的名字,我们可以通过额外的参数指定新的目录名

git clone https://github.com/facebook/react.git localReact

这会执行与上一条命令相同的操作,但目标目录名变为了 localReact。

跟踪新文件

使用命令 git add 开始跟踪一个文件。

在「工作目录」里新增一个 file.txt 文件,通过 git status 查看信息可以看到在 Untracked files 这行下面存在一个 file.txt 文件未追踪。

在这里插入图片描述

执行 git add file.txt 追踪文件。

在这里插入图片描述

只要在 Changes to be committed 这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件在我们运行 git add 时的版本将被留存在后续的历史记录中。

git add 后可携带参数:

  • .:追踪「工作目录」中所有的文件
  • 目录路径:递归地跟踪该目录下的所有文件
  • 文件名:追踪当前文件

暂存已修改的文件

修改一个已被跟踪的文件后使用 git status 查看信息:

在这里插入图片描述

当执行 git status 命令后,Changes not staged for commit 这行下面存在文件信息,说明这些已追踪文件的内容发生了变化,但还没有放到「暂存区」。要暂存这次更新,需要重新运行 git add 命令。

在这里插入图片描述

现在最新内容已暂存,下次提交时就会记录到仓库。

状态预览

前面已经使用到了 git status 命令但是没进行解释,现在便介绍一下这个指令。

这个指令就是用于比对「暂存区」与「工作目录」中的文件,之后将一些差异文件标记出来。

git status 命令的输出十分详细,但其用语有些繁琐。 Git 有一个选项可以帮我们缩短状态命令的输出,这样可以以简洁的方式查看更改。 如果我们使用 git status -s 命令或 git status --short 命令,我们将得到一种格式更为紧凑的输出。

在这里插入图片描述

新添加的未跟踪文件(file5.txt)前面有 ?? 标记,新添加到暂存区中的文件(file4.txt)前面有 A 标记,修改过的文件前面有 M 标记。输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。例如,上面的状态打印显示:file.txt 文件在「工作目录」已修改但尚未暂存;file2.txt文件已修改且已暂存; file3.txt 文件已修改,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。

忽略文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在「工作目录」的根目录下创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。

.gitignore 文件的格式规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。

我们来看一个 .gitignore 文件的例子:

# 忽略所有的 .a 后缀文件
*.a

# 但跟踪所有的 lib.a,即便我们在前面忽略了 .a 后缀文件
!lib.a

# 只忽略当前目录下的 TODO 文件,而不忽略 xxx/TODO
/TODO

# 忽略任何目录下名为 build 的文件夹
build/

# 忽略 doc/xxx.txt,但不忽略 doc/xxx/xxx.txt
doc/*.txt

# 忽略 doc/ 目录及其所有子目录下的 .pdf 后缀文件
doc/**/*.pdf

提交更新

在每次提交前,先用 git status 看下,我们所需要的文件是不是都已暂存起来了, 然后再运行提交命令 git commit:

这样会启动我们选择的文本编辑器来输入提交说明。

启动的编辑器是通过 Shell 的环境变量 EDITOR 指定的,一般为 vim 或 emacs。当然也可以使用 git config --global core.editor 命令设置我们喜欢的编辑器。

使用 vim 编辑器

我们以 vim 为例介绍如何编写提交信息,当我们直接输入 git commit 命令时,就会进入到 vim 编辑器,然后去编写相关的提交信息。

在这里插入图片描述

  • 按下字母键 i 或 a 或 o,此时进入到可编辑状态,这时就可以输入我们的注释
  • 当我们输入完之后,按下 Esc 键就可退出编辑状态,回到一般模式。

最后就是怎么退出 vim 编辑器并提交 commit, 有两种方法:

  • 输入两字大写字母 ZZ(记住是大写)
  • 输入 :wq 或 :wq! (强行退出)

使用 -m 参数

另外,我们也可以在 commit 命令后添加 -m 参数,将提交信息与命令放在同一行

在这里插入图片描述

可以看到,提交后它会告诉我们,当前是在哪个分支(master)提交的,本次提交的 hash 值是什么(925ab48),以及在本次提交中,有多少文件修订过,多少行添加和删改过。

提交时记录的是放在「暂存区」的快照。 任何还未暂存文件的仍然保持已修改状态,可以在下次提交时纳入版本管理。 每一次运行提交操作,都是对我们项目作一次快照,以后可以回到这个状态,或者进行比较。

我们可以携带两个 -m 参数,第一个 -m 后携带的是作为本次 commit 的标题,第二个则是 commit 的消息:

在这里插入图片描述

跳过 git add 命令

尽管使用「暂存区」的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。 Git 提供了一个跳过使用「暂存区」的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。

在这里插入图片描述

提交之前不再需要 git add file6.txt 了。 这是因为 -a 选项使本次提交包含了所有修改过的文件。 这很方便,但是要小心,有时这个选项会将不需要的文件添加到提交中。

移除文件

如果我们想要删除某个已追踪的文件,如果我们直接从「工作目录」中删除,那么还需要直接 git add 命令把这个删除操作提交到「暂存区」里,删除掉「暂存区」中的文件。

在这里插入图片描述

在 Git 指令列工具中有个 rm 指令,可以用来删除文件(可以同时删除「暂存区」和「工作目录」中的文件),下一次提交时,该文件就不再纳入版本管理了。

在这里插入图片描述

如果要删除之前修改过或已经放到「暂存区」的修改后的文件,则必须使用强制删除选项 -f。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。

如果我们只是想要把文件从 Git 仓库中删除(从「暂存区」删除),但是依旧保留在「工作目录」中,可以使用 --cached 参数。

在这里插入图片描述

可以看到 file.txt 被「暂存区」删除了,这个文件此时处于未追踪的状态。

文件重命名

Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。

如果我们直接在「工作目录」中修改某个已追踪的文件名,此时通过 git status 查看状态

在这里插入图片描述

可以发现 Git 在比对之后发现 file.txt 文件被移除了,反而多了一个 file1.txt 文件,如果我们想要提交这次操作就需要执行 git add 命令:

在这里插入图片描述

如此分开操作,Git 也会意识到这是一次重命名,因此可以看到状态中有一个 renamed 关键词。

在 Git 指令列工具中有个 mv 指令,可以用来变更文件或目录的名称。可以避免上述的多条指令操作:

在这里插入图片描述

查看提交历史

在提交了若干更新,又或者克隆了某个项目之后,我们想回顾一下项目提交历史,可以通过 git log 命令来查看。

在这里插入图片描述

不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如我们所看到的,这个命令会列出每个 commit 的 hash 值和、作者的名字和电子邮件地址、提交时间以及提交说明。

有时候记录越来越多,我们也可以通过以下指令限制输出的版本数量,我们只要通过一个減号 (-) 与一个数字,就可以限定输出最近几条记录:

在这里插入图片描述

撤销操作

撤销「暂存区」中的文件修改

当我们修改了某个文件并放入了「暂存区」,但是后来我们发现这个修改会导致问题,想取消暂存时,可以使用 git reset HEAD <filename> 命令来取消暂存文件。

在这里插入图片描述
在这里插入图片描述

从上图可以看到执行撤销命令后,文件又恢复成未放入暂存区的状态了。

撤销「工作目录」的文件修改

如果我们在「工作目录」修改了某个文件,但是这个需求被砍了,我们需要恢复成原来的版本(上一次 commit 的版本),可以使用 git checkout – <filename> 命令。

在这里插入图片描述

重新提交

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:

这个命令会将「暂存区」中的文件提交。 如果自上次提交以来我们还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而我们所修改的只是提交信息。

在这里插入图片描述
在这里插入图片描述

最终我们只会有一个提交——第二次提交将代替第一次提交的结果。

当我们在修补最后的提交时,与其说是修复旧提交,倒不如说是完全用一个 新的提交 替换旧的提交, 理解这一点非常重要。从效果上来说,就像是旧有的提交从未存在过一样,它并不会出现在仓库的历史中。

标签

查看所有标签

在 Git 中列出已有的标签非常简单,只需要输入 git tag (可带上可选的 -l 选项 --list):

在这里插入图片描述

这个命令以字母顺序列出标签,但是它们显示的顺序并不重要。

创建标签

Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。

现在我们只介绍一下轻量标签。

创建轻量标签,只需要提供标签名字:

在这里插入图片描述

推送到远程仓库

默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后我们必须显式地推送标签到共享服务器上。我们可以运行 git push origin <tagName>。

删除标签

要删除掉我们本地仓库上的标签,可以使用命令 git tag -d <tagName>

跟新增标签一样,我们需要额外的命令告知远程仓库删除标签 git push origin --delete <tagName>

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

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

相关文章

教你如何打造自己的知识付费平台!

明理信息科技知识付费saas租户平台 一、确定目标群体 首先&#xff0c;你需要明确你的知识付费平台的目标用户是谁。这将帮助你确定所需的内容和功能&#xff0c;以及如何吸引和留住这些用户。例如&#xff0c;如果你的目标群体是职场新人&#xff0c;你的平台可能需要提供职…

如何编写和管理自动化测试用例

开始本篇文章之前&#xff0c;先来介绍下什么是自动化测试用例&#xff0c;即通过编写脚本程序来模拟用户操作和功能验证&#xff0c;并由机器自动执行无人值守的测试用例。 相比手工测试用例&#xff0c;自动化测试用例更快、更准确、更可靠、容易重复执行&#xff0c;且每次…

【python】python新年烟花代码【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 新年的钟声即将敲响&#xff0c;为了庆祝这个喜庆的时刻&#xff0c;我们可以用 Python 编写一个炫彩夺目的烟花盛典。本文将详细介绍如何使用 Pygame 库创建一个令人惊叹的烟花效果。 一、效果图&#xff1a; 二…

植物大战僵尸-C语言搭建童年游戏(easyx)

游戏索引 游戏名称&#xff1a;植物大战僵尸 游戏介绍&#xff1a; 本游戏是在B站博主<程序员Rock>的视频指导下完成 想学的更详细的小伙伴可以移步到<程序员Rock>视频 语言项目&#xff1a;完整版植物大战僵尸&#xff01;可能是B站最好的植物大战僵尸教程了&…

程序员有哪些接单的渠道?

这题我会&#xff01;程序员接单的渠道那可太多了&#xff0c;想要接到合适的单子&#xff0c;筛选一个合适的平台很重要。如果你也在寻找一个合适的接单渠道&#xff0c;可以参考以下这些方向。 首先&#xff0c;程序员要对接单有一个基本的概念&#xff1a;接单渠道可以先粗略…

034 - STM32学习笔记 - TIM定时器(三) - 高级定时器2

034 - STM32学习笔记 - TIM定时器&#xff08;三&#xff09; - 高级定时器2 哥们最近搞了个公众号&#xff0c;后面的文章会同步在公众号上发布&#xff0c;各位看官帮忙点点关注&#xff0c;后续一些其他方面的学习内容也会在公众号上发布&#xff0c;有兴趣的可以看看哟&…

电脑可以连接网络但浏览器无法访问部分或全部网页

啾咪&#xff01;离大谱了&#xff0c;电脑一段时间没有用&#xff0c;最近打开却发现可以连接网络但是无法访问部分网页&#xff08;如CSDN&#xff09;&#xff0c;显示如下&#xff1a; 有三种解决方法&#xff1a; &#xff08;1&#xff09;清除DNS缓存 步骤&#xff1a;…

为什么删掉MySQL表中一半的数据,表文件大小却不变?

一个InnoDB表包含两部分&#xff1a;表结构定义和数据。表结构定义占用空间很小&#xff0c;所以主要来看一下表数据。 表数据既可以存放在共享表空间里&#xff0c;也可以是单独的文件。由参数innodb_file_per_table控制&#xff0c;这个参数值为OFF&#xff0c;则表示存放在…

Unity——VContainer的依赖注入

一、IOC控制反转和DI依赖倒置 1、IOC框架核心原理是依赖倒置原则 C#设计模式的六大原则 使用这种思想方式&#xff0c;可以让我们无需关心对象的生成方式&#xff0c;只需要告诉容器我需要的对象即可&#xff0c;而告诉容器我需要对象的方式就叫做DI&#xff08;依赖注入&…

亚马逊店铺账号在申诉中需要注意的几点?

切勿推卸责任 如需提供证明材料&#xff0c;确保证明材料的真实性(比如有时候要拆料) 不要给自己加罪名。问题是什么只承认这个错误。有申诉勘查机构&#xff0c;还会升级查询。 不要重复发一模一样的申诉信。起码要修改一下顺序&#xff0c;或者提醒没有收到&#xff0c;我再发…

为什么基于树的模型在表格数据任务中比深度学习更优?

论文 | Why do tree-based models still outperform deep learning on tabular data? 代码 | https://github.com/LeoGrin/tabular-benchmark 虽然深度学习在计算机视觉、自然语言处理等领域取得了显著的成果&#xff0c;但在处理表格数据任务方面&#xff0c;深度学习模型的…

Logback框架基本认识

文章目录 一.什么是Logback1.1 初识Logbcak 二.Logbcak的结构三.日志的级别四.配置组件详解4.1 logger 日志记录器属性的介绍如何在配置文件里配置 4.2 appender 附加器 配合日志记录器的输出格式4.2.1 控制台附加器4.2.2 文件附加器4.3.3滚动文件附加器 4.3 Filter: 过滤器&am…

机器学习激活函数

激活函数 激活函数是人工神经网络中的一个重要组成部分。它们用于向神经网络中添加非线性因素&#xff0c;使得网络能够解决复杂问题&#xff0c;如图像识别、语言处理等。激活函数的作用是决定一个神经元是否应该被激活&#xff0c;也就是说&#xff0c;它帮助决定神经元的输…

大模型关于Lora论文集合

《Chain of LoRA:Efficient Fine-tuning of Language Models via Residual Learning》 Chain of LoRA (COLA)&#xff0c;这是一种受 Frank-Wolfe 算法启发的迭代优化框架&#xff0c;旨在弥合 LoRA 和全参数微调之间的差距&#xff0c;而不会产生额外的计算成本或内存开销。CO…

【清华社机器之心】视频生成前沿研究与应用特别活动

在视频生成即将迎来技术和应用大爆发之际&#xff0c;为了帮助企业和广大从业者掌握技术前沿&#xff0c;把握时代机遇&#xff0c;机器之心AI论坛就将国内的视频生成技术力量齐聚一堂&#xff0c;共同分享国内顶尖力量的技术突破和应用实践。 论坛将于2024.01.20在北京举办&am…

股东分红模式玩法解析!

股东分红模式股东分红模式是指公司通过向股东支付现金或股票的方式&#xff0c;将公司利润分配给股东的一种方式。不同的股东分红模式有着不同的特点和应用场景。 ​一、模式概述 一个私域电商平台&#xff0c;非常重要的一个角色是“团队长”&#xff0c;尤其是能够带动业绩和…

Win11安装与卸载Oracle 19c数据库

一、官网下载安装包 进入官网&#xff0c;选择产品-Oracle DataBase&#xff0c;点击进入下载界面 官网 二、安装 将下载的压缩包进行解压&#xff0c;解压路径随意即可 1 双击exe文件开始安装 等待出现如下页面 2 选择所示&#xff0c;点击下一步 3 选择桌面类安装 4 创…

openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题

文章目录 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题194.1 分析查询语句长时间运行的问题194.1.1 问题现象194.1.2 原因分析194.1.3 处理办法 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时…

leetcode动态规划(零钱兑换II、组合总和 Ⅳ)

518.零钱兑换II 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount 5, coins [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 55 5221 52111 511111 示例 2: 输入: amount 3, coi…

conda安装和配置以及处理OSError: [WinError 123]异常

conda安装和配置 由于更换电脑&#xff0c;浅浅记录下conda安装和配置。以及处理这次安装的 OSError: [WinError 123] 异常。 conda的作用 下载之前&#xff0c;先了解下为什么需要使用conda&#xff0c;它是一个开源的Anaconda是专注于数据分析的Python发行版本&#xff0c;…