Wie kann ich ein bestimmtes Commit auf eine Remote übertragen und nicht auf vorherige Commits?


Antworten:


1087

Um ein bestimmtes Commit zu durchlaufen , können Sie schreiben:

git push <remotename> <commit SHA>:<remotebranchname>

vorausgesetzt, es ist <remotebranchname>bereits auf der Fernbedienung vorhanden. (Wenn dies nicht der Fall ist, können Sie git push <remotename> <commit SHA>:refs/heads/<remotebranchname>es automatisch erstellen.)

Wenn Sie ein Commit pushen möchten, ohne vorherige Commits zu pushen , sollten Sie zuerst git rebase -idie Commits neu anordnen.


66
git push <remotename> <commit SHA>:<remotebranchname>funktioniert. der Trick ist , um es zu kombinieren mit git rebase -idem Festschreiben Sie als die erste begehen, und geben Sie verschieben möchten , dass commit-sha
dminer

29
Ein weiterer guter Tipp ist, sicherzustellen, dass Sie die SHA des Commits kopieren, das Sie nach dieser Rebase -i pushen möchten, und nicht vorher, wie ich es gerade getan habe :)
estan

33
Beachten Sie, dass dies fehlschlägt, wenn der Remote-Zweig noch nicht vorhanden ist. Das Erstellen des Zweigs kann mit erfolgen git push <remotename> <commit SHA>:refs/heads/<new remote branch name>. Drücken Sie danach wie in der Antwort beschrieben.
Wes Oldenbeuving

32
Zum Beispiel, um alles außer dem letzten Commit mit einigen Standardnamen zu pushen git push origin HEAD~1:master.
Kunstloser Lärm

3
Beachten Sie auch, dass Sie, wenn Sie bereits einen späteren SHA an diesen Remote-Zweig gesendet haben, diesen erzwingen müssen. Verwenden Sie die -fFlagge.
Ian Vaughan

79

Die anderen Antworten fehlen in den Nachbestellungsbeschreibungen.

git push <remotename> <commit SHA>:<remotebranchname>

wird ein einzelnes Commit pushen, aber dieses Commit muss das ÄLTESTE Ihrer lokalen, nicht gepushen Commits sein, nicht zu verwechseln mit dem Top-, First- oder Tip-Commit, die meiner Meinung nach allesamt mehrdeutige Beschreibungen sind. Das Commit muss das älteste Ihrer Commits sein, dh das am weitesten von Ihrem letzten Commit entfernte. Wenn es nicht das älteste Commit ist, werden alle Commits von Ihrem ältesten lokalen, nicht gepushen SHA an den angegebenen SHA gepusht. Um die Commits neu zu ordnen, verwenden Sie:

git rebase -i HEAD~xxx

Nachdem Sie das Commit neu angeordnet haben, können Sie es sicher in das Remote-Repository übertragen.

Zusammenfassend habe ich verwendet

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

um ein einzelnes Commit an meinen Remote-Master-Zweig zu senden.

Verweise:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

Siehe auch:

  1. git: Doppelte Commits nach lokaler Wiederherstellung, gefolgt von Pull
  2. git: Einzelne Commits pushen, mit Rebase neu ordnen, Commits duplizieren

3
Einige Ursprünge erlauben dies möglicherweise nicht. In GitLab wird beispielsweise angezeigt, dass Sie in diesem Projekt keinen Push-Code in einen geschützten Zweig erzwingen dürfen. Was ein wenig seltsam ist, da ich nicht dachte, dass ich irgendetwas erzwingen würde, nur einen normalen Stoß machen würde. Irgendeine Idee, wie man es macht, ohne es zu erzwingen?
Ed Avis

1
@ Ed Sollte keine Notwendigkeit sein, Druck zu erzwingen. Klingt so, als hätten Sie ein Problem mit Ihrem speziellen Git-Setup. Vielleicht haben Sie das Remote-HEAD-Commit überschritten? Ich weiß nicht, was ein geschützter Zweig ist, klingt nach einem Berechtigungsproblem.
Samuel

1
Samuel - das wäre sinnvoll, aber git rebase - ich zeige dir nur die lokalen Commits, die später als der Remote-HEAD sind, also weiß ich nicht, wie ich das hätte tun können.
Ed Avis

1
Samuel - tatsächlich kann ich jetzt teilweise Pushs ausführen, sodass ich nicht weiß, was schief gelaufen ist, aber es muss versucht haben, ein Commit, das nicht von Remote HEAD abgeleitet wurde, auf die eine oder andere Weise zu pushen.
Ed Avis

1
@Ed Du hast gesagt "git rebase -i zeigt dir nur die lokalen Commits, die später als der Remote-HEAD sind", ich glaube nicht, dass dies wahr ist. Ich habe getestet und konnte über den Remote-HEAD hinaus neu starten.
Samuel

25

Ich würde vorschlagen, zu verwenden git rebase -i; Verschieben Sie das Commit, das Sie verschieben möchten, an den Anfang der von Ihnen vorgenommenen Commits. Verwenden Sie dann git log, um den SHA des neu basierten Commits abzurufen, ihn zu überprüfen und zu verschieben. Durch die Rebase wird sichergestellt, dass alle anderen Commits jetzt Kinder des von Ihnen gepushen Commits sind, sodass auch zukünftige Pushs gut funktionieren.


3
Könnten Sie vielleicht ein komplettes Beispiel für einen Umzug geben, insb. git logBist du der Schritt?
Drux

4
Angenommen, Sie haben 3 relativ unabhängige Festschreibungen mit den in dieser Reihenfolge festgeschriebenen Nachrichten "A", "B", "C" und möchten "B" drücken. 'git rebase -i' sollte Sie und den Editor dazu bringen, alle drei aufzulisten. Bewegen Sie B nach oben und speichern / beenden Sie. 'git log --pretty = oneline -n3' listet B, A, C mit Hashes vor jeder Nachricht auf, wobei B jetzt das letzte ist. 'git checkout -b temp $ hash_of_B; git push 'sollte an diesem Punkt B drücken. Sie werden dann wahrscheinlich 'git checkout -b master' wollen; git branch -d temp ', um zu Ihrem vorherigen Status zurückzukehren, vorausgesetzt, Sie befanden sich in Ihrem lokalen Hauptzweig. gegebenenfalls ersetzen.
Walter Mundt

1
+1 Bist du jemals dem "Zorn der Git-Götter" nach Rebase-Push-Rebase begegnet? (Könnte möglicherweise auch zufällig passieren, oder?)
Drux

2
Wenn Sie meine Antwort sorgfältig lesen, sehen Sie, dass der Push erst nach dem Rebase erfolgt und der neu basierte Commit nur über andere Commits verschoben wird, die noch nicht gepusht wurden. Sobald ein Commit verschoben wurde, sollte es im Allgemeinen als in Stein gemeißelt betrachtet werden. Lass es in Zukunft in Ruhe. Mit dieser Technik können Sie mehrere lokale Änderungen in einer guten Reihenfolge sortieren, bevor Sie sie verschieben. Wenn Sie das Tracking korrekt eingerichtet haben, zeigt 'git rebase -i' ohne andere Argumente standardmäßig nicht einmal die Push-Commits an, sodass es vor Unfällen sicherer ist als einige andere Methoden.
Walter Mundt

21

Cherry-Pick funktioniert am besten im Vergleich zu allen anderen Methoden, während ein bestimmtes Commit ausgeführt wird.

Der Weg dazu ist:

Neuen Zweig erstellen -

git branch <new-branch>

Aktualisieren Sie Ihren neuen Zweig mit Ihrem Ursprungszweig -

git fetch

git rebase

Diese Aktionen stellen sicher, dass Sie genau das gleiche Material haben wie Ihre Herkunft.

Wählen sha idSie die Kirsche aus, die Sie schieben möchten -

git cherry-pick <sha id of the commit>

Sie können das sha iddurch Laufen bekommen

git log

Schieben Sie es zu Ihrem Ursprung -

git push

Laufen Sie, um gitkzu sehen, dass alles so aussieht, wie Sie es wollten.


2
Die Verwendung git rebase -iist die ideale Lösung, wie in den obigen Lösungen vorgeschlagen. Cherry Pick darf nur verwendet werden, wenn Sie das Commit duplizieren möchten.
Vinay Bhargav

13

Ich glaube, Sie müssten zu diesem Commit zurückkehren und es dann pushen. Oder Sie können cherry-pickein Commit in einen neuen Zweig durchführen und diesen in den Zweig im Remote-Repository verschieben. Etwas wie:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}

9
Git Revert ist hier eine schlechte Idee - es erstellt ein neues Commit
Hasen

1
@hasen: Du könntest dann genau cherry-pickdas Commit machen was du willst.
Josh K

4
Sowohl Revert als auch Cherry-Pick sind schlechte Ideen. git rebase -i ist dein Freund hier, siehe Antwort von Walter Mundt unten.
Nicolas C

3
@Nicolas, warum ist Cherry-Pick eine schlechte Idee?
Antoine

3
@Antoine, normalerweise soll Ihr Zweig mit dem Zweig synchron bleiben, den er beim Ursprung verfolgt. Wenn Sie sich für eine Kirsche entscheiden, führen Sie ein Kopieren / Einfügen durch, und Sie müssen sich irgendwann mit der nicht gedrückten Kopie befassen. Wenn Sie -i neu gründen, "schneiden und einfügen" und halten Ihren Zweig bis zur gewünschten Position mit der Fernbedienung synchron.
Nicolas C

0

Sie können auch in einem anderen Verzeichnis:

  • Git-Klon [Ihr Repository]
  • Überschreiben Sie das .git-Verzeichnis in Ihrem ursprünglichen Repository mit dem .git-Verzeichnis des Repositorys, das Sie gerade geklont haben.
  • git add und git legen Ihr Original fest
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.