如何删除历史记录git commit

时间:2018-07-18 07:32:36

标签: git

说我执行过两次git add --all && git commit。因此,现在我的本地git存储库包含两个新提交:A和B。

如果我执行git push,则将两者都推入。

如何仅推送较新的提交,即B?换句话说,是否可以在不触摸提交B的情况下删除提交A?

3 个答案:

答案 0 :(得分:1)

说您想掌握。我会选择要交付的提交:

git fetch
git checkout -b delivery_branch origin/master
git cherry-pick B
git push origin master

答案 1 :(得分:1)

简短而又不令人满意的答案是“你不能”。提交B本质上依赖于提交A,因为A是B的父提交。

可以要做的就是完全停止使用提交B。构造第三个提交(称为C),其父母是A的父母,并且其内容是您想要的任何内容。 (例如,这可能匹配B的内容。)然后移动分支的 name ,以便不要指向提交B(指向A) ,它指向较早的提交),名称指向新的提交C:

       B--A   [no longer on your branch - abandoned in favor of C]
      /
...--o--C   <-- branch

您现在可以git push origin branch推送提交C,而完全不使用提交A和B。

(请注意,制作 提交C的确切机制取决于要附加到C的快照。)

答案 2 :(得分:0)

假设您的日志是这样的:

Z--A--B

其中A是要删除的提交,而B是要保留的提交。还假定“ dev”是该分支的名称。

然后,(其中A,B和Z代表各自的提交ID)

  1. 从提交Z创建一个临时分支,称为“ temp”。

    git checkout -b temp
    git reset --hard Z
    
  2. 以樱桃方式将提交B临时选中。 (解决冲突)

    git cherry-pick B
    
  3. 返回您的分支(在本例中为dev),然后删除A和B

    git checkout dev
    git reset --hard Z
    
  4. 将临时分支合并到您的分支(dev)

    git merge temp
    
  5. 删除临时分支

    git branch -d temp
    

注意:

  1. 随着我们的挑选,B的提交ID将发生变化。

  2. 如果远程分支中有A和B,则必须使用force选项进行推送。

    git push -f