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

请教 git 里怎么删除记录

  •  
  •   magic3584 · 1 天前 · 3061 次点击

    请大佬指点:

    分支情况如下图:

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

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

    第 1 条附言  ·  23 小时 39 分钟前

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

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

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

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

    首先,请保持工作区干净
    即:
    `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  
       1 天前
    @yaocf 这个前提只针对 test 分支。也就是如果只有你一个人在 test 分支,就无所谓。
    magic3584
        8
    magic3584  
    OP
       1 天前
    @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`
    但是它给的答案达不到我想要的效果
    magic3584
        9
    magic3584  
    OP
       1 天前
    @yaocf #7
    这个 test 是我本地分支没有提交过远端,而且我本地也已经删除了这个分支。这是我麻烦的点。
    LGA1150
        10
    LGA1150  
       1 天前   ❤️ 1
    git rebase -i 1 的 commit id
    然后 git 会打开一个编辑器,含有 2 和 3 的 commit
    把 3 所在的行的 pick 改为 drop ,保存退出
    ( rebase 不会保留 merge 记录,所以顺带删除了 4 )
    Ipsum
        11
    Ipsum  
       1 天前 via Android
    先到 4 然后软重置到 2 ,接着 commit 后 force push
    benjen000
        12
    benjen000  
       1 天前 via Android
    rebase 来合并提交然后强推
    hwdq0012
        13
    hwdq0012  
       1 天前
    1 楼正解
    choah
        14
    choah  
       1 天前
    只要 commit id 还在,reset --hard 基本万能的
    wenrouxiaozhu
        15
    wenrouxiaozhu  
       1 天前
    @magic3584 #5 先 reset release 分支,然后从 2 的 commit id 切出来一条新分支...
    剩下的就是看你需求了,在 release 分支执行 merge test / merge test -no-ff
    Rickkkkkkk
        16
    Rickkkkkkk  
       1 天前
    如果是删除,git reset --hard
    jayasme
        17
    jayasme  
       1 天前
    git merge --squash ,会将分支中的所有 commit 组合为一个然后合并
    belin520
        18
    belin520  
       1 天前
    -f
    857681664
        19
    857681664  
       1 天前
    @magic3584 本地删除了分支也没事,用 git reflog 能看到过往历史,找到 test 分支的过往 commit hash 后,再用 git reset 之类的修改提交就好了
    seth19960929
        20
    seth19960929  
       1 天前
    新建分支
    cherry-pick 2
    合并
    realJamespond
        21
    realJamespond  
       22 小时 3 分钟前
    reset 1 -> cherry pick 2
    vegetableChick
        22
    vegetableChick  
       21 小时 48 分钟前
    cherry-pick
    shily
        23
    shily  
       21 小时 1 分钟前
    #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  
       20 小时 59 分钟前   ❤️ 1
    开发群里大喊一声: “所有人别提交代码。我要变身了”。
    然后修复本地的代码树,push 。再大喊一声:"变身完毕,都拉一下吧"
    lonenol
        25
    lonenol  
       1 小时 8 分钟前
    从 4 新拉一个分支 A ,A 分支上回退到 2

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

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

    注意一下这个操作需要让同事把本地分支 reset 到 1 ,然后重新拉下远程分支。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3468 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 04:43 · PVG 12:43 · LAX 21:43 · JFK 00:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.