首先:是的,我在这里搜索了这个主题,找到了lot of answers。
但是,对于我的特殊用例,它们都不是我需要的。在将此标记为重复之前,请先阅读我的背景信息。
背景故事: 我目前是一名独立的应用程序开发人员和自由职业者。我开发了一个框架,我正在向不同的客户销售。在开发这个框架时,我使用原始源代码并将其提交给我的一个客户Git Repos。我从未想过在那个时间点出售它。它的复杂性和功能都在增长,我现在已经有了它的编译版本。
现在我希望能够删除一些提交,而无需重新设置项目以删除源代码,因为很多人都可以访问它。
我搜索了很长时间,找不到合适的解决方案。
答案 0 :(得分:1)
我有一个可能适合你的理论。
现状:
master: A ---- B ---- C ---- D ---- E ---- F
^
HEAD
假设您要删除提交B
和E
,但请保留C
,D
和F
做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
将temp
与master
合并或重新合并。在rebase和快进合并之后,master
应该如下所示:
master: A ---- C ---- D ---- F
^
HEAD
注意:在第一步中,另一种(更快?)的方法是:git reset <SHA of A>
。然后,您可以使用git stash --patch
进行交互式存储,并有选择地存储更改的块。
答案 1 :(得分:0)
我认为这会起作用
git reset HEAD^
使用HEAD而不使用--hard或--soft标志