如何从git历史记录中删除提交,就好像它根本没有?

时间:2015-05-10 01:23:19

标签: git github

我的情况是这样的:

A-> B-> C-> d

A是我收到的代码的原始版本(它已经提交过,但在此处未提及)。

在B中,我应用了代码格式,引入了数百个空白更改。因此,审查代码的人发现了数千个由此引起的变更。虽然我知道在github上的提交url中添加?w = 1参数允许没有空格的代码差异,但是审阅者不接受这个并且告诉我简单地恢复到以前的格式。我认为处理这种情况的唯一方法是简单地从历史记录中删除C和D(本地和远程),然后再次进行更改。

我尝试了git revert,但这似乎暂时删除了远程更改。在下一次git推送之后,它会再次提交提交。

请建议正确的步骤,以便C,D在本地和远程完全从历史记录中删除,就像它们从未在那里一样(从而重写历史记录)。

注意:

我在MASTER分支上,我的本地仓库与遥控器完全同步。

修改

我已经接受了link接受的回答。这是我做的:

git reset --hard HEAD~2

然后我做了git push origin HEAD --force

但是我得到了这个命令:

error: unable to push to unqualified destination: HEAD

如果我把master代替HEAD,我会得到“一切都是最新的”。

我正在努力掌握,此时我只有一个工作分支。

3 个答案:

答案 0 :(得分:3)

如果你已经把C和D推到了遥控器而其他人已经把它们捡起来了,那么如果没有机会造成大麻烦,你就无法做到。最好的办法是从git revert D开始。这将创建一个新版本D',它看起来与C所处的状态相同。但D和D'仍将在git历史中。

如果这是你的愿望,你可以git revert C,最后git revert B。然后你的历史将看起来像A-B-C-D-D'-C'-B',并且检查B'将给你代码与检查A相同。

或者你可以告诉评论者把它搞砸并处理,因为所有这些都是***的主要痛苦。

答案 1 :(得分:1)

  

SELECT a.route FROM routes a LEFT JOIN arrivaltimes b ON a.stop_id = b.stop_id LEFT JOIN stops c ON a.stop_id = c.stop_id WHERE b.arrivaltime = ?

     

在B中,我应用了引入数百个空白变化的代码格式

     

审稿人不接受并告诉我恢复以前的格式

  

我认为处理这种情况的唯一方法是简单地从历史中删除C和D

如果我正确阅读此内容并且此处顶部的引号是有效负载,那么您想要的就是您从未完成open System.Windows.Forms let form = new Form(Text="Test", TopMost=true) let buttonNum0 = new Button(Text="1"); let buttonNum1 = new Button(Text="2", Top=20); let buttonNum2 = new Button(Text="3", Top=40); let buttonNum3 = new Button(Text="4", Top=60); form.Controls.AddRange [| buttonNum0 ; buttonNum1; buttonNum2; buttonNum3 ; |] let rec loop observable list = async{ printList list (Async.Await) let! somethingObservable = Async.AwaitObservable(observable) match somethingObservable with | 0 -> return! loop observable ("0"::list) | 1 -> return! loop observable ("1"::list) | 2 -> return! loop observable ("2"::list) | 3 -> return! loop observable ("3"::list) | _ -> return! loop observable ("?"::list) } module GUIInterface = //Here we define what we will be observing (clicks) let observables = Observable.merge <| Observable.map (fun _-> 0) GUI.buttonNum0.Click <| Observable.map (fun _-> 1) GUI.buttonNum1.Click <| Observable.map (fun _-> 2) GUI.buttonNum2.Click <| Observable.map (fun _-> 3) GUI.buttonNum3.Click Async.StartImmediate(loop GUIInterface.observables []) ; System.Windows.Forms.Application.Run(GUI.form) 时的历史记录。这就是A---B---C---D master的用途。

B

是完整的拼写。它表示“从git rebase开始提交主分支并将其中的所有更改应用到git rebase --onto $A $B master ,然后将$B标签移动到新系列。这将产生

$A

如果沟通不是问题,这是处理单据的最佳方式。做坏事,强行推动新的历史,并让每个人都重新获得。如果他们的工作基于废弃的历史,他们也必须改变,但是:

如果没有人根据废弃的历史做任何工作,你就完成了。

答案 2 :(得分:1)

如果它看起来像&gt; b&gt; c&gt; d并且您想要摆脱最后2次提交, 只需使用:

git reset --hard HEAD~2

然后

git push --force

另一种选择是使用:

git reflog

将显示对存储库所做的更改列表。

接着是

git reset --hard HEAD@{n}
git push --force

其中n是分支中需要的最后一次提交。 另一种选择是使用

git revert c d
git push --force