Frage

Wenn ich ein bisschen mit meinem Quellcode gearbeitet habe, habe ich meine übliche Sache zu begehen und dann schob ich zu einer Remote-Repository. Aber dann bemerkte ich, ich vergaß zu meinen Importen im Quellcode zu organisieren. So kann ich den Befehl ändern ersetzen die bisherige commit:

> git commit --amend

Leider kann das Commit nicht zurück in das Repository geschoben werden. Es wird wie folgt zurückgewiesen:

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

Was soll ich tun? (Ich kann die Remote-Repository zugreifen.)

War es hilfreich?

Lösung

ich einmal tatsächlich mit --force und .git Repository geschoben und konnte Linus BIG TIME schalt. In der Regel wird dies eine Menge Probleme für andere Menschen zu schaffen. Eine einfache Antwort ist "Do not do it".

Ich sehe andere das Rezept gab es trotzdem zu tun, also werde ich sie hier nicht wiederholen. Aber hier ist ein Tipp aus der Situation zu erholen nach Sie haben mit --force die geänderte begehen geschoben (oder + Master).

  1. Verwenden Sie git reflog finden die alte verpflichten, dass Sie geändert (es old nennen, und wir werden die neue rufen Sie durch eine Änderung new erstellt commit).
  2. Erstellen Sie eine Zusammenführung zwischen old und new, Aufzeichnen des Baumes von new, wie git checkout new && git merge -s ours old.
  3. Merge, die zu Ihrem Master mit git merge master
  4. Aktualisieren Sie Ihre Master mit dem Ergebnis, mit git push . HEAD:master
  5. Drücken Sie das Ergebnis aus.

Dann werden die Menschen, die unglücklich genug waren, haben sich für ihre Arbeit auf dem Festschreiben Sie ausgelöscht durch eine Änderung und zwingt einen Push wird das resultierende merge sehen werden sehen, dass Sie new über old begünstigen. Deren später verschmilzt nicht sehen, die Konflikte zwischen old und new, die von Ihrer zur Änderung geführt, so dass sie müssen nicht leiden.

Andere Tipps

Sie sehen ein Git Sicherheitsmerkmal. Git weigert sich, die Remote-Zweig mit Ihrem Zweig zu aktualisieren, weil Ihr Zweig Kopf begehen ist kein direkter Nachkomme des aktuellen Kopf begehen der Branche, die Sie drängen.

Ist dies nicht der Fall wäre, dann zwei Personen auf dem gleichen Repository schieben etwa zur gleichen Zeit würde nicht wissen, dass es eine neue begehen zugleich kommen und wer schob zuletzt die Arbeit des vorherigen Schieber würde verlieren ohne eine von ihnen dies zu verwirklichen.

Wenn Sie wissen, dass Sie die einzige Person sind, drängt und Sie wollen schieben ein Commit geändert oder schieben eine Festschreibung, dass der Zweig windet zurück, man kann ‚Kraft‘ Git den Fern Zweig aktualisieren, indem Sie den -f Schalter.

git push -f origin master

Auch kann dies nicht funktionieren, wie Git Remote-Repositories ermöglicht nicht-fastforward am Ende schiebt zu verweigern, indem Sie die Konfigurationsvariable receive.denynonfastforwards verwenden. Wenn dies der Fall ist, der Ablehnungsgrund wird wie folgt aussehen (beachten Sie den ‚Remote abgelehnt‘ Teil):

 ! [remote rejected] master -> master (non-fast forward)

Um dies zu umgehen, müssen Sie entweder die Remote-Repository Konfiguration oder als schmutzig Hack ändern können Sie löschen und den Zweig neu so:

git push origin :master
git push origin master

In der Regel der letzte Parameter auf git push das Format <local_ref>:<remote_ref> verwendet, wo local_ref ist der Name der Branche auf dem lokale Repository und remote_ref ist der Name der Branche auf der Remote-Repository. Dieser Befehl Paar verwendet zwei Kürzel. :master hat ein null local_ref die einen Null-Zweig zu der entfernten Seite master bedeutet drücken, das heißt den Fern Zweig löschen. Ein Zweigname ohne : bedeutet die lokale Niederlassung mit dem angegebenen Namen auf den Remote-Zweig mit dem gleichen Namen drücken. master in dieser Situation ist die Abkürzung für master:master.

Schnell rant: Die Tatsache, dass niemand die einfache Antwort hier gepostet hat demonstriert die verzweifelte Benutzer-Feindschaft durch die Git CLI ausgestellt

.

Wie auch immer, die „offensichtlich“ Art und Weise, dies zu tun, vorausgesetzt, Sie die Push nicht versucht haben, zu zwingen, ist zuerst zu ziehen. Dies zieht die Änderung, die Sie geändert (und so nicht mehr haben), so dass Sie es noch einmal.

Sobald Sie alle Konflikte gelöst haben, können Sie wieder drücken.

So:

git pull

Wenn Sie Fehler in Zuge bekommen, vielleicht etwas falsch in Ihrer lokalen Repository-Konfiguration (ich hatte einen falsch ref in der .git / config Abzweigungsprofil).

Und nach

git push

Vielleicht bekommen Sie eine zusätzliche begehen mit dem Thema von einem „Trivial merge“ zu sagen.

Kurze Antwort:. Drücken Sie nicht geändert Commits zu einem öffentlichen Repo

Lange Antwort: Einige Git Befehle, wie git commit --amend und git rebase, tatsächlich neu schreiben die Geschichte Graphen. Das ist in Ordnung, solange Sie nicht Ihre Änderungen veröffentlicht haben, aber wenn Sie das tun, sollten Sie wirklich nicht mit der Geschichte werden herumschlagen, denn wenn jemand bereits Ihre Änderungen erhalten, dann, wenn sie versuchen, erneut zu ziehen, es scheitern könnte . Statt zur Änderung einen Commit, sollten Sie nur eine neue mit den Änderungen begehen.

Wenn Sie jedoch wirklich, wirklich eine geänderte Fassung drücken wollen begehen, können Sie dies wie folgt aus:

$ git push origin +master:master

Die führenden + Zeichen werden die Schubkraft auftritt, auch wenn es nicht in einem „Schnellvorlauf“ begehen führt. (A vorspulen begehen auftritt, wenn die Änderungen, die Sie drängen sind ein direkter Nachkomme der Änderungen bereits im öffentlichen Repo).

Dies ist eine sehr einfache und saubere Art und Weise, um die Änderungen zu drücken, nachdem Sie bereits eine commit --amend gemacht:

git reset --soft HEAD^
git stash
git push -f origin master
git stash pop
git commit -a
git push origin master

Welche führt Folgendes aus:

  • Zurücksetzen Filialleiter Mutter begehen.
  • Stash diese letzte begehen.
  • Kraft Push-to-Fernbedienung. Die Fern jetzt hat nicht das letzte Mal begehen.
  • Pop Ihrem Versteck.
  • Commit sauber.
  • Push-to-Fernbedienung.

Denken Sie daran, „Ursprung“ zu ändern und „Master“, wenn diese zu einem anderen Zweig oder Remote-Anwendung.

Ich habe es gelöst durch meine lokale geänderte Fassung verpflichten Verwerfen und Hinzufügen der neuen Änderungen auf:

# Rewind to commit before conflicting
git reset --soft HEAD~1

# Pull the remote version
git pull

# Add the new commit on top
git add ...
git commit
git push

Ich hatte das gleiche Problem.

  • geändert Versehentlich die letzte commit, dass bereits gedrückt
  • eine Menge Änderungen lokal Geschehen, etwa fünfmal so
  • begangen
  • Versucht zu drücken, eine Fehlermeldung anzeigt, in Panik geraten, Fern fusionierte, hat eine Menge von nicht-my-Dateien, geschoben, scheiterte, etc.

Als Git-Neuling, ich dachte, es war komplett FUBAR .

Lösung: Etwas wie @bara vorgeschlagen + einen lokalen Sicherungszweig erstellt

# Rewind to commit just before the pushed-and-amended one.
# Replace <hash> with the needed hash.
# --soft means: leave all the changes there, so nothing is lost.
git reset --soft <hash>

# Create new branch, just for a backup, still having all changes in it.
# The branch was feature/1234, new one - feature/1234-gone-bad
git checkout -b feature/1234-gone-bad

# Commit all the changes (all the mess) not to lose it & not to carry around
git commit -a -m "feature/1234 backup"

# Switch back to the original branch
git checkout feature/1234

# Pull the from remote (named 'origin'), thus 'repairing' our main problem
git pull origin/feature/1234

# Now you have a clean-and-non-diverged branch and a backup of the local changes.
# Check the needed files from the backup branch
git checkout feature/1234-gone-bad -- the/path/to/file.php

Vielleicht ist es nicht eine schnelle und saubere Lösung, und ich verlor meine Geschichte (1 statt 5 begehen), aber sie gespeichert Arbeit eines Tages.

Wenn Sie den Code in Ihrem Remote-Zweig (GitHub / Bitbucket) gedrückt haben, können Sie die Nachricht als unten auf der Kommandozeile über ändern.

 git commit --amend -m "Your new message"

Wenn Sie auf einem bestimmten Zweig arbeiten, dies zu tun:

git commit --amend -m "BRANCH-NAME: new message"

Wenn Sie bereits den Code mit einer falschen Nachricht gedrückt, dann müssen Sie vorsichtig sein, wenn Sie die Mitteilung ändern. das heißt, nachdem Sie die Commit-Nachricht ändern und versuchen Sie es erneut Drücken Sie mit Fragen enden. Damit es die folgenden Schritte glatt folgen.

Bitte lesen Sie die gesamte Antwort, bevor es zu tun

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

Wichtiger Hinweis: Wenn Sie die Kraft Push direkt verwenden können Sie auch mit Code Fragen am Ende, dass andere Entwickler auf der gleichen Branche arbeiten. Also diese Konflikte zu vermeiden, müssen Sie den Code aus Ihrer Branche ziehen, bevor Sie die Kraft Push :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

Dies ist die beste Praxis, wenn die Commit-Nachricht zu ändern, wenn es bereits gedrückt wurde.

Wenn Sie wissen, hat niemand gezogen Ihre un-geändert begehen, verwenden Sie die --force-with-lease Möglichkeit git push.

In TortoiseGit, können Sie das gleiche tun unter "Push ..." Optionen "Kraft: Kann verwerfen". Und Überprüfung "bekannt changes"

  

Force (Mai bekannt Änderungen verwerfen) die Remote-Repository erlaubt ein sichereres nicht vorspulen Push zu akzeptieren. Dies kann die Remote-Repository verursacht Commits zu verlieren; verwenden Sie es mit Vorsicht. Dies kann verlieren unbekannte Veränderungen von anderen Menschen auf der Fernbedienung verhindern. Es prüft, ob die Server Verzweigungspunkte auf das gleiche wie die Fernverfolgung Zweig (bekannt Änderungen) begehen. Wenn ja, wird eine Kraft Push durchgeführt werden. Sonst wird es abgelehnt. Da git keine Remote-Tracking-Tags verfügt, können die Tags nicht mit dieser Option überschrieben.

Dies ist eine sehr einfache und saubere Art und Weise, um die Änderungen zu drücken, nachdem Sie bereits ein git add "your files" und git commit --amend gemacht:

git push origin master -f

oder:

git push origin master --force

Sie erhalten diese Fehlermeldung, da der Git Fern bereits diese Dateien zu begehen hat. Sie haben zu zwingen, den Zweig für diese Arbeit drücken:

git push -f origin branch_name

Auch stellen Sie sicher, dass Sie den Code aus der Ferne wie jemand anderes in Ihrem Team ziehen könnte auf den gleichen Zweig geschoben hat.

git pull origin branch_name

Dies ist einer der Fälle, in denen wir zwingen müssen drücken Sie die an entfernten begehen.

Ich hatte dieses Problem zu beheben, mit dem Remote-Repo ziehen und mit den Merge Konflikten befassen, die entstanden ist, zu begehen und dann drücken. Aber ich fühle mich wie es eine bessere Art und Weise.

Ich habe einfach das tun, was Git mir gesagt, zu tun. Also:

  • Kann nicht drücken, weil der geänderten begehen.
  • Ich habe einen Zug, wie vorgeschlagen.
  • Merge fehlschlägt. so dass ich fix it manuell.
  • Erstellen Sie eine neue commit (beschriftet "Merge") und schieben Sie es.
  • Es scheint zu funktionieren!

. Hinweis: Die geänderte Fassung commit war das späteste

Hier, wie ich festgelegt bearbeitet in einem früheren begehen:

  1. Speichern Sie Ihre Arbeit so weit.
  2. Stash Ihre Änderungen jetzt weg, wenn gemacht: git stash nun Ihre Arbeitskopie auf den Zustand Ihrer letzten sauber begehen
  3. .
  4. Nehmen Sie die Änderungen und Korrekturen.
  5. Nehmen Sie die Änderungen in "ändern" Modus: git commit --all --amend
  6. Der Editor wird kommen für eine Log-Meldung gefragt (standardmäßig die alte Protokollmeldung). Speichern und beenden Sie den Editor, wenn Sie mit ihm zufrieden sind.

    Die neuen Änderungen werden hinzugefügt, um die alten zu begehen. Überzeugen Sie sich selbst mit git log und git diff HEAD^

  7. Re-apply Ihre gebunkert Änderungen, wenn gemacht: git stash apply

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top