代码之家  ›  专栏  ›  技术社区  ›  Hao Wu

如何将两个历史提交合并为一个并强制推送?

git
  •  0
  • Hao Wu  · 技术社区  · 2 年前

    想象一下,我有一个像这样的git分支,无论是在本地还是远程,HEAD都是干净的。

    develop  A - B - C - D - E
    

    承诺 B 有一些我在提交时删除的敏感信息 C 。现在我意识到人们仍然可以看到信息,尽管提交了历史。有没有合并提交的方法 B C 变成一个,这样人们就看不到承诺发生了什么 B ?允许强制推动。

    期望结果:

    develop  A - F - D - E
    

    我在想用

    git reset --soft (hash of B)
    git commit -m "message"
    git push -f # haven't done this
    

    但它将摆脱所有的历史 B 这是我不想要的。

    2 回复  |  直到 2 年前
        1
  •  2
  •   eftshift0    2 年前

    最简单的方法是使用rebase交互式。

    类似于 develop 已签出):

    git rebase -i A
    

    它将列出以开头的所有提交 B 保持 B pick 然后 C 将其设置为 squash .保存并退出。。。。它应该是固定的。历史应该是这样的:

    A <- BC <- D <- E <- (develop)
    

    BC 是南瓜 B C

    如果你想这么做 手工 ,则:

    git checkout B
    git restore --source C --worktree --staged -- . # get the contents just like it is in C
    git commit --amend --no-edit # or edit if you think the message should be different now
    git cherry-pick C..E
    # if you like the result....
    git checkout -B develop # set the branch over here, we know it exists already, we don't care
    

    然后用力推。

        2
  •  0
  •   Shubham Kumar    2 年前

    用于重新基准交互

    git rebase -i A
    

    用于强制更改远程存储库

    git push origin +develop
    

    “+”是力推的简写