git add 的目的我猜测的对么?

2023-05-20 22:41:50 +08:00
 huzhikuizainali

最近在学 git ,书中只教使用步骤,没有过多介绍使用场景及每一步操作的目的。关于 git add 我有两个问题求教:

1 、git add 某文件后,该文件就被纳入跟踪。问题是纳入跟踪有什么用?

2 、git add 后文件进入 stage 。但是还要 commit 一步操作才能将文件加入本地 git 仓库。既然 git 是个管理备份代码的工具。那为什么不一步将文件 commit 进本地 git 仓库呢?非要加个 stage 这个中间状态呢?

因为我还没有做过相关工作。所以以下是我根据书中上下文的猜测。如果哪里有错误或不完整不准确的地方还请各位老师指教。


git add 文件进入 stage 以后,git 才会记录文件是否改动,才可以在 git status 命令下查看这个文件的修改记录。如果没有纳入 stage 状态。就不会记录跟踪文件的修改记录。所以 stage 就是个“文件版本比较工具”。这个工具与备份代码只有间接关系。

真正要备份 一个代码,必须要提交到 git 本地仓库。之所以 stage 看似是一个中间步骤,完全是因为 git 强制要将文件纳入 stage 以后才可以 commit 。

如果某人开发开发一个独立的代码版本管理工具。他完全可以将 stage 和 本地代码仓 做成平行关系。既本地代码文件用户只要想,就可以一步提交到本地代码仓,无需先对比再提交。只要本地代码仓做到记录每一个提交版本就可以。至于用户愿意用 stage 先比较一下,再提交。也可以。

------------------所以我以上的猜测是否正确?是否完整?

972 次点击
所在节点    git
7 条回复
xubeiyan
2023-05-20 23:53:27 +08:00
如果了解 git 的底层工作逻辑,就大概知道了,这个跟踪( tracked )相对就有未纳入跟踪( untracked ),在有的 git 仓库里面你能看到.gitignore 这个文件,这个文件就可以自定义哪些文件你不想跟踪
其次 git 并不保存每次 commit 后的文件,而是保存和上一次 commit 之间的差异(重点),如果这个文件是没有 tracked 的,那就无法去找到最初的版本,所以告诉 git 我要记录此文件的变动,那就必须要有一个原点,这就是 git add 的意义
julyclyde
2023-05-21 10:58:57 +08:00
因为 2 ,所以 1 是错误的
wdssmq
2023-05-21 12:18:42 +08:00
底层设计啥的我也不懂,也算用了比较久,说一些表象上的经验:

其实如果用图形界面的 TortoiseGit 的话,使用中确实是感觉不到 git add 这一步的,,软件把暂存和提交合并了。。

类似在线购物添加了一些商品到购买车,但是其中一些要不要买你还在犹豫,或者有一些不需要现在买,所以仅「勾选」本次要买的商品然后「结账」

git add 就相当于「勾选」本次要提交的修改。。git add . 就是「全选」,TortoiseGit 这类工具也确实给做成了「勾选」的操作形式;

然后还有一种姿势是,一个文件修改了 10 行,其中只有 8 行打算这一次提交,可以使用 git add -p 命令:

> 该命令会在交互模式下询问你是否要添加每一个修改的部分。你可以通过输入 y 来添加特定的修改,或者输入 n 来忽略它们。这种方式可能比较繁琐,但是可以实现对某些修改的有选择地跟踪。

好吧,我也是问了 AI 才知道这种操作的底层命令,现在主要用 VSCode 操作 Git ,可以直接用选中相应修改然后执行「暂存所选范围」
huzhikuizainali
2023-05-21 17:15:01 +08:00
谢谢指教!
然后还有一种姿势是,一个文件修改了 10 行,其中只有 8 行打算这一次提交,可以使用 git add -p 命令:
-------------请问这种比较高级的玩法,TortoiseGit 在纯图形界面中可以实现么?
huzhikuizainali
2023-05-21 17:15:44 +08:00
@wdssmq
谢谢指教!
然后还有一种姿势是,一个文件修改了 10 行,其中只有 8 行打算这一次提交,可以使用 git add -p 命令:
-------------请问这种比较高级的玩法,TortoiseGit 在纯图形界面中可以实现么?
cosette
2023-05-22 07:16:33 +08:00
因为 commit 并不是类似某些笔记软件的版本历史,随时随地 commit ,想起来就 commit 。因为开发是一个 progressive 的过程,所以有些部分已经完成可以 commit ,但有些部分还没有完成不适合提交,这时候 stage 充当了中间的准备阶段。

一次提交应该是内容完整的,如果总是把不相关的、半成品提交上去,自己拉的屎到时候自己擦,尤其是当你想追踪变更历史,或者回退的时候。😂
wdssmq
2023-05-22 07:46:44 +08:00
@huzhikuizainali 我发现可以这样操作时已经主用 VSCode 自带的 Git 管理了,TortoiseGit 作为备用。

刚看了下,有个「暂存支持(实验性!)」的选项,,“实验性”不说,研究了下还没搞懂怎么用。。这东西一开始的逻辑就等于把暂存区搞没了,想再支持就比较伤。。其他图形界面并没有用过。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/941601

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX