Git保留最新提交,但删除之前的提交

Git保留最新提交,但删除之前的提交,git,gerrit,git-commit,Git,Gerrit,Git Commit,我想把最新的Git提交给gerrit。 但不知何故,我收到一条错误消息,说我无法推送,因为两个提交具有相同的Change-ID 在下图中,您可以看到当前的情况 第三次提交(从顶部)已推送到gerrit 第三次提交和第二次提交以某种方式具有相同的Change-ID 我想把第一个承诺推给gerrit 所以我解决这个问题的想法是删除第二次提交。 这可能吗?假设从上到下的三次提交的提交哈希是A、B和C 确保git状态显示它是干净的。如果没有,请先运行git stash 如果你真的不想要B了 git

我想把最新的Git提交给gerrit。 但不知何故,我收到一条错误消息,说我无法推送,因为两个提交具有相同的Change-ID

在下图中,您可以看到当前的情况

  • 第三次提交(从顶部)已推送到gerrit
  • 第三次提交和第二次提交以某种方式具有相同的Change-ID
  • 我想把第一个承诺推给gerrit
  • 所以我解决这个问题的想法是删除第二次提交。
    这可能吗?

    假设从上到下的三次提交的提交哈希是A、B和C

    确保
    git状态
    显示它是干净的。如果没有,请先运行
    git stash

    如果你真的不想要B了

    git reset C --hard
    git cherry-pick A
    
    如果你还想要B

    git reset B --hard
    git commit --amend
    # Edit the commit message and delete the change-id line, save and exit.
    # The commit-msg hook will generate a new changeid.
    git cherry-pick A
    

    然后再按一下。

    你说的“相同的更改id”是什么意思?你是说提交的散列吗?40个字符的十六进制字符串,或者其他什么?每个git提交都有一个提交id(40个字符的十六进制字符串)。我说的是变更id(也是一个40个字符的十六进制字符串)。更改id添加在提交消息的末尾,gerrit使用它来组织不同的提交。@LasseVågsætherKarlsen:“更改id”是gerrit ism。我自己没有使用Gerrit,我不能告诉你是什么产生了它,但它在Git之外。太好了,这就是我一直在寻找的。还有一个问题:假设我做了第一个程序,B就不在了,对吗?B的变化会发生什么?它们是否也将被删除,或将被附加到A或C?@npkllr B,其更改不再在当前分支中,尽管它们仍在本地存储库中。如果任何引用都无法访问B,则在git的GC清除之前,它们都可以访问。在此之前,您可以像使用任何其他哈希一样使用B哈希,因此
    git show B
    git checkout B
    等都可以使用。当B被删除时,您将看到
    fatal:bad object B
    错误消息。
    reset
    然后是
    cherry pick
    工作,但它可能更容易使用
    rebase-i
    @williampersell同意。但是我总是发现解释如何使用
    git-rebase-I
    更加困难。