Mam repozytorium git z 2 gałęziami: master i test.
Istnieją różnice między gałęziami master i testowymi.
W obu oddziałach wprowadzono wszystkie zmiany.
Jeśli zrobię:
Git Checkout Master
test git diff
Pojawi się ekran pełen zmian pokazujący różnice. Chcę scalić zmiany w gałęzi testowej, a więc:
test scalania git
Ale dostań komunikat „Już aktualny”
Jednak przeglądanie plików w każdej gałęzi wyraźnie pokazuje różnice.
Na czym polega problem i jak go rozwiązać?
Odpowiedzi:
Komunikat „Już aktualny” oznacza, że wszystkie zmiany z gałęzi, którą próbujesz scalić, zostały już scalone z gałęzią, w której aktualnie się znajdujesz. Mówiąc dokładniej, oznacza to, że gałąź, którą próbujesz scalić, jest rodzicem twojej bieżącej gałęzi . Gratulacje, to najłatwiejsze połączenie, jakie kiedykolwiek wykonałeś. :)
Użyj,
gitk
aby przejrzeć swoje repozytorium. Etykieta gałęzi „test” powinna znajdować się gdzieś poniżej etykiety gałęzi „master”.Twój oddział jest aktualny w stosunku do swojego rodzica. Według scalenia nie ma żadnych nowych zmian w rodzicu od ostatniego scalenia. To nie znaczy, że gałęzie są takie same, ponieważ możesz wprowadzić wiele zmian w działającej gałęzi i brzmi to tak jak Ty.
Edytuj 10/12/2019:
Według Charlesa Drake'a w komentarzu do tej odpowiedzi jednym z rozwiązań tego problemu jest:
Powoduje to powrót do poziomu „testowego”.
Następnie wykonaj:
w celu wymuszenia zmian z powrotem do centralnego repozytorium.
źródło
Zdarza mi się to często, gdy wiem, że w zdalnym systemie głównym wprowadzono zmiany, więc próbuję je scalić za pomocą
git merge master
. Nie łączy się to jednak ze zdalnym urządzeniem głównym, ale z lokalnym urządzeniem głównym.Więc przed wykonaniem scalenia, sprawdź kasę, a potem
git pull
tam. Następnie będziesz mógł scalić nowe zmiany w swoim oddziale.źródło
git fetch
że zaktualizuje gałąź master, nawet jeśli obecnie używam innej. Okazuje się, że nie. Dzięki! Jestem prawie pewien, że istnieje opcja,fetch
która pozwala określić, którą gałąź należy pobrać.git fetch --all
, ale to tylko pobiera gałęzie, ale ich nie ciągnie.git fetch --all && git merge origin/master
. Nie trzeba aktualizować lokalnego,master
aby scalić zdalne zmiany.git merge master
1 zgit merge origin/master
. Sprawdziłem równieżmaster
igit pull
przed aktualizacją 2 oddziałów. mimo że dzielili tę samą zawartość, utworzenie PR między 2 gałęziami pokazało kilka plików różnic. Naprawiłemgit pull
gałąź docelową w gałęzi funkcji, która pokazała:Already up to date! Merge made by the 'recursive' strategy.
spowodowało to zatwierdzenie scalania bez zmian, ale usunąłem nieoczekiwane pliki różnic z PR. jakiś pomysł, dlaczego istnieje różnica między łączeniem „równoważnych” lokalnych i zdalnych gałęzi?Załóżmy, że masz oddział
master
z następującą historią zatwierdzeń:Teraz tworzysz test gałęzi, pracujesz nad nim i wykonujesz 4 zatwierdzenia:
master
głowa wskazuje na D, atest
głowa wskazuje na H.Komunikat „Już aktualne” pojawia się, gdy HEAD gałęzi, z którą się łączysz, jest rodzicem łańcucha zatwierdzeń gałęzi, którą chcesz scalić. Tak jest w tym przypadku:
D
jest rodzicemE
.Nie ma nic do seryjnej od
test
celumaster
, ponieważ nic się nie zmieniło namaster
odtąd. To, co chcesz tutaj zrobić, to dosłownie powiedzieć Gitowi, aby miałmaster
głowę wskazującą na H, więc gałąź mistrza ma następującą historię zatwierdzeń:To jest zadanie dla polecenia Git
reset
. Chcesz również, aby katalog roboczy odzwierciedlał tę zmianę, więc wykonasz twardy reset:źródło
git reset --hard
jest dość drastyczne, czy może stracić zobowiązania? Czy istnieje bezpieczniejszy sposób na dokonanie tych zmian, czy też niebezpieczeństwo jestgit reset --hard
zawyżone?--hard
opcji, jest fakt, że faktycznie modyfikuje ona katalog roboczy, w wyniku czego tracisz nieproszone zmiany. Osobiście wykonujęgit status
przed i po każdym ręcznie uruchamianym poleceniu git, aby upewnić się, że moje repo jest czyste lub w oczekiwanym stanie.--hard
? Byłem w tej sytuacji kilka razy i zawsze resetuję bez--hard
. Działało dobrze bez ryzyka utraty jakichkolwiek nieprzyjętych zmian.Co dla mnie działa, powiedzmy, że masz oddział1 i chcesz połączyć go w oddział2.
Otwórz wiersz polecenia git, przejdź do folderu głównego oddziału2 i wpisz:
Jeśli masz konflikty, nie musisz wykonywać git push, ale najpierw rozwiąż konflikty, a następnie push.
źródło
Powinno to oznaczać, że zatwierdzenia w teście są już połączone w master, ale ponieważ inne zatwierdzenia są wykonywane w master,
git diff test
nadal dawałyby pewne różnice.źródło
Dzieje się tak, ponieważ lokalna kopia oddziału, który chcesz scalić, jest nieaktualna. Mam swój oddział, nazywany
MyBranch
i chcę go połączyćProjectMaster
.Ale wiem , że są zmiany, które należy połączyć!
Oto, kiedy piszę
git merge ProjectMaster
, git patrzy na moją lokalną kopię tego oddziału, która może nie być aktualna . Aby zobaczyć, czy tak jest, najpierw mówię Gitowi, aby sprawdził, czy moje oddziały są nieaktualne, i jeśli to możliwe, przyjął wszelkie zmiany, używającfetch
. Następnie wskakuję do gałęzi, którą chcę scalić, aby zobaczyć, co się tam dzieje ...Ah-ha! Moja lokalna kopia jest nieaktualna przez 85 zatwierdzeń, co wyjaśnia wszystko! Teraz
Pull
zapisuję zmiany, których mi brakuje, a następnie przeskakuję doMyBranch
i ponownie próbuję scalić.A teraz mam inny problem do rozwiązania ...
źródło
Stało się tak, ponieważ dziwnie GIT myślał, że lokalny oddział różni się od zdalnego. Było to widoczne na wykresie gałęzi: wyświetlało dwie różne gałęzie: piloty / pochodzenie / nazwę gałęzi i nazwę gałęzi.
Rozwiązaniem było po prostu usunięcie lokalnego repozytorium i ponowne sklonowanie go ze zdalnego. W ten sposób GIT zrozumiałby, że piloty / pochodzenie / nazwa_gałęzi> i nazwa_gałęzi są rzeczywiście takie same i mógłbym wydać
git merge branch_name
.źródło
git merge origin/master
zamiast tegogit merge master
pracował dla mnie. Aby połączyć master z gałęzią funkcji, możesz użyć:źródło
Pamiętaj, aby najpierw pobrać gałąź, którą chcesz scalić, a następnie ją pobrać (aby wersja lokalna pasowała do wersji zdalnej).
Następnie wróć do swojej gałęzi, na której chcesz wykonać scalanie, a scalanie git powinno działać.
źródło
git pull
przydarzyło mi się i zostałem wysłany na tę stronę, nie jestem pewien, czy mam ten sam scenariusz, ale to ja próbowałem „ponownie połączyć” tę gałąź „testową”.
Więc wcześniej go połączyłem, ale celowo wykluczam pewne konkretne zmiany podczas tego scalania, więc wyraźnie różni się między gałęziami. Próbowałem następnie połączyć ponownie, ponieważ zdaję sobie sprawę / zapomniałem, że powinienem i chciałem dodać konkretną zmianę / plik, który wcześniej wykluczyłem, i miałem nadzieję, że jeśli ponownie dokonam scalenia, pokażą wszystkie zmiany, które wcześniej wykluczyłem , ale się myliłem i zamiast tego pojawia się komunikat „Już aktualny”.
Po przeczytaniu komentarza / odpowiedzi @ Bombe ma rację i myślę, że tak się zachowuje, więc zrobiłem twardą kopię zapasową plików w gałęzi testowej, a następnie sprawdziłem gałąź główną i ręcznie wkleiłem do niej pliki i zatwierdziłem to tak, jakby to były nowe zmiany.
nie jestem pewien, czy jest to właściwy sposób, czy może pomóc innym, którzy mają ten sam problem, ale zapewniło rozwiązanie mojej konkretnej sprawy.
źródło
git checkout srcBranch -- path/to/file
. Może również używać globów plików.checkout srcBranch -- *
Jeśli połączenie gałęzi A z gałęzią B zgłasza komunikat „Już aktualne”, odwrotność nie zawsze jest prawdą. Jest to prawdą tylko wtedy, gdy gałąź B jest potomkiem gałęzi A, w przeciwnym razie gałąź B może po prostu mieć zmiany, których nie ma w A.
Przykład:
W tym momencie scalanie A do B zgłasza „Już aktualne”, ale gałęzie są różne, ponieważ gałąź B ma aktualizacje od mastera, a gałąź A nie.
źródło
W obliczu tego scenariusza za pomocą Git Bash.
Nasze repozytorium ma wiele gałęzi, a każda gałąź ma inny cykl zatwierdzeń, a scalanie odbywa się raz na jakiś czas. Old_Branch został użyty jako element nadrzędny dla New_Branch
Old_Branch został zaktualizowany o kilka zmian, które wymagały połączenia z New_Branch
Używałem poniżej polecenia pull bez gałęzi, aby uzyskać wszystkie źródła ze wszystkich gałęzi.
O dziwo, nie wyciąga to wszystkich zmian z wszystkich gałęzi. Myślałem, że tak, jak wskazano pokazuje prawie wszystkie gałęzie i tagi.
Aby to naprawić, sprawdziłem, że Old_Branch ściągnął najnowszą wersję
Teraz sprawdzony New_Branch
Wyciągnąłem to dla pewności
I altówka dostała konflikty do rozwiązania ze Old_Branch do New_Branch :), czego oczekiwano
źródło
To samo mi się przydarzyło. Ale scenariusz był nieco inny, miałem gałąź master i wykułem z niej wydanie_1 (powiedzmy). Dokonałem pewnych zmian w gałęzi release_1 i połączyłem ją w pochodzenie. potem zrobiłem ssh i na zdalnym serwerze ponownie wyewidencjonowałem release_1 za pomocą polecenia git checkout -b release_1 - który faktycznie wykonuje nową gałąź release_! od głównego, zamiast sprawdzania już istniejącej gałęzi release_1 od początku. Rozwiązano problem, usuwając przełącznik „-b”
źródło
Miałem ten sam problem. Miałem zmiany w pilocie, który wciąż wyświetlał komunikat „Już aktualny”. Ponowne klonowanie repozytorium naprawiło problem.
źródło
Głupie, ale może się zdarzyć. Załóżmy, że nazwa twojej gałęzi jest poprzedzona odniesieniem do problemu (na przykład
#91-fix-html-markup
), jeśli wykonasz następujące scalenie:nie będzie działać zgodnie z przeznaczeniem, ponieważ wszystko po nim
#
jest ignorowane, ponieważ#
rozpoczyna się wstawianie komentarza.W tym przypadku można zmienić nazwę pominięciem oddziału
#
lub użyj apostrofów otoczyć nazwę oddziału:git merge '#91-fix-html-markup'
.źródło