V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
1000copy
V2EX  ›  问与答

刚刚查了 git, v 友中拥护者很多,我来一个槽点,恳请轻拍。

  •  
  •   1000copy · 2016-03-23 20:51:51 +08:00 · 2787 次点击
    这是一个创建于 3167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般流程涉及的命令还好,到需要撤销操作的时候,就有点乱。所以,我看到 git reset HEAD -- file.ext 这个幽灵般的子命令就有点蒙。

    使用此命令,可以把 file.ext 移除暂存区。可是为什么不是 git unstage file.ext 呢。

    命名应该体现语义, unstage 就是体现了语义的,在 pro git 一书中也建议通过自定义命令的方法,定义一个 unstage ,替代 reset 在此场景下的使用。 git reset HEAD -- file.ext 则是体现了它的实现。你要明白 reset 子命令是从 HEAD 之内取出 file.ext,使用此文件复写暂存区文件,从而达成把已经暂存的文件恢复成前一个版本的效果。为此,你就需要弄明白三个树的存储结构。等到钻入这个黑洞。我明白时,我已经把 tree 的三种存储搞清楚了。我就是这样任性的向偶像致敬的。

    OMG ,为了连接 SQL ,你得弄明白关系数据库的存储——就是这个意思。

    仿佛还不够复杂,于是还有:

    1. git reset --hard HEAD
    2. git reset --soft HEAD
    3. git reset --mixed HEAD

    可是在偶像目前,我不敢乱讲话的。所以,你不妨看看:

    git reset

    http://stackoverflow.com/questions/4114095/revert-git-repo-to-a-previous-commit?lq=1

    原来并非我不懂。我不是一个人在战斗。

    pro git 的作者也说,第一版本我没有说 reset ,是因为,我也不懂。妈蛋,把 git 这么个命令行版本工具写的和 c++ primer 差不多厚的人说我其实写完了一本书也不懂 reset 的。

    另外, git add 是有多含义的,对于未跟踪的文件,可以用 add 把它变成已跟踪并且加入暂存区。对于修改的文件,可以用 add 加入暂存区。不同的场景功能是不同的。那么如何把一个未跟踪文件变成(仅仅变成已跟踪呢?我没有看到。 unix 的哲学是单一功能的命令,组合使用。一个多功能的命令未必合适。

    我的意思:我对 CLi 的设计略有微词。也许我有些地方没有弄明白,请明白人指正。内部存储、暂存、分支、合并、 rebase 都很好的。

    14 条回复    2017-07-22 07:59:10 +08:00
    msg7086
        1
    msg7086  
       2016-03-23 21:02:24 +08:00
    你也有其他选择,比如 GUI 。安利下 SmartGit 。
    GUI 的好处是他调用 Git CLI 的时候你可以在旁边学着,回头慢慢的你会学到不少奇淫技巧。
    msg7086
        2
    msg7086  
       2016-03-23 21:03:40 +08:00
    另外,很多时候安利 Mercurial 就是因为 Git CLI 各种乱,虽然 Mercurial 也有自己的坑就是了。
    cyio
        3
    cyio  
       2016-03-23 21:08:15 +08:00
    @msg7086 +1 ,我就是这么干的
    cxbig
        4
    cxbig  
       2016-03-23 21:11:15 +08:00
    操作上的一些不便利都是小事,提升团队协作效率才是关键性的优势。
    just4test
        5
    just4test  
       2016-03-23 21:16:03 +08:00
    add 操作其实可以视为 put 操作。
    old9
        6
    old9  
       2016-03-23 21:41:01 +08:00 via Android
    安利下 gitsavvy
    clino
        7
    clino  
       2016-03-23 21:48:18 +08:00
    "仅仅变成已跟踪"
    是什么意思?我的理解并没有单纯的已跟踪这种属性,要变成已跟踪,总要有一个基本版本被加入 git 的数据库中,要么被提交到暂存区,要么已经被正式提交
    lightening
        8
    lightening  
       2016-03-23 22:05:22 +08:00
    git 的命令行已经被诟病多年了……
    chmlai
        9
    chmlai  
       2016-03-23 22:22:07 +08:00   ❤️ 1
    Mac 可以用 gitup;
    直接支持 command-z 来撤销
    SoloCompany
        10
    SoloCompany  
       2016-03-23 22:38:23 +08:00   ❤️ 1
    add 其实还好,没有什么不一致,就是添加到暂存区,无论是添加删除修改状态都要 ‘ add' 到暂存区之后才可以 commit ,这个语意冲突就先不提了,其它的各种晦涩难懂,说反人类真一点不为过
    ChiangDi
        11
    ChiangDi  
       2016-03-23 22:51:42 +08:00
    学会那几个常用的命令就可以应付 90% 的日常工作了
    menc
        12
    menc  
       2016-03-24 00:40:05 +08:00
    看 github 客户端就知道,版本控制软件在够用的前提下能达到多好用。
    什么常用的足够了
    什么 gui 不需要
    都是自己找罪受, github 的客户端究竟差在哪里? sourcetree 究竟差在哪里?
    Sharuru
        13
    Sharuru  
       2016-03-24 08:09:32 +08:00 via Android
    一直认为 Git 用 GUI 来操作不要太爽~一排按钮点点点该有的功能都有了。

    这么多命令行除非碰到疑难杂症不然一般真没 CLI 啥事。

    顺便吐槽 SourceTree 越更新越难用(顺便还很丑)

    安利下 GitExtension
    dcoder
        14
    dcoder  
       2017-07-22 07:59:10 +08:00
    @1000copy
    同意很多吐槽, 各个 git xxx 的语义有时找不到规律, 最后靠一个个的经验记忆
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:05 · PVG 22:05 · LAX 06:05 · JFK 09:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.