Stellen Sie sich also Folgendes vor (und dass wir alle SourceTree verwenden):
- Wir arbeiten alle an der Entstehung / Entwicklung.
- Ich mache eine Woche Urlaub.
- Mein Kollege hat in den letzten Tagen vor Ort gearbeitet, ohne Herkunft / Entwicklung wieder in seiner lokalen Entwicklungsabteilung zusammenzuführen.
- Er versucht einen Push zu machen, bekommt die Anweisung, dass er zuerst verschmelzen muss und macht dann einen Pull.
- Er bekommt einen Konflikt und stoppt das automatische Festschreiben nach dem Zusammenführen.
- Unter der Annahme, dass Git wie SVN ist, verwirft mein Kollege die "neuen" Dateien in seiner Arbeitskopie und schreibt dann die Zusammenführung fest.
- Zu dieser Überarbeitung kommt noch eine Woche Entwicklungsarbeit.
- Ich komme aus den Ferien zurück und stelle fest, dass einige Tage meiner Arbeit fehlen.
Wir sind alle sehr neu in Git (dies ist unser erstes Projekt, das es verwendet), aber was ich getan habe, um es zu beheben, war:
- Benennen Sie "develop" in "develop_old" um.
- Füge develop_old zu einem neuen Zweig "develop_new" zusammen.
- Setzen Sie den Zweig "develop_new" auf den letzten Commit vor der fehlerhaften Zusammenführung zurück.
- Cherry wählt jedes Commit seitdem einzeln aus und löst Konflikte von Hand.
- Drücken Sie "Develop_old" und "Develop_New" bis zum Ursprung.
Jetzt ist develop_new, so hoffe ich, eine "gute" Kopie aller unserer Änderungen, die in den folgenden Wochen erneut durchgeführt wurden. Ich gehe auch davon aus, dass "Reverse Commit" bei einer Zusammenführung seltsame Dinge bewirken wird, zumal die Arbeit der nächsten Wochen darauf basiert - und da diese Zusammenführung eine Menge Dinge enthält, die wir wollen, zusammen mit Dingen, die wir nicht tun. ' t.
Ich hoffe, dass dies nie wieder vorkommt, aber wenn es doch wieder vorkommt, würde ich gerne eine einfachere / bessere Möglichkeit zur Fehlerbehebung finden. Gibt es eine bessere Möglichkeit, eine "schlechte" Zusammenführung rückgängig zu machen, wenn im Repo aufgrund dieser Zusammenführung viel Arbeit geleistet wurde?
git log
mit entsprechenden Anmerkungen zu den Ereignissen bei den verschiedenen Commits veröffentlichen? (Ich würde redigieren / kommentierengit log --graph --pretty=oneline --abbrev-commit
und von dort aus gehen)Antworten:
Wenn ich richtig verstanden habe, ist dies Ihre Situation:
Nach einigem gemeinsamen Werdegang (o) haben Sie sich verpflichtet und Ihre Arbeit vorangetrieben (y). Ihr Mitarbeiter (c) hat an seinem lokalen Repository gearbeitet und eine fehlerhafte Zusammenführung durchgeführt (M). Danach könnte es einige zusätzliche Commits (a) über M geben.
Jetzt sieht Ihr Diagramm genau so aus wie vor der schlechten Zusammenführung:
Führe einen guten Merge durch (G):
Ergebend:
Jetzt verpflanzen Sie die zusätzlichen Commits:
Dies ergibt das Endergebnis:
Beachten Sie, dass dies zu mehr Zusammenführungskonflikten führen kann. Außerdem haben Sie gerade die Historie geändert, dh alle Ihre Mitarbeiter sollten auf die neue Historie klonen / zurücksetzen / zurücksetzen.
PS: natürlich solltest du
G
,M
undX
in deinen befehlen durch die entsprechende commit id ersetzen .quelle
Es ist gut, dass Sie darüber nachdenken, wie Sie das Repository reparieren können. Wenn Ihr Kollege jedoch nur neue Dateien gelöscht und nicht viele Aktualisierungen überschrieben hat, ist es viel einfacher, die gelöschten Dateien einfach wiederherzustellen.
Ich würde wahrscheinlich anfangen, indem ich versuche, die ursprünglichen Commits, in denen Sie den Code hinzugefügt haben, der jetzt verschwunden ist, (auf den aktuellen Kopf) auszuwählen. Wenn dies aus irgendeinem Grund nicht funktioniert, checken Sie einfach die alte Revision mit den von Ihnen hinzugefügten Dateien aus und fügen Sie sie in einem neuen Commit erneut hinzu.
Was Sie beschreiben, ist eine Teilmenge eines bekannten Git-Anti-Patterns, an dessen Namen ich mich für mein ganzes Leben nicht erinnern kann. Das Wesentliche ist jedoch, dass Sie während eines Git-Merges "manuelle" Bearbeitungen vornehmen (dh Bearbeitungen vornehmen) Das Lösen von Zusammenführungskonflikten ist keine Selbstverständlichkeit, führt jedoch zu Änderungen, die nichts damit zu tun haben. Dies wird als äußerst schlechte Vorgehensweise angesehen, da sie im Wesentlichen durch die Zusammenführung selbst maskiert werden und in Codeüberprüfungen oder Debugging-Sitzungen leicht übersehen werden.
Erklären Sie Ihrem Kollegen also auf jeden Fall, dass dies ein epischer Fehlschlag war, aber erwägen Sie, auf ein Pflaster zu klopfen, bevor Sie sich auf eine größere Operation vorbereiten.
quelle