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

在使用 git 时的一些尴尬场景里的修复方案

  •  5
     
  •   Livid · 46 天前 · 6029 次点击
    这是一个创建于 46 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://ohshitgit.com

    还有一个简体中文的翻译版本:

    https://ohshitgit.com/zh
    35 条回复    2022-07-09 02:10:06 +08:00
    hsfzxjy
        1
    hsfzxjy  
       46 天前 via Android
    最后一个太真实了,当年不怎么会 git 时就这样
    vision1900
        2
    vision1900  
       46 天前
    The best code is not code at all.

    The best loading is no loading at all.

    The best VCS is?
    lzgshsj
        3
    lzgshsj  
       46 天前
    哈哈,那个全删了然后重新 clone 的人就是当年的我了
    lifanxi
        4
    lifanxi  
       46 天前
    场景还不够丰富,都是偏简单的。如果有复杂的场景,可以参考: http://sethrobertson.github.io/GitFixUm/fixup.html
    ClericPy
        5
    ClericPy  
       46 天前
    几乎全是日常禁止使用的... 够骚, 不愧是站长
    MichealXie
        6
    MichealXie  
       46 天前
    重新克隆的好像可以直接用 git clean -fdx?
    @lzgshsj
    christin
        7
    christin  
       46 天前 via iPhone   ❤️ 1
    LeeReamond
        8
    LeeReamond  
       46 天前
    很多 git 使用上的问题不如说本来就是 git 设计上的缺陷吧,就像 reset hard 名字这么叫,但功能上并不是真正的 reset 。另外虽然命令行很好,但在桌面时代 GUI 支持也不佳,到现在还是那个 win2003 年画风的界面
    msg7086
        9
    msg7086  
       46 天前
    @LeeReamond 简而言之就是 git 的 cli api 设计得谢特一样,一个命令对应一堆功能,仅仅参数变化就会造成不同的行为(比如臭名昭著的 checkout )。不止一个人骂过了,但是 cli api 被依赖太多又不可能推倒重来……
    LeeReamond
        10
    LeeReamond  
       45 天前
    @msg7086 你一总结感觉确实是这样。印象里 git 不是 linus 为了合并代码搞出来的么,印象里这是个代码很优雅的人物,怎么搞出来个这样的设计
    TravisMtg
        11
    TravisMtg  
       45 天前 via iPhone
    这网站还有低情商高情商俩版本😂
    leavic
        12
    leavic  
       45 天前
    cd ..
    sudo rm -r fucking-git-repo-dir
    git clone https://some.github.url/fucking-git-repo-dir.git
    cd fucking-git-repo-dir

    =======================
    这不就是我现在的操作吗。。。。。
    JaguarJack
        13
    JaguarJack  
       45 天前 via iPhone
    @LeeReamond 也许他喜欢,而使用的并不喜欢
    Buges
        14
    Buges  
       45 天前
    @leavic #12 没错,搞坏了还是这样最方便。还有一个对于本地库(如不小心 commit 了 sceret ),最直接的办法是 rm -rf .git && git init && git add . && git commit -m "init" 直接整个重置
    Rekkles
        15
    Rekkles  
       45 天前
    🙄 我一直以为是我太菜了才会出现这些问题
    vivipure
        16
    vivipure  
       45 天前
    git commit --amend 的确好用。我之前都是 git reset --soft ,然后重新提交的
    AloneHero
        17
    AloneHero  
       45 天前 via Android
    就想知道 vscode 怎么用 worktree ,每次不想提交但又需要切换分支的时候巨麻烦
    realpg
        18
    realpg  
       45 天前
    @lzgshsj #3
    现在我精通 git 了,有时候懒也不会用 git 自带的机制操作
    跟 IDE 整合,commit 错了,正常就得敲命令了,我直接改回去再覆盖 commit 就不用命令行了
    fwindcore
        19
    fwindcore  
       45 天前
    还缺少一个提交了一大堆才意识到忘记切换账号,把公司邮箱提交到开源项目里了。

    以前是用 filter-branch ,但是现在似乎推荐使用 filter-repo 了。不过都不太方便,参数太多,还不如写个 shell function 切换。
    MMMMMMMMMMMMMMMM
        20
    MMMMMMMMMMMMMMMM  
       45 天前
    遇事不决加 --force
    Binb
        21
    Binb  
       45 天前
    @ClericPy 为什么禁止,难道开发不是在自己分支上。
    ClericPy
        22
    ClericPy  
       45 天前
    @Binb 早些年 code review 不健全的时候, 那个 amend 还有 cherrypick 老有人乱提, 结果把正在开发的人弄蒙了, 不过现在也无所谓了, 新公司特么的连 git 都不让用, 我已经佛了
    Binb
        23
    Binb  
       45 天前
    @ClericPy 那确实,多人开发分支不能做 ammend 、rebase 等重写 commit id 的操作,真会把人搞懵逼确实难。我都是给自己用,提 mr 前整理自己分支,方便 review ,也方便回退
    Huelse
        24
    Huelse  
       45 天前
    @AloneHero #17 git graph
    ClericPy
        25
    ClericPy  
       45 天前
    @Binb rebase 得做... 不然不好看, 不过只能 rebase 到主上去. 唉一言难尽
    wdssmq
        26
    wdssmq  
       45 天前
    水水的书签收藏
    https://wdssmq.github.io/bookmarks/#/

    想把这个教程加进我的书签收藏夹里,而我的书签是用 git 管理的,然后中间就了出现了因为我自己使用姿势的坑 - -

    累觉不爱。。
    Rache1
        27
    Rache1  
       45 天前   ❤️ 3
    温馨提示,如果你在多人协作的环境里面,在需要使用到强制推送 (--force) 时,你应该优先使用 --force-with-lease 来代替。

    直接使用 --force 时,如果其他协作成员已经推送了新的提交,就会导致这段内容丢失,而使用 --force-with-lease 的时遇到这种情况,就会拒绝你的推送,避免一发自信的 --force 把别人内容搞掉了。
    sickoo
        28
    sickoo  
       45 天前
    删是肯定得删的,只是看早晚
    aaronlam
        29
    aaronlam  
       45 天前
    @Rache1 这个很有用,之前就有自信的同事直接 force 一把梭,然后出事了
    oyp
        30
    oyp  
       45 天前
    我问一下,这个 Git 是工作了才会接触到吗,公司会教吗?为什么学校老师从来不说
    msg7086
        31
    msg7086  
       45 天前 via Android
    @oyp 学校一般不教具体的工具。
    放在国外大学,很多课上要用到语言都不一定教。比如我们有一门课要用 Python ,老师默认你上课前自己学完。

    更何况学校有教学大纲,这东西不能随便变化。软件工具技术都是在飞速发展的,学校跟不上那么快的变化速度。
    msg7086
        32
    msg7086  
       45 天前 via Android
    @oyp (低情商:老师也不懂。)
    msg7086
        33
    msg7086  
       45 天前
    @LeeReamond 只花了几天时间搞出来的设计,你指望设计成啥样……
    所以才有后面无穷无尽的 alias 和各式各样的 GUI 把这些奇奇怪怪的 CLI 整理成结构化的功能。
    Doracis
        34
    Doracis  
       44 天前
    有一个小白问题想问问大家, 就是我想修改已提交的信息, 在使用 git rebase -i HEAD~3 这个指令的时候, 出来的 commit 记录有 19 条, (这里就有点迷糊了) 然后 在修改的记录 前面改成 edit , 回车之后提示我当前的修改点是上一个, 总之就是不能修改 提示我用 git commoit --allow-empty 或者 git reset, 这个情况大家遇到过么
    GeruzoniAnsasu
        35
    GeruzoniAnsasu  
       33 天前   ❤️ 1
    @Doracis rebase 到 3 个 commit 前出来 19 条没遇到过,但猜想是你 rebase 的目标经过了一个 merge commit ,导致历史混乱。应该先把 merge 后的 commit 暂存( cherry-pick 到临时分支或者 stash 起来),reset 掉 merge commit ,然后再重新 merge ,再 pick 回暂存的东西

    提示 allow empty 常见场景是你从 A 分支分岔开发 B 的时候发现有个 A 的 bug 要修,然后你在 B 上提交了一个 a(1),并且把这个 bug 告诉了其他人,它们也在 A 上提交了一个 a(2),当你要 rebaseA 把 B 的历史接到 A 后面时 a(1) 就是个空修改,因此可以直接舍弃掉。还有一种常见是 a(1)和 a(2)发生了冲突,你解决完冲突临时 commit 的修改与 a(2)相同,临时 commit 就变成了空的,也可以跳过
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1148 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 19:33 · PVG 03:33 · LAX 12:33 · JFK 15:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.