Git
git add

git add 命令:取消、全部、文件目录、-u、-i 选项

git init命令之后,这篇文章是关于git add命令。 我们将介绍git从addcommit的工作原理,提高工作效率的选项,以及如何撤销缓存的文件和目录。 我们还将在最后为那些想了解更多的人总结内部工作原理。

1. 从添加到提交的简单机制

1.1 了解git添加和git提交的流程

在我们深入了解git的工作原理之前,有件事需要思考一下。 如果我们需要创建并保存一个新的文档,我们会经历多少个步骤?

答案很简单:写 -> 保存 -> 提交,文档就被保存了。 这很简单,但有一个问题。因为只有一个步骤,所以很有可能会保存错误。

Git非常重视保存一次。 这就是为什么它需要两个步骤,以尽量减少在一次保存中犯错的机会。 这些步骤如下

当对任何文件进行修改时,会用git add命令提交。 然后我们运行git commit,将当前处于暂存状态的所有修改作为一次提交提交到历史。

当对已经提交的文件进行新的修改时,它就会成为另一个git add命令的对象。 这就是版本控制的工作方式: git add -> git commit -> 文件修改 -> git add

让我们看一个例子来理解。

1.2 通过自己动手了解git add和git commit

首先,我们准备好存放两个markdown文件的目录,并创建一个新的 repo。当我们用git status命令查看当前状态时,我们看到有两个文件还没有被跟踪。

git add前未追踪的状态

我们用git add命令添加一个文件,1.md,到暂存状态。`1.md'文件的跟踪,显示为浅绿色,已经开始,正在等待提交。

git add后的状态

git commit -m "commit message"命令执行提交后,对文件1.md的修改被注册为新的提交,并从暂存状态消失。

git commit后的状态

此时,如果1.md文件有任何新的改动,它将返回到暂存状态。

有改动的文件处于staged状态

这就是addcommit命令的重复方式。

1.3 更详细一点

Git对工作文件夹中的所有文件或文件夹进行跟踪,主要有两种状态

  • untracked: git没有跟踪文件的变化。
  • tracked:git正在跟踪文件的变化。 当你用git init命令创建一个新的 repo时,所有文件都是未被跟踪的。git add命令将一个文件从非跟踪状态变为跟踪状态,并继续观察变化。

git将被追踪的文件保持在三种状态中的一种

  • staged: 阶段性状态是准备成为提交。当一个处于非跟踪状态的文件第一次被改成跟踪状态时,它就变成了staged。处于修改状态的文件也会通过git add命令进入暂存状态。
  • unmodified: 当使用git commit命令提交时,处于暂存状态的文件会变成未修改状态。这个状态一直保持到不再有任何修改。
  • Modified: 当一个未修改状态的文件被修改时,它就变成了修改状态。处于这种状态的文件成为git add命令的目标。

总结所有的状态,你可以认为它们是从untracked--(git add)-->tracked/staged --(git commit)-->unmodified--(发生变化)-->staged。

2. 使用git add -A或--all命令添加所有文件和文件夹

如上面的例子所示,要在当前工作文件夹中阶段性地添加一个特定的文件或文件夹,使用以下命令

git add <file 1>, <file 2>, <folder 1>

如果<folder 1>中有子目录,Git会自动将它们一起加入到暂存状态。

如果你想对当前工作文件夹中的所有文件和文件夹进行暂存,而不需要选择特定的文件或文件夹,可以使用下面的命令。这将针对所有未跟踪的和已修改的文件。

$ git add -A

或者你可以使用

$ git add .

3. 用git add -u只添加被跟踪的文件和文件夹

要想只对当前工作文件夹中被Git跟踪的所有修改过的文件和文件夹进行阶段性添加,请使用以下命令。 与第2节中的命令相比,这不包括未被追踪的文件和文件夹。

$ git add -u

4. 用git add -i命令轻松地添加你想要的文件和文件夹

如果你用下面的命令启动交互式模式,你可以只添加你想要的阶段的文件,或者用一个简单的数字来删除它们。

$ git add -i

这就是互动模式的样子

git add -i result

交互式模式将命令与 "git status "输出一起打印出来。根据您的选择,4用来对未跟踪的文件进行分段,2用来对已修改的文件进行分段。3用来恢复由2和4分阶段的文件。

5. 撤销git add

除了交互式模式之外,还有一条命令可以恢复由git add命令添加的文件和文件夹。

要恢复一个工作文件夹中的特定文件和文件夹,可以使用以下命令

git restore --staged <file 1>, <folder 1>

要恢复所有的文件和文件夹,使用命令

$ git restore --staged .

6. git add命令的内部行为

在内部,Git使用一些关键的数据结构和概念来管理和跟踪变化。 让我们一步步来看看当你运行 "git add "命令时,内部会发生什么。

  1. 当你运行git add命令时,Git会对指定文件的内容进行快照,并在Git的对象数据库(位于.git/objects)中创建一个新的blob对象。 该blob对象代表文件的内容,而不是文件本身。
  2. 2.然后,Git引用blob对象为文件的暂存区域添加一个条目(换句话说,索引)。该条目包含文件的路径、模式(文件类型和权限)以及blob对象的SHA-1哈希值。 如果你添加了多个文件,Git将为每个文件创建一个单独的blob对象和索引条目。
  3. 现在你可以提交你的增量变化了。运行 "git commit "命令会创建一个新的树状对象,代表新提交的目录结构和文件内容。 它还会创建一个新的提交对象,指向该树对象,存储提交元数据(如作者、日期、消息),并指向父提交。
  4. 最后,Git 会更新分支的引用(例如主分支的 refs/heads/master),使其指向新的提交对象,使其成为该分支历史中的最新提交。

总之,当你运行git add命令时,它会为添加的文件创建一个blob对象,用该文件的信息更新暂存区域,然后为下一次提交做准备、 并为下一次提交做准备。在你运行git commit之前,提交本身不会被创建。

7. 最后的想法

git add命令是git版本控制系统的核心,有很多概念可以让你很好的理解它的工作原理。 我希望这篇文章能让你很好地理解git版本控制系统背后的概念,以及你有许多选项可以让分期付款更容易。

copyright for git add

© 2023 All rights reserved.