2015-06-13 8 views
7

Kürzlich bei der Arbeit verloren wir etwas Code in einem Projekt unter Versionskontrolle mit Git (und einem privaten Github-Repository).Wie kann ein Revert-Commit auch ein Merge-Commit sein?

benutzen ich git bisect die Schuldigen zu finden begehen, und ich habe wirklich überrascht zu entdecken, es war wie ein revert suchen begehen, sondern hatte auch zwei Eltern wie merge verpflichtet:

commit b5f97311eea2905baf8a96fddec22321d952f05c 
Merge: 8cc7371 131d463 
Author: Bob <[email protected]> 
Date: Fri May 22 19:42:25 2015 +0200 

    Revert "ISB-CPW-3627 - Mise en place du calage des filtres DS1/DS2/DS3/DS4" 

    This reverts commit 8cc7371e7133b68db95ac8e9aeb730d7889a1166. 

Dieses Problem wird durch die Schaffung gelöst wurde ein neuer Zweig von einem Vorfahren-Commit und das Anwenden einiger Patches auf diesen neuen Zweig.

Also brauche ich keine Hilfe, um das zu beheben, ich möchte nur verstehen, wie ein Zurücksetzen Commit auch ein Merge Commit sein könnte, was passiert ist, und wie dieses seltsame Verhalten zu reproduzieren.

Ich habe versucht, es so zu reproduzieren:

  • erstellen Sie eine neue Filiale am 8cc7371
  • git zurückkehren 8cc7371

Es schafft eine revert begehen mit nur einem Elternteil (8cc7371) als erwartet.

Der Täter-Commit-Autor verwendet Atlassian SourceTree anstelle der nativen Befehlszeilenschnittstelle, also habe ich auch versucht, das Revert-Feature in SourceTree zu verwenden und das gleiche Ergebnis wie oben (ein Elternteil) zu erhalten.

Nach einigen git Befehle auf b5f9731 läuft, bemerkte ich, dass git diff und git show nicht die gleiche Datei Set berichten:

$ git diff b5f9731..8cc7371 --name-only 
=> 2 files : 
    application/sites/frontend/views/scripts/Layout/Foobar/PointsDeVente/index.tpl 
    public/media/design/frontend/css/main-dev.css 
$ git show --oneline --name-only b5f9731 
=> 1 file : 
    public/media/design/frontend/css/main-dev.css 

SourceTree und Github zeigen zwei Dateien.

Hier finden Sie, wie das Diagramm aussieht: graph.html, und einige Git Befehle gibt es dort: misc.html.

Kann jemand erklären, was mit b5f9731 passiert ist?

+1

Ich werde diesen Beitrag zu Favoriten hinzufügen und es als benutzerdefinierte How-To-Ask Referenz für Git-Fragen verwenden. –

+0

Wie läuft die Untersuchung? –

+0

Heute habe ich mit der interaktiven Wiederbenutzungsfunktion von SourceTree gespielt und konnte das Problem nicht reproduzieren. Ich nehme an, dieses Problem hat etwas mit "git rebase" oder "git pull --rebase" zu tun, aber ich gebe auf. Ich habe nicht genug Informationen, vor 3 Wochen, als es passierte, bat ich den Commit-Autor, mir seinen Reflog für weitere Untersuchungen zu schicken, und er war dazu nicht in der Lage. Er arbeitet an einem anderen Unternehmen (sie arbeiten am Frontend, während meine Firma serverseitig arbeitet), die Kommunikation ist schwierig. Das Geheimnis bleibt: s – Vince

Antwort

1

Was kommt mir in den Sinn:

git revert ... 
# new commit abcdef 
git merge ... 
# new commit fedcba 
git rebase -i HEAD~2 

pick abcdef - the original revert commit 
squash fedcba - the merge commit 

Nachricht von abcdef genommen wird.

Dies alles ergibt das neue b5f9731. Es hat zwei Elternteile von einem Merge-Commit und die Nachricht von dem Zurückkehr-Commit.

+0

Vielen Dank, das ist eine gute Idee. Ich erwartete etwas einfacher als interaktive Rebase (weil der Commit-Autor ein Anfänger ist), aber in der Tat, SourceTree behandelt diese Funktion. – Vince

+0

@Die Vorteile von GUIs sind, dass sie die Massenzerstörung durch einen Klick ermöglichen (in der Regel nicht beabsichtigt). –

-1

Schritte, das von der lokalen Niederlassung verpflichten zu zurückkehren sind wie folgt: -

1) Führen Sie die "git log -1" Befehl git bash 2) Holen Sie sich das "committed GUID" von oben Befehl 3) Führen Sie den Befehl "Git reset --hard committed GUID" auf git bash