Git教程学习:03 记录每次更新到仓库

文章目录

    • 1 检查当前文件状态
    • 2 跟踪新文件
    • 3 暂存已修改的文件
    • 4 状态简览
    • 5 忽略文件
    • 6 查看已暂存和未暂存的修改
    • 7 提交更新
    • 8 跳过使用暂存区域
    • 9 移除文件
    • 10 移动文件

现在我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件的 工作副本。 通常,我们会对这些文件做些修改,每当完成了一个阶段的目标,想要将记录下它时,就将它提交到仓库。请记住,我们工作目录下的每一个文件都不外乎这两种状态:已跟踪未跟踪

image-20240116185636185

1 检查当前文件状态

查看哪些文件处于什么状态,使用git status

$ git status

如果在克隆仓库后立即使用此命令:

image-20240116214307778

出现的"On branch … clean"信息说明我们现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。 最后,该命令还显示了当前所在分支,并告诉我们这个分支同远程服务器上对应的分支没有偏离。 现在,分支名是“master”,这是默认的分支名。

现在在项目下创建一个新的 README 文件:

$ echo 'My Project' > README
$ git status

image-20240116215921421

在状态报告中可以看到新建的 README 文件出现在 Untracked files 下面。 未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非我们明明白白地告诉它“我需要跟踪该文件”。不过现在我们需要跟踪管理README这个文件。

2 跟踪新文件

使用git add 开始跟踪一个文件并用git status查看状态。所以,要跟踪README文件,运行:

$ git add README
$ git status

image-20240116220536155

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

3 暂存已修改的文件

现在我们来修改一个已被跟踪的文件。比如,该项目下的README.md文件(这是一个已被跟踪的文件)。运行:

$ git status

image-20240116222531430

文件 README.md 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行 git add 命令。

git add 命令功能:

  • 跟踪新文件
  • 把已跟踪的文件放到暂存区
  • 用于合并时把有冲突的文件标记为已解决状态
$ git add README.md
$ git status

image-20240116223012860

现在两个文件都已暂存,下次提交时就会一并记录到仓库。 假设此时,我们想要在 README.md 里再加条注释。 重新编辑存盘后,准备好提交。 不过且慢,再运行 git status 看看:

$ vim README.md
$ git status

image-20240116223651241

怎么回事? 现在 README.md 文件同时出现在暂存区和非暂存区。 这怎么可能呢? 好吧,实际上 Git 只不过暂存了你运行 git add 命令时的版本。 如果我们现在提交,README.md 的版本是我们最后一次运行 git add 命令时的那个版本,而不是我们运行 git commit 时,在工作目录中的当前版本。 所以,运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来:

$ git add README.md
$ git status

image-20240116223931343

4 状态简览

git status 命令的输出十分详细,但其用语有些繁琐。 Git 有一个选项可以帮你缩短状态命令的输出,这样可以以简洁的方式查看更改:

$ git status -s
$ git status -short

image-20240116224523110

  • ??:新添加的未跟踪文件
  • A:新添加到暂存区中的文件
  • M:修改过的文件

5 忽略文件

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

$ cat .gitignore
*.[oa]  # 告诉Git忽略所有以 .o 或 .a 结尾的文件
*~		# 告诉 Git 忽略所有名字以波浪符(~)结尾的文件

要养成一开始就为我们的新仓库设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

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

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

6 查看已暂存和未暂存的修改

git diff可以通过文件补丁的格式更加具体地显示哪些行发生了改变,可以用来回答:

  • 当前做的哪些更新尚未暂存?
  • 有哪些更新已暂存并准备好下次提交?

假如再次修改 NEWFILE 文件后暂存,然后编辑 README.md 文件后先不暂存, 运行 status 命令将会看到:

image-20240116233811364

运行git diff,观察暂存前后的变化:

$ git diff

image-20240116234034748

然后用 git diff --cached 查看已经暂存起来的变化( --staged--cached 是同义词):

$ git diff --cached

7 提交更新

现在的暂存区已经准备就绪,可以提交了。 在此之前,请务必确认还有什么已修改或新建的文件还没有 git add 过, 否则提交的时候不会记录这些尚未暂存的变化。 这些已修改但未暂存的文件只会保留在本地磁盘。 所以,每次准备提交前,先用 git status 看下,我们所需要的文件是不是都已暂存起来了, 然后再运行提交命令 git commit

$ git commit
$ git commit -m "提交说明"

image-20240116235044269

8 跳过使用暂存区域

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

$ git status
$ git commit -a -m '提交说明'

image-20240116235652621

9 移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

情况一:从工作目录中手工删除文件

运行 git status 时就会在 “Changes not staged for commit” 部分(也就是 未暂存清单)看到:

$ rm <filename>
$ git status

image-20240117000108143

再运行 git rm 记录此次移除文件的操作:

$ git rm <filename>
$ git status

image-20240117000520891

下一次提交时,该文件就不再纳入版本管理了。

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

情况二:把文件从 Git 仓库中删除,但保留在当前工作目录中

即想让文件保留在磁盘,但是并不想让 Git 继续跟踪。

当我们忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,使用 --cached 选项:

$ git rm --cached README

image-20240117001609463

10 移动文件

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

在Git中对文件改名:

$ git mv file_from file_to

举例:

$ git mv README.md README
$ git status

image-20240117002730548

运行 git mv 就相当于运行了下面三条命令:

$ mv README.md README
$ git rm README.md
$ git add README

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

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

相关文章

git设置代理

git设置代理 git config --global http.proxy 127.0.0.1:7890git查询代理 git config --global http.proxy git取消代理 git config --global --unset http.proxy

揭开UI设计的神秘面纱:如何打造一款让用户爱不释手的移动APP

文章目录 一、目标用户分析二、设计风格和色彩搭配三、布局和导航设计四、交互设计五、视觉元素设计六、响应式设计七、测试和优化八、持续更新和迭代九、团队协作和沟通十、学习和成长《移动APP UI设计与制作(微课版)》编辑推荐内容简介目录 《Flutter入门经典&#xff08;移动…

matlab simulink 7自由度横向车辆模型

1、内容简介 略 32-可以交流、咨询、答疑 2、内容说明 图一.七自由度车辆动力学模型 纵向力平衡方程&#xff1a; ① 侧向力平衡方程&#xff1a; ② 绕Z轴力矩平衡方程&#xff1a; ③ 四个车轮的力矩平衡方程&#xff1a; ④ 上述方程中&#xff1a;δ为前轮转角&#x…

官宣!Meta正在训练Llama 3,将继续开源

1月19日&#xff0c;全球社交、科技巨头Meta的联合创始人兼首席执行官-Zuck&#xff08;扎克伯格&#xff09;在is宣布&#xff0c;正在训练Llama 3并且以负责任地方式继续开源。 Zuck表示&#xff0c;预计到2024年底&#xff0c;Meta将拥有350,000块H100&#xff0c;如果算上…

PyTorch各种损失函数解析:深度学习模型优化的关键(1)

目录 详解pytorch中各种Loss functions binary_cross_entropy 用途 用法 参数 数学理论 示例代码 binary_cross_entropy_with_logits 用途 用法 参数 数学理论 示例代码 poisson_nll_loss 用途 用法 参数 数学理论 示例代码 cosine_embedding_loss 用途 …

数据结构--串

本文为复习的草稿笔记&#xff0c;&#xff0c;&#xff0c;有点乱 1. 串的基本概念和基本操作 串是由零个或多个字符组成的有限序列 2. 串的存储结构 3.串的应用 模式匹配 BF算法&#xff08;简单匹配算法 穷举法 算法思路&#xff1a;从子串的每一个字符开始依次与主串…

卷积神经网络和深度神经网络的区别与联系

DNN是指深度神经网络&#xff0c;它是一个很广的概念&#xff0c;某种意义上CNN、RNN、GAN等都属于其范畴之内。DNN与CNN&#xff08;[卷积神经网络&#xff09;的区别是DNN特指全连接的神经元结构&#xff0c;并不包含卷积单元或是时间上的关联。其中最初的神经网络的所有隐含…

尚硅谷Nginx高级配置笔记

写在前面&#xff1a;本笔记是学习尚硅谷nginx可成的时候的笔记&#xff0c;不是原创&#xff0c;如有需要&#xff0c;可以去官网看视频&#xff0c;以下是pdf文件 Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云…

基于Java SSM框架实现中学校园网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现中学校园网站管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

2024-01-15(SpringMVCMybatis)

1.拦截器&#xff1a;如果我们想在多个handler方法(controller中的方法)执行之前或者之后都进行一些处理&#xff0c;甚至某些情况下需要拦截掉&#xff0c;不让handler方法执行&#xff0c;那么就可以使用SpringMVC为我们提供的拦截器。 拦截器和过滤器的区别&#xff1a;过滤…

【C++ Primer Plus】2.1 进入C++

代码示例 #include <iostream> // a preprocessor directive 预处理器指令 int main () // function header { // start of function bodyusing namespace std; // make definitions visiblecout << "hello!"; // message…

TypeScript依赖注入框架Typedi的使用、原理、源码解读

简介 typedi是一个基于TS的装饰器和reflect-metadata的依赖注入轻量级框架&#xff0c;使用简单易懂&#xff0c;方便拓展。 使用typedi的前提是安装reflect-metadata&#xff0c;并在项目的入口文件的第一行中声明import ‘reflect-metadata’&#xff0c;这样就会在原生的R…