Ich arbeite mit einem anderen Entwickler an einem Projekt und wir verwenden Github als Remote-Repo. Ich bin auf einem Mac mit Git 1.7.7.3, er ist auf Windows mit Git 1.7.6.
Das ist was passiert
- Einer von uns (nennen wir ihn Entwickler A, aber es spielt keine Rolle, welcher) sendet eine Reihe von Commits an GitHub.
- Der andere (Entwickler B) macht einige lokale Commits.
- B macht a
git pull
. - B macht a
git push
. - Wenn ich mir das Commit-Verlaufsprotokoll ansehe, sehe ich den Merge-Zweig 'master' von github.com:foo/bar
Das Festschreibungsprotokoll wird im Laufe der Zeit mit "Zweig zusammenführen" -Nachrichten übersät und zeigt Entwickler B als Festschreibungsänderungen an, die Entwickler A vorgenommen hat. Die einzige Möglichkeit, dieses Problem zu verhindern, bestand darin, eine git pull --rebase
in Schritt 3 durchzuführen, aber ich weiß nicht, welche Nebenwirkungen eine Neufasierung mit sich bringen wird. Ich arbeite zum ersten Mal an einem Git-Repo für mehrere Entwickler. Ist das also nur normal? Irgendwelche Gedanken zur Lösung dieses Problems?
git log --no-merges
Antworten:
Das Commit, das Sie sehen, ist vollkommen in Ordnung. A wird
pull
effektiv ausgeführt,git fetch
und danngit merge
findet normalerweise eine Zusammenführung statt, wenn Sie ausgeführt werdengit pull
.Die Alternative, Rebasing anstelle von Zusammenführen zu verwenden, ist möglich, aber normalerweise sollten Sie dies vermeiden. Durch das erneute Basieren können Sie einen linearen Verlauf beibehalten, aber auch alle Informationen über die ursprünglich erfolgte Verzweigung entfernen. Dadurch wird auch der Verlauf des aktuellen Zweigs neu geschrieben, wodurch alle Commits neu erstellt werden, die nicht im Zielzweig enthalten sind (in Ihrem Fall die Fernbedienung). Da es sich bei den neu erstellten Commits um unterschiedliche Commits handelt, kann dies bei der Entwicklung zusammen mit anderen zu großer Verwirrung führen, insbesondere wenn Personen Teile dieser Commits bereits ausgecheckt haben, bevor sie neu geschrieben werden (z. B. mit Feature-Zweigen). Als Faustregel gilt, dass Sie niemals ein Commit umschreiben sollten , das bereits gepusht wurde.
Die angezeigten Commits dienen dazu, zwei (oder mehr) Zweige zu kombinieren. Es ist vollkommen in Ordnung, ein Commit zu haben, das nichts anderes tut, als mehrere Zweige zusammenzuführen. Tatsächlich wird sehr deutlich, wann Sie ein Zusammenführungs-Commit haben, das Zweige kombiniert, wenn Sie den Verlauf betrachten. Im Vergleich zur Neugründung können Sie durch das Zusammenführen auch den ursprünglichen Verlauf, wie er entwickelt wurde, einschließlich der tatsächlich existierenden Zweige effektiv anzeigen .
Also, lange Rede, kurzer Sinn: Ja, Merge-Commits sind vollkommen in Ordnung, und Sie sollten sich darüber keine Sorgen machen.
quelle
Diese Antwort wurde überarbeitet, da mein Verständnis, meine Diagramme und Schlussfolgerungen falsch waren.
git pull
Verursacht Zusammenführungs-Commits, da Git zusammengeführt wird. Dies kann geändert werden, indem Sie Ihre Zweige so einstellen, dass Rebase anstelle von Merge verwendet wird. Die Verwendung von Rebase anstelle von Merge bei einem Pull bietet einen lineareren Verlauf für das gemeinsam genutzte Repository. Auf der anderen Seite zeigen Merge Commits die parallelen Entwicklungsbemühungen in der Branche.Beispielsweise arbeiten zwei Personen in derselben Branche. Der Zweig beginnt als:
Die erste Person beendet ihre Arbeit und drängt in die Filiale:
Die zweite Person beendet ihre Arbeit und möchte pushen, kann dies aber nicht, da sie aktualisiert werden muss. Das lokale Repository für die zweite Person sieht folgendermaßen aus:
Wenn der Pull auf Zusammenführen eingestellt ist, sieht das Repository für zweite Personen so aus.
Wobei M1 ein Merge-Commit ist. Diese neue Filialhistorie wird in das Repo verschoben. Wenn stattdessen der Pull so eingestellt ist, dass das lokale Repo neu gestartet wird, sieht dies folgendermaßen aus:
Es gibt kein Zusammenführungs-Commit. Die Geschichte wurde linearer gestaltet.
Beide Auswahlmöglichkeiten spiegeln die Geschichte der Branche wider. Mit git können Sie auswählen, welchen Verlauf Sie bevorzugen.
Es gibt in der Tat Orte, an denen eine erneute Basis ein Problem mit Remote-Zweigen verursachen kann. Dies ist nicht einer dieser Fälle. Wir bevorzugen die Verwendung von rebase, da dies einen bereits komplizierten Zweigverlauf vereinfacht und eine Version des Verlaufs relativ zum gemeinsam genutzten Repository anzeigt.
Sie können branch.autosetuprebase = festlegen, damit git Ihre Remote-Zweige immer automatisch als Rebase anstelle von Master einrichtet.
Diese Einstellung bewirkt, dass git automatisch eine Konfigurationseinstellung für jeden Remote-Zweig erstellt:
Sie können dies selbst für Ihre Remote-Zweige festlegen, die bereits eingerichtet sind.
Ich möchte @LaurensHolst dafür danken, dass er meine vorherigen Aussagen hinterfragt und weiterverfolgt hat. Ich habe sicherlich mehr darüber gelernt, wie Git mit Pull- und Merge-Commits funktioniert.
Weitere Informationen zu Zusammenführungs-Commits finden Sie unter Beitrag zu einem Projekt in ProGit-Book . Im Abschnitt " Privates kleines Team " werden Zusammenführungs-Commits angezeigt.
quelle
Du kannst tun:
Dadurch werden Ihre Änderungen jedoch immer über die Ihrer Mitarbeiter gestellt. Sie erhalten jedoch keine verschmutzende Zusammenführungsnachricht.
quelle
Darauf gibt es tatsächlich eine viel einfachere Antwort. Lassen Sie Entwickler B einfach ziehen, bevor Sie sich verpflichten. Dadurch werden diese Zusammenführungs-Commits verhindert, da sie durch den Verlauf verursacht werden, den Sie in Ihrem lokalen Repo aus Ihrem lokalen Commit erstellt haben und der versucht, mit dem Verlauf der Commits auf dem Remote-Repo zusammenzuführen. Wenn Sie beim Ziehen eine Meldung erhalten, die besagt, dass Änderungen überschrieben werden, bedeutet dies nur, dass Sie beide dieselbe Datei berührt haben. Gehen Sie also wie folgt vor:
Anschließend können Sie etwaige Zusammenführungskonflikte lösen.
quelle
stash
vor dir vergisstpull
. Ugh git erfordert, dass ich die ganze Zeit an der Spitze meines Spiels bin.git pull --rebase
remote Änderungen vor den auf lokaler Ebene zu integrieren, und zwar unabhängig.Wenn Sie einen Git-Pull ausführen, werden die Nachrichten "Zweig zusammenführen" eingefügt. Genau das ist der Fall. Durch Ausführen eines Git-Pulls haben Sie den Remote-Zweig mit Ihrem lokalen Zweig zusammengeführt.
Wenn Sie einen Git-Pull ausführen und Konflikte auftreten, werden im Git-Protokoll die Aktualisierungen der Konfliktdateien als von dem Benutzer stammend angezeigt, der die Konflikte gelöst hat. Ich gehe davon aus, dass die Person, die den Konflikt behebt, die Datei erneut festschreibt.
Soweit ich weiß, funktioniert Git genau so, und daran führt kein Weg vorbei.
Durch das erneute Basieren wird der Git-Verlauf weggeblasen, sodass Sie nicht sehen können, wann Zusammenführungen stattgefunden haben.
quelle