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 · 945 次点击
    这是一个创建于 550 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学 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   ·   实用小工具   ·   3001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.