2016-06-07 8 views
0

Ich habe diese Situation:Wie entfernen Commits wie diese

    B  C  D 
       /-----*-----*-----* 
-*---*---*---*---*---* branch A 
A1 A2 A3 A4 A5 A6 

Commits B, C, D nicht an einem Zweig gehören. Wenn ich meine Phantasie git lg habe, zeigt es keine Zweigbeschriftungen in der Nähe von ihnen (es tut für Master, Herkunft/Master, HEAD, Zweig Zweige usw.). Wenn ich sie auschecke, bewege ich mich in den Status "losgelöster Kopf" (das ist zu erwarten, weil ich sie nur mit sha1 auschecken kann). Wie entferne ich sie?

Dinge, die ich bisher versucht:

  1. Kasse D begehen und git reset HEAD~3 --hard, HEAD Zeiger bewegt sich auf A4 laufen, aber Commits sind immer noch hier.
  2. Manuell ausgeführt git reflog expire --expire=now --all, gefolgt von git gc --prune=now, commits sind immer noch hier.

Was passiert und wie entferne ich diese Commits?

Edit: 39d9480 ist einer der problematischen Commits. Versuchte Experimentieren mit merge-base, habe diese Ausgabe:

git merge-base --is-ancestor 39d9480 master; echo $? 
0 
git merge-base --is-ancestor master 39d9480; echo $? 
1 

Ich sehe nicht, dass diese Verpflichtung beim Versuch, Rebase.

+0

Wenn Sie den reflog Ablauf und gc getan haben, würden sie normalerweise an dieser Stelle weg, was andeutet, dass * etwas * sich immer noch auf sie bezieht (wie der 'Refs/Originals /' Namespace, den 'git filter-branch' hinterlässt). Womit erweitert sich dein 'git lg'-Alias? – torek

+0

'git log --graph --oneline --decorate' – 0xCAFEBABE

+0

Going zu überprüfen, Refs/Originale. – 0xCAFEBABE

Antwort

-1

Soweit ich weiß, können Sie die Commits nicht selbst entfernen. Sie werden nach einiger Zeit verschwinden, dank Git. Aber sie werden nicht mit Ihrer Arbeit interferieren :)

+0

Ja, sie werden nicht stören, aber ich würde gerne verstehen, was passiert ist. – 0xCAFEBABE

+0

Ich denke Git ermöglicht es Ihnen, Ihre Arbeit wiederherzustellen, wenn Sie etwas Mist haben ... aber es ist nur eine Theorie. Ich kann dir nicht helfen, ich habe die Antwort noch nicht gefunden – FrenchieTucker

+0

Ja, es hat mächtige Werkzeuge, um Arbeit wie 'git reflog' wieder herzustellen, aber diese Situation ist Gegenteil. Ich möchte diese Commits aus der Geschichte VERLIEREN, aber ich finde keine Möglichkeit, sie zu entfernen. – 0xCAFEBABE

-1

Sie könnten versuchen, diese eine Filiale zu schaffen, Rebasing es zu nichts, und löschen es:

git checkout D_HASH 
git checkout -b disposable 
git rebase -i HEAD~4 
[ interactively delete commits from branch only -- do NOT delete A4 ] 
git branch -D disposable 
+0

Ich habe das versucht, Zweig wird gelöscht, aber commits sind da. Wie oben angedeutet, sieht es etwas anderes aus, das sich auf diese Commits bezieht. – 0xCAFEBABE

0

Der git branch Befehl Scans nur lokale und Remote-Niederlassungen. Dieses Skript wird jede Art von Referenz zeigen, welche die mit bestimmten Hash-Commit-:

git for-each-ref -s --format 'if git merge-base --is-ancestorHash%(refname); then printf "%s\n" %(refname); else :; fi;'|/bin/sh -

+0

Versucht, es zu verwenden, keine Ausgabe. – 0xCAFEBABE

Verwandte Themen