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

    以前使用 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  
       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 到之前的已经上
    falcon05
        19
    falcon05  
       2018-07-31 12:10:26 +08:00
    还是开个分支吧
    hicdn
        20
    hicdn  
       2018-07-31 13:26:37 +08:00
    @TabGre linux 系统命令
    hicdn
        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
    AscenZ
        26
    AscenZ  
       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   ·   实用小工具   ·   2931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:20 · PVG 22:20 · LAX 06:20 · JFK 09:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.