Załóżmy, że mam 5 lokalnych zatwierdzeń. Chcę przesłać tylko 2 z nich do scentralizowanego repozytorium (przy użyciu przepływu pracy w stylu SVN). Jak mam to zrobic?
To nie zadziałało:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
To kończy się wypchnięciem wszystkich 5 lokalnych zatwierdzeń.
Przypuszczam, że mógłbym zrobić reset git, aby faktycznie cofnąć moje zatwierdzenia, a następnie git stash, a następnie git push - ale mam już napisane komunikaty o zatwierdzeniach i uporządkowane pliki i nie chcę ich powtarzać.
Mam wrażenie, że zadziała jakaś flaga przekazana do naciśnięcia lub zresetowania.
Jeśli to pomoże, oto moja konfiguracja git
[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
źródło
master~3
. Każde odniesienie do żądanego zatwierdzenia „do” jest równie ważne, na przykładHEAD~3
lubHEAD~~~
, określony SHA lub znacznik, który oznacza to zatwierdzenie.git push
...)master
dla odległej strony refspec, na przykładgit push origin tocommit:newbramch
Pracuję w lokalnym oddziale o nazwie „praca”. Ta gałąź zawiera wszystkie tymczasowe zatwierdzenia (takie jak obejścia, prywatne opcje kompilacji lub cokolwiek innego), których nie zamierzam wypychać do repozytorium nadrzędnego. Pracuję nad tą gałęzią, a kiedy chcę zatwierdzić, przełączam się na gałąź główną, wybieram odpowiednie zatwierdzenia, które chcę zatwierdzić, a następnie wciskam master.
Po ściągnięciu zmian z upstream do mojej gałęzi master, ja
git checkout work
igit rebase master
. To przepisuje wszystkie moje lokalne zmiany na koniec historii.Właściwie używam
git svn
tego przepływu pracy, więc moja operacja „wypychania” obejmujegit svn dcommit
. Używam równieżtig
przyjemnej przeglądarki repozytorium GUI w trybie tekstowym, aby wybrać odpowiednie commity do opanowania.źródło
work
gałęzi. Następnie scalasz określone gałęzie w,master
aby nie stracić historii. Podczas pracywork
scalasz w nią wszystkie swoje gałęzie. Jest to bardziej kosztowne, ale w niektórych przypadkach może być tego warte.Domyślnie git-push wypycha wszystkie gałęzie. Kiedy to robisz:
Przechodzisz do odłączonej HEAD (nie jesteś na żadnej gałęzi), a następnie wypychasz wszystkie gałęzie, w tym lokalny master (który wciąż jest tam, gdzie był) do zdalnego mastera.
Rozwiązanie ręczne to:
Jeśli uważasz, że domyślne zachowanie wypychania wszystkich gałęzi jest mylące (i niebezpieczne!), Dodaj to do swojego ~ / .gitconfig:
Wtedy tylko gałąź, na której się znajdujesz, jest przesuwana. W twoim przykładzie (odłączona głowa) otrzymałeś ten komunikat o błędzie, zamiast przypadkowo wciskać niewłaściwe zatwierdzenia:
źródło
Krótka odpowiedź:
git push <latest commit SHA1 until you want commits to be pushed>
Przykłady:
git push fc47b2
git push HEAD~2
Długa odpowiedź:
Zatwierdzenia są połączone w łańcuch z mechanizmem nadrzędnym / potomnym. Zatem wypychanie zatwierdzenia faktycznie wypycha również wszystkie zatwierdzenia rodzica do tego zatwierdzenia, które nie były znane użytkownikowi zdalnemu. Jest to robione niejawnie, gdy wykonujesz
git push
bieżące zatwierdzenie: wszystkie poprzednie zatwierdzenia również są wypychane, ponieważ to polecenie jest równoważnegit push HEAD
.Więc pytanie może zostać przepisane do Jak przekazać określone zatwierdzenie, a tym konkretnym zatwierdzeniem może być na przykład HEAD ~ 2.
Jeśli zatwierdzenia, które chcesz wypchnąć, nie następują po sobie, po prostu zmień ich kolejność, dodając
git rebase -i
przed konkretnym push .źródło
1) Użyj "git rebase", aby zmienić kolejność zatwierdzeń, jeśli chcesz.
To polecenie wyświetli coś takiego w twoim edytorze (używam vim)
2) Zmień kolejność zatwierdzeń zgodnie z własnym wyborem za pomocą prostej wycinanej wklejanej. Załóżmy, że nowy porządek to
wybierz 9781434 zatwierdzić
wybierz c3d4961 commitC
wybierz 4791291 commitA
wybierz aa1cefc commitD
wybierz a2bdfbd commitB
Wprowadź te zmiany w swoim edytorze i naciśnij ctrl + O (writeOut)
Możesz też użyć
Możesz sprawdzić nową sekwencję za pomocą
3) Teraz użyj
Jeśli tylko jedna gałąź na zdalnym (źródle) i jedna na lokalnym (główna), po prostu użyj
Spowoduje to wypchnięcie commitB i commitD.
źródło