git add 的目的我猜测的对么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
huzhikuizainali
V2EX    git

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

  •  
  •   huzhikuizainali 2023-05-20 22:41:50 +08:00 1262 次点击
    这是一个创建于 873 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学 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 先比较一下,再提交。也可以。

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

    xubeiyan
        1
    xubeiyan  
       2023-05-20 23:53:27 +08:00 via Android
    如果了解 git 的底层工作逻辑,就大概知道了,这个跟踪( tracked )相对就有未纳入跟踪( untracked ),在有的 git 仓库里面你能看到.gitignore 这个文件,这个文件就可以自定义哪些文件你不想跟踪
    其次 git 并不保存每次 commit 后的文件,而是保存和上一次 commit 之间的差异(重点),如果这个文件是没有 tracked 的,那就无法去找到最初的版本,所以告诉 git 我要记录此文件的变动,那就必须要有一个原点,这就是 git add 的意义
    julyclyde
        2
    julyclyde  
       2023-05-21 10:58:57 +08:00
    因为 2 ,所以 1 是错误的
    wdssmq
        3
    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
        4
    huzhikuizainali  
    OP
       2023-05-21 17:15:01 +08:00
    谢谢指教!
    然后还有一种姿势是,一个文件修改了 10 行,其中只有 8 行打算这一次提交,可以使用 git add -p 命令:
    -------------请问这种比较高级的玩法,TortoiseGit 在纯图形界面中可以实现么?
    huzhikuizainali
        5
    huzhikuizainali  
    OP
       2023-05-21 17:15:44 +08:00
    @wdssmq
    谢谢指教!
    然后还有一种姿势是,一个文件修改了 10 行,其中只有 8 行打算这一次提交,可以使用 git add -p 命令:
    -------------请问这种比较高级的玩法,TortoiseGit 在纯图形界面中可以实现么?
    cosette
        6
    cosette  
       2023-05-22 07:16:33 +08:00
    因为 commit 并不是类似某些笔记软件的版本历史,随时随地 commit ,想起来就 commit 。因为开发是一个 progressive 的过程,所以有些部分已经完成可以 commit ,但有些部分还没有完成不适合提交,这时候 stage 充当了中间的准备阶段。

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

    刚看了下,有个「暂存支持(实验性!)」的选项,,“实验性”不说,研究了下还没搞懂怎么用。。这东西一开始的逻辑就等于把暂存区搞没了,想再支持就比较伤。。其他图形界面并没有用过。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1053 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:07 PVG 07:07 LAX 16:07 JFK 19:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86