gałąź master i' origin/master 'zostały rozdzielone, jak "rozdzielić ' gałęzie'?
Jakoś moja master
i moja origin/master
gałąź się rozeszły.
Nie chcę, żeby się rozeszły.
Jak mogę zobaczyć te różnice i połączyć je ?
15 answers
Możesz przejrzeć różnice za pomocą:
git log HEAD..origin/master
Before pulling it (fetch + merge) (Zobacz także " Jak sprawić, by git zawsze ściągał z konkretnej gałęzi?")
Gdy masz wiadomość typu:
"twoja gałąź i' origin / master ' różnią się od siebie, # i mają odpowiednio 1 i 1 różne commity."
, sprawdź czy musisz zaktualizować origin
. Jeśli {[7] } jest aktualne, to niektóre commity zostały zepchnięte do origin
z innego repo, podczas gdy tworzyłeś własne commity lokalnie.
... o ---- o ---- A ---- B origin/master (upstream work)
\
C master (your work)
Oparłeś commit C na commicie A, ponieważ była to najnowsza praca, którą w tym czasie pobrałeś z źródła.
Jednak zanim próbowałeś wrócić do origin, ktoś inny popchnął commita B.]} Historia rozwoju rozeszła się po osobnych ścieżkach.Można następnie scalić lub rebase. Zobacz Pro Git: Git Branching-Rebasing dla szczegóły.
Merge
Użyj polecenia git merge:
$ git merge origin/master
To mówi Gitowi, aby zintegrował zmiany z origin/master
do twojej pracy i stworzył commit scalający.
Wykres historii wygląda teraz tak:
... o ---- o ---- A ---- B origin/master (upstream work)
\ \
C ---- M master (your work)
Nowe merge, commit M, ma dwoje rodziców, z których każdy reprezentuje jedną ścieżkę rozwoju, która doprowadziła do zawartości przechowywanej w tym commicie.
Zauważ, że historia ZA M jest teraz nieliniowa.
Rebase
Użyj polecenia git rebase:
$ git rebase origin/master
To mówi Gitowi, aby odtworzył commit C (Twoją pracę) tak, jakbyś oparł ją na commicie B zamiast A.
Użytkownicy CVS i Subversion rutynowo zmieniają swoje lokalne zmiany na początku pracy, gdy aktualizują je przed zatwierdzeniem.
Git po prostu dodaje wyraźne oddzielenie pomiędzy krokami commit i rebase.
Wykres historii wygląda teraz tak:
... o ---- o ---- A ---- B origin/master (upstream work)
\
C' master (your work)
Commit C ' jest nowym commit utworzony przez polecenie Git rebase.
Różni się od C na dwa sposoby:
- ma inną historię: B zamiast A.
- jego zawartość odpowiada zmianom zarówno w B, jak i C; jest taka sama jak M z przykładu merge.
Zauważ, że historia za C ' jest nadal liniowa.
Postanowiliśmy (na razie) zezwolić tylko na historię liniową w cmake.org/cmake.git
.
Takie podejście zachowuje dotychczasowy przepływ pracy oparty na CVS i może ułatwić Przejście.
Próba wciśnięcia C' do naszego repozytorium będzie działać (zakładając, że masz uprawnienia i nikt nie pchnął podczas rebasingu).
Polecenie git pull zapewnia skrócony sposób pobierania z origin i rebase lokalnej pracy na nim:
$ git pull --rebase
Łączy powyższe kroki fetch i rebase w jedno polecenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 03:57:00
Miałem to i jestem zdumiony, co spowodowało to, nawet po przeczytaniu powyższych odpowiedzi. Moim rozwiązaniem było zrobić
git reset --hard origin/master
To po prostu resetuje moją (lokalną) kopię master (która, jak zakładam, jest schrzaniona) do właściwego punktu, reprezentowanego przez (zdalny) origin/master.
Uwaga : stracisz wszystkie zmiany, które nie zostały jeszcze wprowadzone do
origin/master
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-22 17:59:11
git pull --rebase origin/master
Jest pojedynczym poleceniem, które może Ci pomóc przez większość czasu.
Edit: pobiera commity z origin/master i stosuje twoje zmiany do nowo pobranej historii gałęzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 12:58:08
Znalazłem się w tej sytuacji, kiedy próbowałemrebase gałęzi, która śledziła zdalną gałąź, i próbowałem rebase go na master. W tym scenariuszu, jeśli spróbujesz rebase, najprawdopodobniej znajdziesz swoją gałąź rozbieżną i może to spowodować bałagan, który nie jest dla Git nubees!
Powiedzmy, że jesteś na gałęzi my_remote_tracking_branch, która została rozgałęziona od master
$ git status
# na gałęzi my_remote_tracking_branch
Nothing to commit (working directory clean)
A teraz próbujesz rebase z master jako:
Przestań i oszczędź sobie kłopotów! Zamiast tego użyj merge jako:Git rebase master
Git merge master
Tak, skończysz z dodatkowymi commitami na swojej gałęzi. Ale jeśli nie jesteś gotowy na" nierozróżniające się " gałęzie, będzie to znacznie płynniejszy przepływ pracy niż rebasing. Zobacz ten blog o wiele bardziej szczegółowe wyjaśnienie.
Na z drugiej strony, jeśli twoja gałąź jest tylko lokalną gałęzią (tzn. nie jest jeszcze wciśnięta do żadnego pilota), zdecydowanie powinieneś zrobić rebase (i twoja gałąź nie będzie rozbiegać się w tym przypadku).
Teraz jeśli czytasz to, ponieważ już Jesteś w" rozbieżnym "scenariuszu z powodu takiego rebase' u, możesz wrócić do ostatniego commita z origin (tj. w stanie nierozróżniającym się) używając:
Git reset --hard origin / my_remote_tracking_branch
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
W moim przypadku oto, co zrobiłem, aby spowodować rozbieżne wiadomość: zrobiłem git push
, ale potem zrobiłem git commit --amend
, aby dodać coś do wiadomości commit. Potem zrobiłem jeszcze jedno zobowiązanie.
Więc w moim przypadku oznaczało to po prostu pochodzenie / master był Nieaktualny. Ponieważ wiedziałem, że nikt inny nie dotyka origin / master, poprawka była trywialna: git push -f
(Gdzie -f
oznacza siłę)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-23 03:03:45
W moim przypadku przesunąłem zmiany na origin/master
, a potem zdałem sobie sprawę, że nie powinienem był tego robić: - (skomplikował to fakt, że lokalne zmiany były w poddrzewie. Wróciłem więc do ostatniego dobrego commita przed" złymi " lokalnymi zmianami (używając SourceTree) i otrzymałem "komunikat dywergencji".
Po naprawieniu mojego bałaganu lokalnie (szczegóły nie są tutaj ważne) chciałem "cofnąć się w czasie" do zdalnej gałęzi origin/master
tak, aby znów była zsynchronizowana z lokalną master
. Na rozwiązanie w moim przypadku było:
git push origin master -f
Zwróć uwagę na przełącznik -f
(force). To usunęło "złe zmiany", które zostały przez pomyłkę przesunięte do origin/master
i teraz lokalne i zdalne gałęzie są zsynchronizowane.
Należy pamiętać, że jest to potencjalnie destrukcyjna operacja, więc wykonaj ją tylko wtedy, gdy jesteś w 100% pewien, że" cofnięcie " zdalnego mistrza w czasie jest OK.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 08:58:44
Wiem, że jest tu wiele odpowiedzi, ale myślę, że git reset --soft HEAD~1
zasługuje na uwagę, ponieważ pozwala zachować zmiany w ostatnim lokalnym (nie pchanym) commicie podczas rozwiązywania rozbieżnego stanu. Myślę, że jest to bardziej wszechstronne rozwiązanie niż pull z rebase
, ponieważ lokalny commit może zostać przejrzany, a nawet przeniesiony do innej gałęzi.
Kluczem jest użycie --soft
, zamiast ostrego --hard
. Jeśli jest więcej niż 1 commit, powinna zadziałać odmiana HEAD~x
. Więc tutaj są wszystkie kroki, które rozwiązały moją sytuację (miałem 1 lokalny commit i 8 commitów w zdalnym):
1) git reset --soft HEAD~1
aby cofnąć lokalny commit. W następnych krokach użyłem interfejsu w SourceTree, ale myślę, że następujące polecenia również powinny działać:
2) git stash
do ukrycia zmian od 1). Teraz wszystkie zmiany są bezpieczne i nie ma już rozbieżności.
3) git pull
aby uzyskać zdalne zmiany.
4) git stash pop
lub git stash apply
, Aby zastosować ostatnią Ukryte zmiany, a następnie nowy commit, jeśli chcesz. Ten krok jest opcjonalny, wraz z 2), Kiedy chcesz kosza zmian w Local commit. Ponadto, jeśli chcesz przejść do innej gałęzi, ten krok powinien zostać wykonany po przejściu na żądaną.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 13:54:48
Aby zobaczyć różnice:
git difftool --dir-diff master origin/master
Wyświetli zmiany lub różnice między dwoma gałęziami. W araxis (Mój ulubiony) wyświetla go w stylu diff folderu. Pokazanie każdego ze zmienionych plików. Następnie mogę kliknąć plik, aby zobaczyć szczegóły zmian w pliku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 17:42:03
W moim przypadku było to spowodowane brakiem rozwiązania konfliktu.
Problem był spowodowany uruchomieniem komendy git pull
. Zmiany w pochodzeniu doprowadziły do konfliktów z moim lokalnym repo, które rozwiązałem. Nie popełniłem ich jednak. Rozwiązaniem w tym momencie jest zatwierdzenie zmian (git commit
rozwiązany plik)
Jeśli zmodyfikowałeś również niektóre pliki od czasu rozwiązania konfliktu, polecenie git status
wyświetli lokalne modyfikacje jako niestagowane lokalne modyfikacje i scalanie rozdzielczości jako modyfikacje lokalne. Można to właściwie rozwiązać, zatwierdzając zmiany od scalenia najpierw przez git commit
, a następnie dodając i zatwierdzając nieakceptowane zmiany jak zwykle(np. przez git commit -a
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 18:19:53
Naprawiłem to przenosząc do commit_sha że ostatni jest oddany do origin/master.
git reset --hard commit_sha
WARNING : stracisz wszystko, co zostało popełnione po zatwierdzeniu 'commit_sha'.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-28 11:41:26
Wolę robić to wygodniej i bezpieczniej.
# copying your commit(s) to separate branch
git checkout <last_sync_commit>
git checkout -b temp
git cherry-pick <last_local_commit>
git checkout master
git reset --soft HEAD~1 # or how many commits you have only on local machine
git stash # safer, can be avoided using hard resetting on the above line
git pull
git cherry-pick <last_local_commit>
# deleting temporary branch
git branch -D temp
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-01 12:42:12
Miałem ten sam komunikat, gdy próbowałem edytować ostatnią wiadomość commit, z już wypchniętego commita, używając: git commit --amend -m "New message"
Kiedy wcisnąłem zmiany używając git push --force-with-lease repo_name branch_name
nie było żadnych problemów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 15:55:11
Spotkałem się z tym problemem, gdy stworzyłem gałąź opartą na gałęzi a przez
git checkout -b a
A potem ustawiłem strumień gałęzi a na początek gałęzi B przez
git branch -u origin/B
Potem dostałem komunikat o błędzie powyżej.
Jednym ze sposobów rozwiązania tego problemu było:]}- Usuń gałąź a
- Utwórz nową gałąź b przez
git checkout -b b origin/B
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-10 07:16:37
Zastąp 123 liczbą commitów, które Twoja gałąź oddzieliła się od origin.
git reset HEAD~123 && git reset && git checkout . && git clean -fd && git pull
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-02 15:46:58
Git reset --soft origin / my_remote_tracking_branch
This way you will not loose your local changes
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-25 15:08:32