你们 git stash 用的多么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
v2byy
V2EX    git

你们 git stash 用的多么

  •  
  •   v2byy 2018-07-31 09:22:48 +08:00 8884 次点击
    这是一个创建于 2697 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以前使用 svn 的时候,每个 branch 都在本地有一份代码,这样方便在切换分支,在一个分支加 feature,可以很方便的在另外的分支上修 bug。

    后来使用 git 之后,默认所有 branch 都位于在一份 copy 中,有的时候临时要切个分支,但有不想提交的时候,只能用 git stash 来暂存下改动。问题是这样很麻烦,有的时候 add 了新文件忘记 stage,git stash pop 出来有问题。

    当然也可以使用 git 来 checkout 不同分支,不同 copy。

    大家是怎么做的呢?

    51 条回复    2018-08-01 14:10:43 +08:00
    sagaxu
        1
    sagaxu  
       2018-07-31 09:26:14 +08:00 via Android   11
    HongJay
        2
    HongJay  
       2018-07-31 09:44:10 +08:00
    我也是 svn 转的。。同样有这个问题
    reus
        3
    reus  
       2018-07-31 09:48:36 +08:00
    ……你直接把目录复制一份,不就是另一份代码了
    bjfane
        4
    bjfane  
    PRO
       2018-07-31 09:50:25 +08:00
    svn 是纯 copy 型分支,git 是指针型分支
    手头的非常不完整,不想 commit,那 stash 没问题,而且 查看 stash list 也能看是在哪个分支上的,也有命令看差异,
    如果是因为 新文件不习惯的话,可以尝试 commit,大不了 合并 commit 了 ,总的来说比 stash 更麻烦
    xianyu0
        5
    xianyu0  
       2018-07-31 09:50:50 +08:00   8
    git stash -u // 可以把未跟踪的文件也加入 stash
    liuzhedash
        6
    liuzhedash  
       2018-07-31 09:53:23 +08:00   1
    @reus #3
    文件比较多的项目,复制一次很麻烦的,如果有 node_modules 目录就更尴尬了
    ahmcsxcc
        7
    ahmcsxcc  
       2018-07-31 09:54:50 +08:00
    同样有这个问题
    newtype0092
        8
    newtype0092  
       2018-07-31 09:55:15 +08:00
    stash 不应该是一个常用的功能,如果你频繁的在没有完成当前提交的情况下切换分支,说明你的工作流有问题吧,这里一脚那里一脚有什么效率可言啊。
    自己一般来说最多两个 stash,再多可能都忘了之前在干嘛了,还不如删了重新写。
    linuxchild
        9
    linuxchild  
       2018-07-31 10:20:09 +08:00
    考虑一下 git flow ?
    ttyant
        10
    ttyant  
       2018-07-31 10:23:51 +08:00 via Android
    来回倒版本的不是好程序员,git 不是为你而生
    beny2mor
        11
    beny2mor  
       2018-07-31 10:26:37 +08:00   2
    我用的不多,一般切换前先 commit,切换回来后可以使 git commit --amend 合并
    woshifyz
        12
    woshifyz  
       2018-07-31 10:31:31 +08:00
    一般都可以 commit,然后用 rebase 操作下就好了,核心是你要从概念上转过来,操作起来就如鱼得水
    Biwood
        13
    Biwood  
       2018-07-31 10:52:37 +08:00
    执行 git stash 之前怎么着都得先 git add 一下吧,这样可以防止漏掉新文件,这是操作习惯的问题。

    PS:楼主头像来自风骚律师,我也挺喜欢这部剧的镜头美感。
    rockyou12
        14
    rockyou12  
       2018-07-31 11:11:49 +08:00
    我也觉得 commit 算了,stash 挺容易搞错的,即便你不 rebase 最多就 commit 日志难看一点
    hicdn
        15
    hicdn  
       2018-07-31 11:46:36 +08:00
    我一般是要做 hotfix 时,先在 dev 分支
    git diff > current.patch
    git reset --hard

    等修复完切回 dev 分支
    patch < current.patch
    randyzhao
        16
    randyzhao  
       2018-07-31 12:01:32 +08:00   1
    我都是先 commit -am 先
    再回来的时候 reset --soft HEAD^
    TabGre
        17
    TabGre  
       2018-07-31 12:02:18 +08:00 via iPhone
    @hicdn 这个 patch 是 git 的命令吗?
    xmadi
        18
    xmadi  
       2018-07-31 12:05:30 +08:00 via iPhone
    先 commit 切到另外一个分支改 改完再切回来 reset 到之前的已经上
    GG668v26Fd55CP5W
        19
    GG668v26Fd55CP5W  
       2018-07-31 12:10:26 +08:00
    还是开个分支吧
    hicdn
        20
    hicdn  
       2018-07-31 13:26:37 +08:00
    @TabGre linux 系统命令
    hcdn
        21
    hicdn  
       2018-07-31 13:31:42 +08:00
    @TabGre 用 git apply current.patch 也可以
    ylsc633
        22
    ylsc633  
       2018-07-31 13:39:41 +08:00
    为了避免出现问题!

    要临时切换分支 我一般先 commit 然后直接切换分支,这样代码不会上传,切回来也不会出错!

    不好的地方 就是 commit 不太好看...
    dobelee
        23
    dobelee  
       2018-07-31 13:43:49 +08:00 via Android
    几乎每一次提交都在用。不过是 gui 自动完成的。
    RyougiShiki
        24
    RyougiShiki  
       2018-07-31 13:57:39 +08:00
    pycharm 自带的 gui 工具每次 pull 时都用,虽然没理解它的作用
    ptrees
        25
    ptrees  
       2018-07-31 14:08:25 +08:00
    不用 stash,太容易出错,都是直接 commit
    lightzh
        26
    lightzh  
       2018-07-31 14:16:21 +08:00
    一般直接 commit,之后再 rebase 合并 commit 或者用 commit --amend
    drackzy
        27
    drackzy  
       2018-07-31 14:23:06 +08:00
    我一般 Jetbrain 系的 IDE 开两个,项目复制成2个分别打开。要不分支切不过来。一个开发分支用,一个用于临时随便分支。
    wjpdev
        28
    wjpdev  
       2018-07-31 17:23:46 +08:00
    IDEA 下方 Local Changes 文件右键 Shelve changes 可以解决这个问题。
    hqdmy
        29
    hqdmy  
       2018-07-31 17:32:33 +08:00
    经常 stash
    daemonghost
        30
    daemonghost  
       2018-07-31 18:11:28 +08:00
    ```
    > git stash --include-untracked # 将新添加的文件也暂存起来
    > git checkout -b new_branch
    ```
    tyrealgray
        31
    tyrealgray  
       2018-07-31 18:21:48 +08:00 via Android
    经常用
    focux
        32
    focux  
       2018-07-31 18:27:53 +08:00
    每次提交前必用,不然怎么把 remote 端的代码 pull 下来。
    ShineSmile
        33
    ShineSmile  
       2018-07-31 19:02:35 +08:00
    很好用,经常用。
    ai277014717
        34
    ai277014717  
       2018-07-31 19:12:32 +08:00
    用的多,GUI 很好用
    thinker3
        35
    thinker3  
       2018-07-31 19:21:24 +08:00
    面试题之一
    icylogic
        36
    icylogic  
       2018-07-31 19:40:01 +08:00 via iPhone
    其实在服务器的 gitlab 上看就挺好的。。。本地主要还是需要修改和调试。
    du5t6reak
        37
    du5t6reak  
       2018-07-31 22:20:01 +08:00
    用啊,不过还原的时候不要用 git stash pop 这个如果有冲突的话,stash 的代码是不会保存的。
    用 git stash apply stash@{}
    MrBearin
        38
    MrBearin  
       2018-07-31 22:26:30 +08:00
    偶尔
    tonyzzp
        39
    tonyzzp  
       2018-07-31 22:37:41 +08:00 via Android
    我一般是在更新代码的时候,如果和我本地修改有冲突,但我目前又不想提交我的代码,这时我会用 stash 然后 pull,再 stash pop 继续 写代码。
    randyzhao
        40
    randyzhao  
       2018-07-31 22:43:59 +08:00
    @focux #32

    回答一下你的“不然”
    先 commit
    再 pull --rebase 并处理冲突
    再 reset --soft
    renothing
        41
    renothing  
       2018-07-31 23:06:21 +08:00
    先 commit,后面切回去继续改了后--amend 追加提交。
    leafiy
        42
    leafiy  
       2018-07-31 23:14:45 +08:00
    amend 正解
    johnnie502
        43
    johnnie502  
       2018-07-31 23:25:15 +08:00
    直接 commit 一个 temp,那边弄完以后回来再 reset HEAD~1
    tomato3
        44
    tomato3  
       2018-07-31 23:51:23 +08:00
    ```
    git stash -k
    git pull
    git stash pop
    ```
    twistedmeadows
        45
    twistedmeadows  
       2018-08-01 00:59:06 +08:00 via Android   1
    可能你需要再多了解下 reset 和 rebase 那些操作的细节。
    例如 reset --hard、reset --soft

    我不怎么用 stash,要临时切 branch 的时候都是先顺手 commit -a。这种 commit 我不会认真地写内容,只填 tmp save 之类的,下次切回来就知道当前 commit 只是这个 branch 下的临时存档。
    等到当前 branch 上工作做完的时候,再 reset 回上一个正式的 commit 点,然后重新填写提交。

    这样每个 branch 完成开发的时候都是整洁的,确保每次 commit 都是一次逻辑上独立的改动的话,还可以方便地回退和 cherry-pick。在开发过程中又足够敏捷,可以同时有多个 branch 处于施工状态不过我在开太多 branch 时会主动意识到当前这个状态是很差的,会跟 leader 沟通工作分配的问题。


    小心得就是:commit 是无痛的,可以积极使用 commit。
    甚至,在 git 里除了 hard reset 这种破坏性操作,大多数操作都是可逆和无痛的。
    zhilincom
        46
    zhilincom  
       2018-08-01 01:59:35 +08:00 via Android
    我都是每次 stash 的时候加上描述信息和时间信息,还原环境的时候就使用 apply,不用 pop。
    weixiangzhe
        47
    weixiangzhe  
       2018-08-01 02:16:08 +08:00 via iPhone   1
    建议 git work tree
    msg7086
        48
    msg7086  
       2018-08-01 05:05:42 +08:00
    Git 的优势就在于 Commit 和 Branch 都是免费的。Stash 我只有在马上要恢复 Working Directory 的时候,比如 Stash+Pull+StashPop 的组合命令,才会用 Stash。其他的时候有 Commit 为啥要用实现相同但更难用的 Stash 呢。

    Feature branch 和 WIP commit 都是好东西。
    houskii
        49
    houskii  
       2018-08-01 11:37:43 +08:00
    commit 和 amend 都有 reflog 可以挽救,stash 如果误 pop 或者删了就很蛋疼了

    好吧,其实还是因为我之前有一次从 A 切到 B 然后 stash 了,在 B 开发了很久切回 A 的时候已经忘记了 stash pop 这回事,导致又重新开发了一遍,然后开发快结束了才想起来,从此就不用 stash 了。。。
    tt67wq
        50
    tt67wq  
       2018-08-01 11:49:47 +08:00
    无情资本家拿人当畜生使,一个人好多个任务并行,经常要 stash 切其他分支
    kuro1
        51
    kuro1  
       2018-08-01 14:10:43 +08:00
    =。= 一个人同时处理好几个 branch...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2742 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 14:51 PVG 22:51 LAX 06:51 JFK 09:51
    Do have faith in what you're doing.
    ubao msn 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