Ich bin neu bei Git, also zögern Sie nicht, mich wie einen Neuling zu behandeln.
Unser Workflow ist so. Wir haben eine Filiale namens, dev
die ich erreichen kann origin/dev
. Wenn wir Änderungen vornehmen, erstellen wir einen Zweig von dev:
git checkout -b FixForBug origin / dev
Jetzt habe ich einen Zweig namens FixForBug
Tracking (ich denke, das ist das richtige Wort) origin/dev
. Wenn ich also ein git pull
mache, bringt es neue Änderungen mit sich, von origin/dev
denen es großartig ist. Wenn ich mit meinem Fix fertig bin, drücke ich zu einem Remote-Zweig, der dasselbe heißt.
Zuerst ziehe ich alle Änderungen von herunter origin/dev
und mache eine Rebase:
Git Pull - Rebase
Dann schiebe ich die Änderungen in einen Remote-Zweig mit demselben Namen:
Git Push Ursprung FixForBug
Jetzt gibt es einen Zweig auf dem Remote-Server, und ich kann eine Pull-Anforderung erstellen, damit diese Änderung genehmigt und wieder in den Entwicklungszweig integriert wird. Ich schiebe mir nie etwas vor origin/dev
. Ich vermute, dies ist ein ziemlich häufiger Workflow.
Das erste Mal, wenn ich a mache git push
, funktioniert es einwandfrei und erstellt den Remote-Zweig. Wenn ich jedoch ein zweites Mal drücke (sagen wir, während der Codeüberprüfung weist jemand auf ein Problem hin), wird der folgende Fehler angezeigt:
Fehler: Einige Refs konnten nicht an ' https://github.limeade.info/Limeade/product.git ' gesendet werden. Hinweis: Aktualisierungen wurden abgelehnt, da sich die Spitze Ihres aktuellen Zweigs hinter dem Hinweis befindet: dem Remote-Gegenstück. Integrieren Sie die Remote-Änderungen (z. B. Hinweis: 'git pull ...'), bevor Sie erneut drücken. Hinweis: Weitere Informationen finden Sie im 'Hinweis zum Schnellvorlauf' in 'git push --help'.
Wenn ich jedoch ein Commit mache , bedeutet dies git status
, dass ich origin/dev
1 Commit voraus bin (was sinnvoll ist), und wenn ich dem Hinweis folge und laufe git pull
, heißt es, dass alles auf dem neuesten Stand ist. Ich denke, das liegt daran, dass ich zu einem anderen Zweig als meinem vorgelagerten Zweig drücke. Ich kann dieses Problem beheben, indem ich Folgendes ausführe:
git push -f origin FixForBug
In diesem Fall werden die Änderungen auf den Remote-Zweig übertragen, wobei (erzwungenes Update) angezeigt wird , und auf dem Remote-Zweig scheint alles in Ordnung zu sein.
Meine Fragen:
Warum ist -f
in diesem Szenario erforderlich? Wenn Sie etwas erzwingen , liegt dies normalerweise daran, dass Sie etwas falsch gemacht haben oder zumindest gegen die Standardpraxis. Bin ich in Ordnung, oder wird es etwas in der Remote-Filiale durcheinander bringen oder Ärger für jeden verursachen, der irgendwann meine Sachen in Entwickler zusammenführen muss?
git pull origin FixForBug
bevor ich dazu dränge ? Ok das macht Sinn. Fühlen Sie sich frei, als Antwort hinzuzufügen!Antworten:
Das
-f
ist eigentlich wegen der Rebase erforderlich. Wenn Sie eine Rebase durchführen, müssen Sie einen Force-Push ausführen, da der Remote-Zweig nicht schnell zu Ihrem Commit weitergeleitet werden kann. Sie möchten immer sicherstellen, dass Sie vor dem Drücken einen Pull ausführen. Wenn Sie jedoch nicht möchten, dass der Push an Master oder Dev erzwungen wird, können Sie einen neuen Zweig erstellen, auf den Sie drücken und dann zusammenführen oder eine PR erstellen können .quelle
Um sicherzustellen, dass Ihr lokaler Zweig FixForBug nicht vor dem Remote-Zweig FixForBug liegt, ziehen Sie die Änderungen und führen Sie sie zusammen, bevor Sie sie verschieben.
quelle
Wenn Sie vermeiden möchten, verwenden zu müssen
-f
, können Sie nur verwendenanstatt
Die Nicht-Fütterungsmaterial werden die Änderungen von holen
origin/dev
und verschmelzen sie in IhreFixForBug
Niederlassung. Dann können Sie laufenohne zu benutzen
-f
.quelle
-f
da Sie Commits im Upstream-Repository durch andere ersetzen , die einen anderen (neu basierten) Verlauf haben. Wenn Sie ein Produkt wie Gerrit verwenden , unterstützt es diese Art der Umbasierung des Codeüberprüfungs-Workflows, ohne dass Sie ihn-f
beim Push verwenden müssen. Wir verwenden Gerrit bei der Arbeit auf diese Weise und es funktioniert sehr gut.the tip of your current branch is behind its remote counterpart
bedeutet, dass in der Remote-Verzweigung Änderungen vorgenommen wurden, die Sie lokal nicht haben. und git sagt Ihnen, dass Sie neue Änderungen aus importierenREMOTE
und mit Ihrem Code zusammenführen und dannpush
auf remote.Mit diesem Befehl können Sie Änderungen am Server mit local repo () erzwingen.
Mit dem
-f
Tag werden SieRemote Brach code
mit Ihrem Code überschrieben .quelle
Der Befehl, den ich mit Azure DevOps verwendet habe, als ich auf die Meldung "Aktualisierungen wurden abgelehnt, weil die Spitze Ihres aktuellen Zweigs dahinter liegt" stieß, war / ist dieser Befehl:
Git Pull Origin Master
(oder kann mit einem neuen Ordner beginnen und einen Klon durchführen) ..
Diese Antwort bezieht sich nicht auf die gestellte Frage, insbesondere hat Keif diese oben beantwortet, beantwortet jedoch den Titel / Überschriftstext der Frage, und dies ist eine häufige Frage für Azure DevOps-Benutzer.
Ich bemerkte einen Kommentar: "Du solltest immer sicherstellen, dass du einen Zug machst, bevor du drückst" als Antwort von Keif oben!
Ich habe zusätzlich zum Git-Befehlszeilentool auch das Git Gui-Tool verwendet.
(Ich war mir nicht sicher, wie ich das Äquivalent des Befehlszeilenbefehls "git pull origin master" in Git Gui ausführen sollte, also bin ich zurück zur Befehlszeile, um dies zu tun).
Ein Diagramm, das verschiedene Git-Befehle für verschiedene Aktionen zeigt, die Sie möglicherweise ausführen möchten, ist das folgende:
quelle
Das ist mir gerade passiert.
Lösung: Ziehen Sie meinen eigenen Zweig herunter, damit ich das zusätzliche Commit bekomme. Dann schieben Sie es auf meinen Remote - Zweig zurück.
Im wahrsten Sinne des Wortes habe ich in meinem Zweig Folgendes getan :
quelle
So habe ich mein Problem gelöst
Nehmen wir an, der Upstream-Zweig ist derjenige, von dem Sie gegabelt haben, und der Ursprung ist Ihr Repo, und Sie möchten einen MR / PR an den Upstream-Zweig senden.
Sie haben bereits sagen wir 4 Commits und Sie bekommen
Updates were rejected because the tip of your current branch is behind.
Hier ist was ich getan habe
Zerquetschen Sie zuerst alle Ihre 4 Commits
Sie erhalten eine Liste der Commits
pick
, auf die geschrieben steht. (in einem Editor geöffnet)Beispiel
zu
Danach können Sie Ihr kombiniertes Commit speichern
Nächster
Sie müssen Ihr Commit verstauen
Hier ist wie
Jetzt mit Ihrer Upstream-Niederlassung neu gründen
Jetzt platzen Sie Ihr verstecktes Commit
Übernehmen Sie diese Änderungen und drücken Sie sie
quelle
Es muss daran liegen, dass Commit Ihrem aktuellen Push voraus ist.
1) git pull origin "Name des Zweigs, den Sie verschieben möchten"
2) Git Rebase
Wenn Git Rebase erfolgreich ist, dann gut. Andernfalls haben Sie alle Zusammenführungskonflikte lokal gelöst und setzen sie fort, bis die Neustart mit Remote erfolgreich ist.
3) Git Rebase - weiter
quelle
Ich hatte dieses Problem, als ich versuchte, nach einem Rebase durch Visual Studio Code zu pushen. Mein Problem wurde behoben, indem der Befehl einfach aus dem Git-Ausgabefenster kopiert und über das Terminalfenster in Visual Studio Code ausgeführt wurde.
In meinem Fall war der Befehl ungefähr so:
git push origin NameOfMyBranch:NameOfMyBranch
quelle