如何在不重置目录的情况下删除git提交?

时间:2014-03-14 11:19:57

标签: git commit

首先:是的,我在这里搜索了这个主题,找到了lot of answers

但是,对于我的特殊用例,它们都不是我需要的。在将此标记为重复之前,请先阅读我的背景信息。


背景故事: 我目前是一名独立的应用程序开发人员和自由职业者。我开发了一个框架,我正在向不同的客户销售。在开发这个框架时,我使用原始源代码并将其提交给我的一个客户Git Repos。我从未想过在那个时间点出售它。它的复杂性和功能都在增长,我现在已经有了它的编译版本。

现在我希望能够删除一些提交,而无需重新设置项目以删除源代码,因为很多人都可以访问它。

我搜索了很长时间,找不到合适的解决方案。

2 个答案:

答案 0 :(得分:1)

我有一个可能适合你的理论。

现状:

master: A ---- B ---- C ---- D ---- E ---- F 
                                           ^
                                           HEAD

假设您要删除提交BE,但请保留CDF

git reset HEAD~1
git stash
重复上述步骤,直到HEAD到达A

现在master看起来像这样:

master: A                    Stash stack looks like:  
        ^                      B
        HEAD                   C
                               D
                               E
                               F

结帐新分行temp

master: A                   Stash stack looks like
        |                      B
        |                      C
  temp: A                      D
        ^                      E
        HEAD                   F

现在,您可以有选择地pop隐藏temp(必要时解决冲突)。请注意,发生冲突时,不会从列表中删除存储。您必须明确调用git stash drop

git stash pop stash{revision number}
git stash drop stash{revision number}如果发生冲突 git stash drop stash {unwanted revision}

temp应如下所示:

master: A 
         \
temp:     ---- C ---- D ---- F 
                             ^
                             HEAD 

tempmaster合并或重新合并。在rebase和快进合并之后,master应该如下所示:

master: A ---- C ---- D ---- F
                             ^
                             HEAD

注意:在第一步中,另一种(更快?)的方法是:git reset <SHA of A>。然后,您可以使用git stash --patch进行交互式存储,并有选择地存储更改的块。

答案 1 :(得分:0)

我认为这会起作用

git reset HEAD^

使用HEAD而不使用--hard或--soft标志