Kiedy biegniesz git pull
po master
gałęzi, zwykle ciągnie origin/master
. Jestem w innej gałęzi o nazwie newbranch
, ale muszę uruchomić polecenie, które wykonuje polecenie git pull
od origin/master
do, master
ale nie mogę uruchomić git checkout
zmiany wybranej gałęzi, dopóki nie zakończy się ściąganie. Czy jest na to sposób?
Aby dać trochę informacji, repozytorium przechowuje witrynę internetową. Dokonałem pewnych zmian newbranch
i wdrożyłem je, przełączając witrynę na newbranch
. Teraz te zmiany zostały włączone do master
gałęzi, próbuję również przełączyć witrynę z powrotem do master
gałęzi. W tym momencie, newbranch
i origin/master
są identyczne, ale master
pozostaje w tyle origin/master
i musi zostać zaktualizowana. Problem w tym, że jeśli robię to w tradycyjny sposób:
$ git checkout master
# Uh oh, production website has now reverted back to old version in master
$ git pull
# Website is now up to date again
Muszę osiągnąć to samo, co powyżej ( git checkout master && git pull
), ale bez zmiany katalogu roboczego na wcześniejszą wersję podczas procesu.
źródło
newbranch
środku i nie ma tam nic do ukrycia!git fetch; git merge origin/master
od wewnątrznewbranch
. Sklonowanie całej drugiej kopii repozytorium nie przynosi żadnych korzyści.Odpowiedzi:
Masz drzewo robocze, którego nie chcesz dotykać, więc użyj innego. Clone jest tani, jest do tego stworzony.
Problem ze wszystkimi innymi odpowiedziami tutaj polega na tym, że w rzeczywistości nie pociągają one za sobą. Jeśli potrzebujesz skonfigurowanego łączenia lub ponownego bazowania, potrzebujesz innego drzewa roboczego i powyższej procedury. W przeciwnym razie po prostu
git fetch; git checkout -B master origin/master
zrobi.źródło
git checkout master
wyewidencjonujesz starąmaster
gałąź, ponieważ nie zrobiłeśgit pull
wmain
folderze synchronizacji z origin / master. To jest to, czego staram się uniknąć.master
powrotem doorigin
, ale nie sądzę, aby Twoje ostateczne pobranie było takie zaktualizowanemaster
. Nie magit pull
potrzeby aktualizowaniamaster
gałęzi wmain
katalogu, więc jeśli czegoś mi brakuje, twoje polecenia nie różnią się od zwykłego uruchamianiagit checkout master
i pobierania staregomaster
drzewa. Jeśli przyjrzysz się uważnie, nie uruchamiasz żadnych poleceń wmain
katalogu, które komunikują się z nadrzędnym strumieniem (z wyjątkiem linii 1, która jest uruchamiana przed wprowadzeniem jakichkolwiek zmian w repozytorium).Prosta: Aktualizacja z odległego oddziału do chwili obecnej nie sprawdził-out oddziału kapitana :
gdzie origin jest twoim pilotem i aktualnie jesteś sprawdzany w jakiejś gałęzi, np . dev .
Jeśli chcesz zaktualizować swój obecny oddział oprócz określonego oddziału za jednym razem:
źródło
Odpowiedź na to pytanie znajduje się tutaj: Scal, aktualizuj i ściągaj gałęzie Git bez korzystania z płatności
źródło
git fetch origin master:master
.git fetch
samo w sobie zakładałoby, że zamierzasz zaktualizować bieżącą gałąź, a nie inną gałąź.Jak się okazuje, odpowiedź jest zwodniczo prosta:
To pozwala na aktualizację
master
oddział bez przełączania do niego, aż po to został zaktualizowany.źródło
Martwisz się czymś, czego nie można naprawić, ponieważ operacje Git nie są atomowe. Zawsze będziesz mieć dziurę, w której twój katalog roboczy jest w połowie drogi między gałęziami, nawet jeśli zaktualizujesz master bez wcześniejszego przełączenia się na niego. Dlatego Git nie jest narzędziem do wdrażania .
Ponieważ w rzeczywistości nie zatwierdzasz kodu w swoim środowisku produkcyjnym (mam nadzieję), nie musisz w rzeczywistości sprawdzać gałęzi. Możesz po prostu zrobić a,
git fetch
aby zaktualizować swoje zdalne referencje, a następniegit checkout origin/master
przenieść katalog roboczy bezpośrednio do zatwierdzenia aktualnie wskazywanego przezorigin/master
. To wprowadzi cię w stan odłączonej głowy, ale znowu, ponieważ nie wprowadzasz kodu, to nie ma znaczenia.To jest najmniejsza dziura, którą dostaniesz, ale jak powiedziałem, dziura nadal istnieje;
checkout
nie jest atomowy.źródło
origin/master
ale to może po prostu załatwić sprawę.git fetch
zanim zrobisz cokolwiek innego i wyeliminuj rzeczywisty transfer danych.Możesz użyć do tego update-ref:
Zauważ, że spowodowałoby to odrzucenie wszelkich lokalnych zatwierdzeń w gałęzi master. W twoim przypadku ich nie będzie, więc to jest w porządku. Dla innych osób, które próbują to zrobić, gdy są lokalne zatwierdzenia, nie sądzę, aby było to możliwe, ponieważ scalanie można uruchomić tylko w bieżącej gałęzi.
źródło
git branch --force master origin/master
? To zmusza lokalną głowęmaster
do wskazywania na głowęorigin
smaster
Rozwiązanie Malvineous działa dla mnie
Po prostu podaj błąd
Więc uruchamiam z opcją -D
dzięki
źródło
git fetch origin master:master
master
.master
, które nie zostały jeszcze przesłane,origin/master
zostanie scalony z Twoim mistrzem.źródło