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

349 天前
 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 先比较一下,再提交。也可以。

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

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

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

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

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

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

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

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

一次提交应该是内容完整的,如果总是把不相关的、半成品提交上去,自己拉的屎到时候自己擦,尤其是当你想追踪变更历史,或者回退的时候。😂
wdssmq
348 天前
@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