Angenommen, ich habe 5 lokale Commits. Ich möchte nur zwei davon in ein zentrales Repo verschieben (mithilfe eines SVN-ähnlichen Workflows). Wie mache ich das?
Das hat nicht funktioniert:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
Das führt dazu, dass alle 5 lokalen Commits verschoben werden.
Ich nehme an, ich könnte git zurücksetzen, um meine Commits tatsächlich rückgängig zu machen, gefolgt von git stash und dann git push - aber ich habe bereits Commit-Nachrichten geschrieben und Dateien organisiert und möchte sie nicht wiederholen.
Mein Gefühl ist, dass eine Flagge, die zum Drücken oder Zurücksetzen übergeben wurde, funktionieren würde.
Wenn es hilft, hier ist meine Git-Konfiguration
[ramanujan:~/myrepo/.git]$cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://server/git/myrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
quelle
master~3
. Jeder Verweis auf das gewünschte Commit "bis zu" ist gleichermaßen gültig, z. B.HEAD~3
oderHEAD~~~
oder die spezifische SHA oder ein Tag, das das Commit kennzeichnet.git push
...)master
für die entfernte Seite der refspec angeben, wiegit push origin tocommit:newbramch
Ich arbeite an einer lokalen Niederlassung namens "Arbeit". Dieser Zweig enthält alle temporären Commits (wie Problemumgehungen oder private Build-Optionen oder was auch immer), die ich nicht in das Upstream-Repository übertragen möchte. Ich arbeite an diesem Zweig. Wenn ich dann einen Commit durchführen möchte, wechsle ich zum Master-Zweig, wähle die entsprechenden Commits aus, die ich festschreiben möchte, und drücke dann den Master.
Nachdem ich Änderungen vom Upstream in meinen Hauptzweig gezogen habe, haben ich
git checkout work
undgit rebase master
. Das schreibt alle meine lokalen Änderungen neu, um am Ende der Geschichte zu sein.Ich verwende
git svn
diesen Workflow tatsächlich , daher umfasst meine "Push" -Operationgit svn dcommit
. Ich benutze auchtig
einen netten GUI-Repository-Viewer im Textmodus, um die entsprechenden Commits für den Master auszuwählen.quelle
work
Zweig zu erstellen . Anschließend führen Sie bestimmte Zweige zusammen,master
damit Sie nicht den Verlauf verlieren. Wenn Sie mit arbeitenwork
, führen Sie alle Ihre Zweige darin zusammen. Es ist mehr Aufwand, aber es könnte sich in einigen Fällen lohnen.Standardmäßig werden mit git-push alle Zweige verschoben. Wenn Sie dies tun:
Sie wechseln zu einem getrennten HEAD (Sie befinden sich nicht in einem Zweig) und übertragen dann alle Zweige, einschließlich des lokalen Masters (der sich noch dort befindet), zum Remote-Master.
Die manuelle Lösung lautet:
Wenn Sie das Standardverhalten beim Verschieben aller Zweige verwirrend (und gefährlich!) Finden, fügen Sie dies zu Ihrer ~ / .gitconfig hinzu:
Dann wird nur der Zweig gedrückt, auf dem Sie sich befinden. In Ihrem Beispiel (ein abgenommener Kopf) hätten Sie diese Fehlermeldung erhalten, anstatt versehentlich die falschen Commits zu drücken:
quelle
Kurze Antwort:
git push <latest commit SHA1 until you want commits to be pushed>
Beispiele:
git push fc47b2
git push HEAD~2
Lange Antwort:
Commits sind als Kette mit einem Eltern / Kind-Mechanismus verbunden. Durch das Drücken eines Commits werden also auch alle übergeordneten Commits zu diesem Commit verschoben, die der Remote nicht bekannt waren. Dies geschieht implizit, wenn Sie
git push
das aktuelle Commit ausführen: Alle vorherigen Commits werden ebenfalls gepusht, da dieser Befehl äquivalent zu istgit push HEAD
.So könnte die Frage in Wie man ein bestimmtes Commit pusht, umgeschrieben werden , und dieses spezifische Commit könnte beispielsweise HEAD ~ 2 sein.
Wenn die Commits, die Sie pushen möchten, nicht aufeinander folgen, ordnen Sie sie einfach mit einem
git rebase -i
vor dem jeweiligen Push neu an .quelle
1) Verwenden Sie "git rebase", um Ihre Commits neu zu ordnen, wenn Sie möchten.
Dieser Befehl zeigt so etwas in Ihrem Editor an (ich verwende vim).
2) Ordnen Sie Ihre Commits nach Ihrer Wahl durch einfaches Ausschneiden und Einfügen neu an. Angenommen, die neue Bestellung lautet
Wählen Sie 9781434 commitE
Wählen Sie c3d4961 commitC
Wählen Sie 4791291 commitA
Wählen Sie aa1cefc commitD
Wählen Sie a2bdfbd commitB
Nehmen Sie diese Änderungen in Ihrem Editor vor und drücken Sie Strg + O (writeOut).
Oder Sie können auch verwenden
Sie können die neue Sequenz mit überprüfen
3) Jetzt verwenden
Wenn nur ein Zweig entfernt (Ursprung) und einer lokal (Master) ist, verwenden Sie einfach
Dies wird commitB und commitD drücken.
quelle