Zrobiłem sporo pracy („Twój oddział wyprzedza„ origin / master ”o 37 zatwierdzeń.)), Który naprawdę powinien był przejść do własnego oddziału, a nie do master
. Te zatwierdzenia istnieją tylko na mojej lokalnej maszynie i nie zostały zepchnięte na origin
, ale sytuacja jest nieco skomplikowana w tym sensie, że inni deweloperzy naciskali na origin/master
mnie i wyciągnąłem te zmiany.
Jak z mocą wsteczną przenieść moje 37 lokalnych zobowiązań do nowego oddziału? Na podstawie dokumentów wydaje się, że git rebase --onto my-new-branch master
lub ...origin/master
powinien to zrobić, ale oba dają mi błąd „fatalny: Potrzebowałem jednej wersji”. man git-rebase
nie mówi nic o zapewnieniu wersji, rebase
a jej przykłady tego nie robią, więc nie mam pojęcia, jak rozwiązać ten błąd.
(Zauważ, że nie jest to kopia Przenieś istniejącą, niezaangażowaną pracę do nowej gałęzi w Git lub Jak scalić moje lokalne niezatwierdzone zmiany w inną gałąź Git? Ponieważ te pytania dotyczą niezatwierdzonych zmian w lokalnym drzewie roboczym, a nie zmian, które mają został popełniony lokalnie.)
Odpowiedzi:
Powinno to być w porządku, ponieważ jeszcze nie wypchnąłeś swoich zobowiązań, i możesz później przepisać historię swojego oddziału
origin/master
. Najpierw uruchomiłbym,git fetch origin
aby upewnić się, żeorigin/master
jest aktualny. Zakładając, że jesteś obecnie włączonymaster
, powinieneś być w stanie:... który będzie odtworzyć wszystkich zatwierdzeń, które nie są w
origin/master
naorigin/master
. Domyślna akcja rebase polega na ignorowaniu zatwierdzeń scalania (np. Tych, któregit pull
prawdopodobnie wprowadziłeś) i po prostu spróbuje zastosować łatkę wprowadzoną przez każde z twoich zatwierdzeńorigin/master
. (Być może będziesz musiał rozwiązać niektóre konflikty po drodze.) Następnie możesz utworzyć nowy oddział na podstawie wyniku:... a następnie zresetuj
master
plecy doorigin/master
:Kiedy robię tego rodzaju manipulowanie gałęziami za pomocą
git branch
,git reset
itp., Często przydaje mi się przeglądanie wykresu zatwierdzeń za pomocągitk --all
lub podobnego narzędzia, tylko po to, aby sprawdzić, czy rozumiem, gdzie wskazują wszystkie różne referencje.Alternatywnie, mógłbyś właśnie utworzyć gałąź tematów w oparciu o to, gdzie jest twój master w pierwszej kolejności (
git branch new-work-including-merges
), a następnie zresetowaćmaster
jak powyżej. Ponieważ jednak gałąź tematu będzie zawierać scalenia,origin/master
a zmiany nie zostały jeszcze wprowadzone, sugeruję wykonanie zmiany bazy, aby historia była uporządkowana. (Ponadto, gdy w końcu scalisz gałąź tematu z powrotem do głównego, zmiany będą bardziej oczywiste).źródło
master
; rebase przepisujemaster
gałąź, tak aby nowe zatwierdzenia były liniowo na górzeorigin/master
, a następniegit branch new-work
tworzynew-work
gałąź wskazującą na wierzchołkumaster
(bieżącej gałęzi) bez przełączania bieżącej gałęzinew-work
. Więc teraznew-work
zawiera wszystkie nowe zmiany. Następnie reset powoduje przeniesienie bieżącej gałęzi (nadalmaster
) z powrotem doorigin/master
.git reset
wiele innych sposobów.git branch new-work
Jest tylko, że „utworzenie oddziału, wskazując na to popełnić podczas pozostaję na mojego obecnego oddziału (który jest mistrzem w tym przypadku).” Nie ma więc potrzeby posiadania polecenia, które przenosi zatwierdzenia z głównego do nowego oddziału - wystarczy utworzyć nowy oddział, a po zresetowaniu głównego nowy oddział pozostanie tam, gdzie był masterJeśli masz niską liczbę zatwierdzeń i nie obchodzi Cię, czy są one połączone w jeden mega-zatwierdzenie, działa to dobrze i nie jest tak przerażające, jak
git rebase
:wycofaj pliki z scen (zamień 1 na # zatwierdzeń)
utworzyć nowy oddział
dodaj zmiany
dokonać zatwierdzenia
źródło
git log --all --decorate --oneline --graph
.Utknąłem z tym samym problemem. Znalazłem najłatwiejsze rozwiązanie, którym lubię się dzielić.
1) Utwórz nowy oddział ze swoimi zmianami.
2) (Opcjonalnie) Wciśnij nowy kod oddziału na zdalnym serwerze.
3) Kasa z powrotem do oddziału głównego.
4) Zresetuj główny kod oddziału za pomocą zdalnego serwera i usuń zatwierdzenie lokalne.
źródło
Jeszcze jeden sposób zakłada, że gałąź 1 - jest gałąź z zatwierdzonymi zmianami gałąź 2 - jest gałąź pożądaną
wybierz identyfikatory zatwierdzenia, które chcesz przenieść
Teraz przywróć niepotrzebne zatwierdzenia z początkowej gałęzi
źródło
Alternatywnie, zaraz po zatwierdzeniu do niewłaściwej gałęzi, wykonaj następujące kroki:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
Mogę sobie wyobrazić, że istnieje prostsze podejście do kroków pierwszego i drugiego.
źródło
Co powiesz na:
git reset
powrót do ostatniego zatwierdzenia przed rozpoczęciem wprowadzania zmian.git pull
aby ponownie wyciągnąć tylko zdalne zmiany, które wyrzuciłeś za pomocą resetowania.Czy może to wybuchnie, gdy spróbujesz ponownie połączyć gałąź?
źródło
Oto o wiele prostszy sposób:
Utwórz nowy oddział
Na swoim nowym oddziale wykonaj
git merge master
- spowoduje to scalenie zatwierdzonych (nie wypchniętych) zmian do nowego oddziałuUsuń lokalną gałąź główną
git branch -D master
Użyj-D
zamiast zamiast,-d
ponieważ chcesz wymusić usunięcie gałęzi.Po prostu zrób
git fetch
na swoim głównym oddziale i zróbgit pull
na swoim głównym oddziale, aby upewnić się, że masz najnowszy kod zespołów.źródło
Prostsze podejście, którego użyłem (zakładając, że chcesz przenieść 4 zatwierdzenia):
(Zajrzyj do katalogu, z którego wykonałeś ostatnie polecenie dla 4
.patch
plików)Następnie:
W dowolnej kolejności.
źródło
Zamów świeżą kopię swoich źródeł
git clone ........
Zrób gałąź z pożądanej pozycji
git checkout {position}
git checkout -b {branch-name}
Dodaj zdalne repozytorium
git remote add shared ../{original sources location}.git
Uzyskaj zdalne źródła
git fetch shared
Zapłać żądany oddział
git checkout {branch-name}
Scal źródła
git merge shared/{original branch from shared repository}
źródło
Dla mnie był to najlepszy sposób:
git fetch
git branch my-changes
i przekaż zdalniegit master -u upstream-branch remotes/origin/my-changes
git branch master --set-upstream-to remotes/origin/master
źródło