2009-11-24 22 views
33

Angenommen, ich habe mehrere Commits gemacht und möchte auswählen, welche ich an das Remote-Repository schiebe. Wie kann ich das tun (in ASCII: C1-> C2-> C3-> C4 und ich möchte C2 und C4 drücken). Wird das Nachbestellen mit Rebase, Reset, Pushing und Reset durchgeführt? (C1-> C2-> C3-> C4 => C2-> C4-> C1-> C3 => C4 zurücksetzen => drücken => C3 zurücksetzen). Gibt es einen schöneren Weg?git: push ein einzelnes commit

+0

Ja, man kann die Geschichte neu zu schreiben (oder separaten Zweig mit dem erforderlichen Geschichte erstellen) und dann drücken. Das ist der einzige Weg. –

+3

Ich war auch auf der Suche nach dem gleichen Problem. Diese Ressource könnte nützlich sein https://miteshshah.github.io/linux/git/how-to-push-single-commit-with-git/ –

Antwort

20

Wenn Sie Ihre Commits in einer Privatfiliale haben, können Sie Commits aus der privaten Branche auswählen und sie auf die offizielle Zweigstelle anwenden. An dieser Stelle können Sie nun alle Ihre Commits auf den offiziellen Zweig schieben (das ist die Untermenge, die Sie zuvor ausgewählt haben).

+2

Oder wenn Sie Commits auf dem offiziellen Zweig sind, können Sie sich in einen temporären Zweig einwählen und ihn zur entfernten offiziellen Zweigstelle schieben. Ähm ... oder? – andho

+0

IMHO Die einfachste und am meisten verwendbare Technik. – Benj

3

IIRC, aufgrund der Tatsache, wie Git Commits zu arbeiten, C4 beinhaltet inhärent C3, so dass das Konzept "Drücken C4, aber nicht C3" macht keinen Sinn für git (und ebenfalls C2 relativ zu C1). (Siehe die Antwort auf this previous question.)

+2

Unwahr! C4 referenziert C3 als Elternteil, aber die andere Antwort ist korrekter: Sie können Commits aus der Historie auswählen und sie auf verschiedene Eltern anwenden. –

+0

Ist es nicht mehr wie C4 inhärent gilt, es ist Änderungen an C3, aber C4 Änderungen sind es eigene. – andho

+7

Die Verwendung von 'git cherry-pick' auf' C4', um sie auf einen anderen Zweig anzuwenden, führt nicht zu "C4" auf dem neuen Zweig, sondern zu "C4", einem anderen (aber ähnlichen) Commit. Wenn jemand später in der Filiale mit 'C4' verschmilzt, können Probleme auftreten. – Amber

49

Was Sie suchen:

git push origin commit-id:master 

Kredit geht an: http://blog.dennisrobinson.name/push-only-one-commit-with-git/

Hinweise:

  • Pushing a Schübe alle Commits, bevor sie begehen (wie Bernstein sagte). Der Schlüssel ist, Ihre commits (git rebase -i) zuerst neu zu ordnen, also sind sie in der Reihenfolge, die Sie sie drücken möchten.
  • Die vorgeschlagene Branch + Cherry-Pick-Methode (von Midtiby vorgeschlagen) funktioniert auch, aber warum Wegwerf-Zweige erstellen, wenn Sie nicht brauchen.
  • commit-id muss nicht ein sha1 sein. Um alles vor dem letzten N-Commits zu schieben, verwenden Sie "HEAD ~ N" anstelle von commit-id.
+5

Dies sollte die akzeptierte Antwort sein. +1 danke. –

6
$ git push <remote name> <commit hash>:<remote branch name> 

# Example: 
$ git push origin 2dc2b7e393e6b712ef103eaac81050b9693395a4:master 
+2

bitte fügen Sie einige Kommentare mit Ihrer Antwort hinzu, die es leicht machen wird, ... –