请教 git 里怎么删除记录 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
rrubick
V2EX    git

请教 git 里怎么删除记录

  •  
  •   rrubick 40 天前 3916 次点击
    这是一个创建于 40 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请大佬指点:

    分支情况如下图:

    1. 1 创建新的 test 分支
    2. test 分支上分别进行了 2 3 提交
    3. merge test to release 的时候产生了 4提交
    4. 删除了 test 分支

    我现在想回退到 2来删除 3 4记录,是否能做到?如果可以的话,应该在哪个分支执行什么 git 命令。

    第 1 条附言    40 天前

    AI 让我执行了 git reflog expire --expire-unreachable=now --expire=now --all,现在git reflog 被清空了,这个问题算是 “解决了”

    25 条回复    2025-09-02 11:35:01 +08:00
    baiyi
        1
    baiyi  
       40 天前
    git reflog 查看记录

    git reset 重置当前状态
    avenger
        2
    avenger  
       40 天前
    去看 git rebase 的文档
    I2E
        3
    I2E  
       40 天前
    git reset --hard 2 的 commit id
    cc666
        4
    cc666  
       40 天前
    这种问题可以直接问 AI

    AI 大概会问你你到底想干什么
    rrubick
        5
    rrubick  
    OP
       40 天前
    @avenger #2
    git rebase 可以把 release 上从 4 回退到 1 ,但是由于我删除了 test 分支,所以不知道怎么删除 3
    yaocf/td>
        6
    yaocf  
       40 天前
    前提:只有你一个人,或者,你可以说动协作开发的其他成员进行强制拉取。

    首先,请保持工作区干净
    即:
    `git status`提示当前无修改

    步骤一
    向前软重置一步。重复执行,直到退到记录 1
    git reset --soft HEAD^1
    或者是直接一步到位退到记录 1
    git reset --soft ${记录 1 的 commit id}

    步骤二
    提交当前工作区
    git commit ${可以填写记录 2 的提交信息,也可以顺带标注一下回退原因}

    步骤三
    强制 push ,覆盖远端
    git push --force

    步骤四
    如果有协作开发的同学,揖让让他们拉一下新的远端再接着开发。
    yaocf
        7
    yaocf  
       40 天前
    @yaocf 这个前提只针对 test 分支。也就是如果只有你一个人在 test 分支,就无所谓。
    rrubick
        8
    rrubick  
    OP
       40 天前
    @cc666 #4
    问了 claude
    `I have a git branch named `release`.
    I create a new branch `test` from `commit1`, then create `commit2` and `commit3`.
    Then back to `release`, merge `test` to `release` with a new `commit4`.
    Then deleted the `test` branch.

    Now I wanna :
    1. remove the `commit3` and `commit4` records
    2. check out new branch on `commit2` to prepare merge
    3. reset branch `release` to `commit1`
    think harder
    4. show which branch is when running git commands`
    但是它给的答案达不到我想要的效果
    rrubick
        9
    rrubick  
    OP
       40 天前
    @yaocf #7
    这个 test 是我本地分支没有提交过远端,而且我本地也已经删除了这个分支。这是我麻烦的点。
    LGA1150
        10
    LGA1150  
       40 天前   1
    git rebase -i 1 的 commit id
    然后 git 会打开一个编辑器,含有 2 和 3 的 commit
    把 3 所在的行的 pick 改为 drop ,保存退出
    ( rebase 不会保留 merge 记录,所以顺带删除了 4 )
    Ipsum
        11
    Ipsum  
       40 天前 via Android
    先到 4 然后软重置到 2 ,接着 commit 后 force push
    benjen000
        12
    benjen000  
       40 天前 via Android
    rebase 来合并提交然后强推
    hwdq0012
        13
    hwdq0012  
       40 天前
    1 楼正解
    choah
        14
    choah  
       40 天前
    只要 commit id 还在,reset --hard 基本万能的
    wenrouxiaozhu
        15
    wenrouxiaozhu  
       40 天前
    @magic3584 #5 先 reset release 分支,然后从 2 的 commit id 切出来一条新分支...
    剩下的就是看你需求了,在 release 分支执行 merge test / merge test -no-ff
    Rickkkkkkk
        16
    Rickkkkkkk  
       40 天前
    如果是删除,git reset --hard
    jayasme
        17
    jayasme  
       40 天前
    git merge --squash ,会将分支中的所有 commit 组合为一个然后合并
    icanfork
        18
    icanfork  
       40 天前
    -f
    857681664
        19
    857681664  
       40 天前
    @magic3584 本地删除了分支也没事,用 git reflog 能看到过往历史,找到 test 分支的过往 commit hash 后,再用 git reset 之类的修改提交就好了
    SethShi
        20
    SethShi  
       40 天前
    新建分支
    cherry-pick 2
    合并
    realJamespond
        21
    realJamespond  
       40 天前
    reset 1 -> cherry pick 2
    vegetableChick
        22
    vegetableChick  
       40 天前
    cherry-pick
    shily
        23
    shily  
       40 天前
    #8 假设 OP 想移除 3 、4 号提交,并重新建立 release 分支。

    1.1 git tag tag-1 1 号提交的 hash
    1.2 git tag tag-2 2 号提交的 hash
    2. git branch --D release # 强制删除分支
    3. git checkout tag-1 -b release # 使用 1 号提交的 hash 重新拉出 release
    4. git merge tag-2 # merge 2 号提交到 release 分支
    sampeng
        24
    sampeng  
       40 天前   1
    开发群里大喊一声: “所有人别提交代码。我要变身了”。
    然后修复本地的代码树,push 。再大喊一声:"变身完毕,都拉一下吧"
    lonenol
        25
    lonenol  
       39 天前
    从 4 新拉一个分支 A ,A 分支上回退到 2

    release 分支回退到 1 ,git push -f 这样远程和本地都到了 1 ,

    然后把 A 分支 merge 到 release 分支 ,push 到远程

    注意一下这个操作需要让同事把本地分支 reset 到 1 ,然后重新拉下远程分支。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1012 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 18:38 PVG 02:38 LAX 11:38 JFK 14:38
    D have faith in what you're doing.
    ubao 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