Aktualisierungen wurden abgelehnt, da der Tipp Ihres aktuellen Zweigs zurückliegt

153

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, devdie 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 FixForBugTracking (ich denke, das ist das richtige Wort) origin/dev. Wenn ich also ein git pullmache, bringt es neue Änderungen mit sich, von origin/devdenen 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/devund 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/dev1 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 -fin 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?

Mike Christensen
quelle
2
Anscheinend wird in der Meldung angezeigt, dass der Remote-Zweig FixForBug vor dem lokalen Zweig FixForBug liegt. Sie sollten die Änderungen aus diesem Remote-Zweig abrufen und in Ihrem lokalen Zweig zusammenführen, bevor Sie sie verschieben.
mhatch
4
@mhatch - Also im Grunde laufen, git pull origin FixForBugbevor ich dazu dränge ? Ok das macht Sinn. Fühlen Sie sich frei, als Antwort hinzuzufügen!
Mike Christensen

Antworten:

197

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 .

Keif Kraken
quelle
2
Vielen Dank für diese sehr hilfreiche Antwort! :)
AIM_BLB
1
Könnten Sie den Punkt "Sie möchten immer sicherstellen, dass Sie einen Zug machen, bevor Sie drücken" klarstellen? Es ist klar, warum "push -f" nach dem erneuten Basieren des lokalen Zweigs erforderlich ist. Wird in diesem Fall die Wiederherstellung des lokalen Geräts nicht durch Ziehen an der Fernbedienung vor dem Drücken rückgängig gemacht?
Haripkannan
50

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.

git pull origin FixForBug
git push origin FixForBug
mhatch
quelle
2
OP gab an, dass sie bereits einen Git Pull gemacht und versucht haben zu schieben. Ihre Antwort gilt nicht für die Frage von OP.
Patrick
1
Es ist immer besser, einen Kraftstoß zu vermeiden. Danke, dass du das geteilt hast!
Ann Kilzer
16

Wenn Sie vermeiden möchten, verwenden zu müssen -f, können Sie nur verwenden

git pull

anstatt

git pull --rebase

Die Nicht-Fütterungsmaterial werden die Änderungen von holen origin/devund verschmelzen sie in Ihre FixForBugNiederlassung. Dann können Sie laufen

git push origin FixForBug

ohne zu benutzen -f.

Greg Hewgill
quelle
3
Rebase ist hier Teil unseres Workflows. Ich werde angeschrien, wenn ich es nicht tue.
Mike Christensen
1
@ MikeChristensen: Okay, dann folgen Sie natürlich dem dokumentierten Verfahren. Nach dem, was Sie beschreiben, müssen Sie verwenden, -fda 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 -fbeim Push verwenden müssen. Wir verwenden Gerrit bei der Arbeit auf diese Weise und es funktioniert sehr gut.
Greg Hewgill
12

the tip of your current branch is behind its remote counterpartbedeutet, dass in der Remote-Verzweigung Änderungen vorgenommen wurden, die Sie lokal nicht haben. und git sagt Ihnen, dass Sie neue Änderungen aus importieren REMOTEund mit Ihrem Code zusammenführen und dann pushauf remote.

Mit diesem Befehl können Sie Änderungen am Server mit local repo () erzwingen.

git push -f origin master

Mit dem -fTag werden Sie Remote Brach codemit Ihrem Code überschrieben .

Talha Rafique
quelle
6

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:

Geben Sie hier die Bildbeschreibung ein

Allan F.
quelle
4

Das ist mir gerade passiert.

  • Ich habe gestern eine Pull-Anfrage an unseren Meister gestellt.
  • Mein Kollege hat es heute überprüft und festgestellt, dass es nicht mit unserer Hauptniederlassung synchron ist. In der Absicht, mir zu helfen, hat er die Hauptniederlassung mit meiner Niederlassung zusammengeführt.
  • Ich wusste nicht, dass er das tat.
  • Dann habe ich den Master lokal zusammengeführt und versucht, ihn zu pushen, aber es ist fehlgeschlagen. Warum? Da mein Kollege mit dem Master zusammengeführt wurde, wurde ein zusätzliches Commit erstellt, das ich vor Ort nicht hatte !

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 :

git pull
git push
Honig
quelle
3

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

git rebase -i HEAD~4

Sie erhalten eine Liste der Commits pick, auf die geschrieben steht. (in einem Editor geöffnet)

Beispiel

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

zu

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

Danach können Sie Ihr kombiniertes Commit speichern

Nächster

Sie müssen Ihr Commit verstauen

Hier ist wie

git reset --soft HEAD~1
git stash

Jetzt mit Ihrer Upstream-Niederlassung neu gründen

git fetch upstream beta && git rebase upstream/beta

Jetzt platzen Sie Ihr verstecktes Commit

git stash pop

Übernehmen Sie diese Änderungen und drücken Sie sie

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f
Deepesh Nair
quelle
2

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

kris
quelle
0

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

HoloLady
quelle