V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
arbipher
V2EX  ›  程序员

[牢骚加请教]温故而知故,关于git

  •  
  •   arbipher · 2014-02-11 02:10:44 +08:00 · 5259 次点击
    这是一个创建于 3942 天前的主题,其中的信息可能已经有所发展或是发生改变。
    感觉什么东西学得都不透彻,几天不碰又忘了。就算刚学过的东西,用的时候还是脱离不了Google、StackOverflow
    git也是学了忘、忘了学。总是温故而知故,太伤感了。问题在哪呢?是因为从来没学好过,还是用少了?

    这几天把Pro git看了下。画了张图,连不断理还乱。

    http://imglf0.ph.126.net/j65-Guzksy-HuHU__djchg==/1835216848253602443.jpg

    请教版上各位大神,这些指令都常用吗?Pro git上还看到诸如“commit之后又想把修改添加到这次commit”“把一个commit拆分成两个commit”,这些功能有什么实用价值吗?能不能略过。。。
    第 1 条附言  ·  2014-02-11 10:45:36 +08:00
    图片随手传了lofter,原来链接失效了。。。


    P.S. 原来v2ex的新贴有MOVE和EDIT,第二天看就只有APPEND了
    第 2 条附言  ·  2014-02-12 02:41:20 +08:00
    又看了半天的git,希望以后不要再重新学过了。
    稍微有点温故而知新,满足了(还真是容易满足啊)

    关于git,我推荐《Pro git》和 http://think-like-a-git.net/

    第一条附言,解决的问题是,如何形成一个commit

    剩下的关键,主要是:
    commit是有向图的一个节点
    merge \ rebase

    到此,概念上的问题解决了。

    P.S.
    这次重温git,是要回答一个同学的问题。实在不要意思,我也是临时报了佛教。
    谷歌用git metaphor搜出来一篇吐槽rant
    https://ventrellathing.wordpress.com/2013/01/25/git-a-nightmare-of-mixed-metaphors/
    里面作者提到:
    “pulling from upstream”, “fetch”, “cherry pick”, “filter branch”, “untracked”, “symlink”, “rebase”, “tag”, “HEAD”, “working copy”, “head”, “path”, “stash”, “clone”, “submodule”, “fast-forward”, “merge”, “origin/master”, “staging area”

    Unless you are a surrealist poet, you will have a hard time generating anything of value with these terms.

    除了“filter branch”、“symlink”,差不多都理解了。
    30 条回复    1970-01-01 08:00:00 +08:00
    zeyexe
        1
    zeyexe  
       2014-02-11 03:58:48 +08:00
    恕我问句题外话,你用什么工具画的图?
    vibbow
        2
    vibbow  
       2014-02-11 05:38:13 +08:00
    直接用SourceTree,基本一条git命令都不会...
    wwqgtxx
        3
    wwqgtxx  
       2014-02-11 07:28:12 +08:00 via Android
    简单命令用命令行,复杂的用git gui
    常用的直接写进批处理文件
    我就是这么干的
    alexrezit
        4
    alexrezit  
       2014-02-11 07:29:13 +08:00 via iPhone
    为什么质疑实用价值?
    FrankFang128
        5
    FrankFang128  
       2014-02-11 08:38:36 +08:00 via Android
    当然可以略过。
    hkongm
        6
    hkongm  
       2014-02-11 08:44:17 +08:00
    2楼真理!同样用ST中
    jianghu52
        7
    jianghu52  
       2014-02-11 08:46:27 +08:00
    git svn这样的东西,我都是现用现查的,最常用的也就那么不到10个命令,一个版本工具,还准备上升到什么地步,有这功夫提升代码质量多好。多想想怎么重构代码是真的。
    est
        8
    est  
       2014-02-11 08:56:37 +08:00   ❤️ 1
    > commit”“把一个commit拆分成两个commit”,这些功能有什么实用价值吗?能不能略过。。。

    有的。本地分支可能比较混乱,但是大规模项目,你需要把revision弄得漂亮一点。不要到处都是typo, fix, update这种口水commit。可能越下游颗粒度越细,越到上游就是一个完整功能+测试一个commit了。

    还有这种模型:

    一个大型项目,多个开发者的commit到一个功能模块的repo,然后功能模块作为单一contributor一次性提交到全局mainline。
    FatGhosta
        9
    FatGhosta  
       2014-02-11 09:48:24 +08:00   ❤️ 1
    有时候你一次commit,提交了两个功能就需要合并一个。或者多次提交只实现了一个功能,那就需要合成一个。
    这种提交利于审核,以及必要时候的cherrypick
    lingyired
        10
    lingyired  
       2014-02-11 09:58:11 +08:00
    该图已被屏蔽- -
    FatGhosta
        11
    FatGhosta  
       2014-02-11 10:00:00 +08:00
    @vibbow 这个工具这么神奇。。。
    arbipher
        12
    arbipher  
    OP
       2014-02-11 10:40:16 +08:00
    @zeyexe OmniGraffle (mac)
    arbipher
        13
    arbipher  
    OP
       2014-02-11 10:47:52 +08:00   ❤️ 1
    @vibbow 我来试用一发
    oldcai
        14
    oldcai  
       2014-02-11 11:41:15 +08:00
    @est typo, fix, update,哈,高命中率的一击啊,我刚用git的时候基本上就是这三个,外加第一个init。。。

    @arbipher 图片很清晰,楼主梳理的很好嘛。
    lazywen
        15
    lazywen  
       2014-02-11 12:41:35 +08:00
    @jianghu52 除非你是一个人单干,不然等着哭吧
    kneep
        16
    kneep  
       2014-02-11 18:19:04 +08:00 via iPhone   ❤️ 1
    非常实用,这正是svn之类的工具缺的。
    一个好的commit,必须同时具有以下两个特征:
    1. 一个commit只解决一个问题
    2. 一个commit包含解决这个问题需要的所有修改
    kneep
        17
    kneep  
       2014-02-11 18:24:43 +08:00 via iPhone   ❤️ 1
    再说一下为什么要这么做:
    1. 逻辑清晰,赏心悦目,也方便patch的展示,传递
    2. 便于回退查找问题,你可以看看git bisect是干什么的
    3. 便于持续集成,自动化测试,达到这样的效果:一个commit进去,一份自动化测试报告出来
    jason52
        18
    jason52  
       2014-02-11 21:23:20 +08:00
    OmniGraffle好啊 pro git里面的图也是OmniGraffle画的。windows下面没有类似工具呀。。
    blacktulip
        19
    blacktulip  
       2014-02-12 03:01:46 +08:00
    @jason52 Microsoft Visio
    lightening
        20
    lightening  
       2014-02-12 03:33:39 +08:00   ❤️ 3
    实用价值还是比较大的。
    由于我们的项目有很多 branch,我们经常需要 cherry-pick 一个分支的 commits 到另一个分支。这种情况下,每次提交时我们必须做到 atomic commit,每个 commit 仅包含一个功能。这时候拆解就很重要。

    另外,我们不提倡在代码中写注释。所有要评论的东西统一放在 git 的 commit message 里(第二行可以写很多)。在别人不理解你的代码时,blame 一下就知道你当时做这个修改是为了什么。因此,commit 的组织就显得尤其重要。这样做的好处是防止有人更新了代码却又忘了更新注释,导致注释和代码不匹配的情况。
    bcxx
        21
    bcxx  
       2014-02-12 08:31:09 +08:00
    @lightening commit 的时候才写 comment 会不会出事的啊……例如忘记了一些很细微的细节没注释上去这样
    4gShell
        22
    4gShell  
       2014-02-12 09:16:43 +08:00
    看一百遍,不如动手做一遍。
    hitsmaxft
        23
    hitsmaxft  
       2014-02-12 12:21:19 +08:00
    命令嘛, 只有派上用场才知道价值
    很多git维护命令在对代码提交有严格规定的场景才常用,可以只了解一下。
    大部分人也就是当高级svn用

    最重要就是实践,无他
    arbipher
        24
    arbipher  
    OP
       2014-02-12 12:42:11 +08:00 via Android
    @4gShell
    @hitsmaxft
    恩。这一轮看完了,开始动手了。也不是没用过,总是在很糊涂的level,用用忘忘。。。
    housne
        25
    housne  
       2014-02-12 13:11:46 +08:00
    - - 问个问题,在git push 的时候发现自己错提交了一个文件,刚好这个文件有点大(我才不会告诉你是小视频), push 得好长时间,我 ctrl + c 取消了 push, 这时候要怎么删除这文件 ? 使用 git rm --cache file ?
    lsmgeb89
        26
    lsmgeb89  
       2014-02-12 17:18:01 +08:00
    楼主,你现在的项目是用 git 的嘛?如果不是的话,有个概念就好了。到要用的时候,你自然会把他们搞的很清楚。
    arbipher
        27
    arbipher  
    OP
       2014-02-12 18:46:39 +08:00
    @lsmgeb89 是。之前自己的小项目简单的试过,但是commit树都是线型的……从github上看的开源项目也只到git clone 这一步。
    这次是要和人协作了,用的就是git。
    lightening
        28
    lightening  
       2014-02-12 18:46:54 +08:00
    @bcxx 所以要频繁 commit,然后再 push 前 rebase 整理一下。
    arbipher
        29
    arbipher  
    OP
       2014-02-12 18:47:07 +08:00
    @housne git status 显示什么?
    lsmgeb89
        30
    lsmgeb89  
       2014-02-12 19:14:12 +08:00   ❤️ 1
    @arbipher 你不熟,只是你用的不多,很多 case 没遇到过。像你现在天天用 git 和别人协作开发几个月之后,你肯定很熟了,而且你有很多心得,懂得很多小技巧。这个东西只是工具,不用就忘了很正常的啊。不过,最好在第一遍学的时候,就把自己的理解东西保存成笔记(形成一个 minimal tutorial )。这样子,以后再复习的时候,就能用自己的笔记,以最快的速度回忆起来,因为这个是你自己的理解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1692 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:44 · PVG 00:44 · LAX 08:44 · JFK 11:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.