git: Jak uzyskać najnowszą wersję mojego kodu?

200

Używam Git 1.7.4.1. Chcę pobrać najnowszą wersję mojego kodu z repozytorium, ale dostaję błędy ...

$ git pull
….
M   selenium/ant/build.properties
….
M   selenium/scripts/linux/get_latest_updates.sh
M   selenium/scripts/windows/start-selenium.bat
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>' as appropriate to mark resolution, or use 'git commit -a'.

Usunąłem lokalne kopie plików, na które narzeka narzędzie, ale nadal pojawiają się błędy. Jak sprawdzić najnowszą wersję ze zdalnego repozytorium? - Dave

Dave
źródło
1
@ Odpowiedź Kzqai poniżej pomogła mi: spróbuj zrobić git fetchnajpierw. Nie dostaję konfliktów, ale właśnie w ten sposób otrzymałem najnowszą wersję kodu.
Chris K

Odpowiedzi:

258

Jeśli nie przejmujesz się lokalnymi zmianami (w tym nieśledzonymi lub wygenerowanymi plikami lub pod-repozytoriami, które akurat tu są) i po prostu potrzebujesz kopii z repozytorium:

git reset --hard HEAD
git clean -xffd
git pull

Ponownie spowoduje to zniszczenie wszelkich zmian wprowadzonych lokalnie, więc używaj ich ostrożnie. Zastanów się, rm -Rfkiedy to robisz.

Alex Curtis
źródło
1
Próbowałem tych poleceń i nadal pojawia się błąd „CONFLICT (content): Merge konflikt in selenium / ant / build.xml” (między innymi). Chcę tylko zastąpić najnowszą wersję mojego pliku tym, co jest w repozytorium. Co mogę zrobić??
Dave
31
git clean -fnie jest tak naprawdę częścią odpowiedzi. Usunie pliki, które nie są przechowywane w repozytorium (np. W moim przypadku pliki dziennika); nie musisz tego robić, aby git pullznów zacząć działać, git reset --hard HEADwystarczy.
Darren Cook
12
Ech, stary, nie polecaj jednego z niewielu poleceń usuwania, aby uzyskać początkujących.
Kzqai,
6
@DarrenCook Myślę, że git clean -fjest to ważne, jeśli chcesz naprawdę posprzątać repozytorium. Jest to odpowiednik wykonania polecenia „Usuń wszystko z folderu -> Pobierz najnowszą wersję / Pobierz konkretną” w programie TFS iw moim przypadku tego właśnie chciałem.
RPDeshaies,
3
@Darren Myślę, że git clean -f`` jest również ważny. Chcę uzyskać najnowszą wersję i nie chcę przechowywać przestarzałych wpisów w pamięci podręcznej ani innych generowanych zasobów, których nie ma w repozytorium. Odpowiedź jest jasna na temat faktu, że usunie ona lokalną zmianę i naśladuje ostatnią wersję z repozytorium, więc dla mnie wygląda idealnie. Przenosiłbym moje pliki dziennika w inne miejsce, jeśli naprawdę muszę je przechowywać między aktualizacjami.
Balmipour,
231

Przypadek 1: Nie przejmuj się lokalnymi zmianami

  • Rozwiązanie 1: Pobierz najnowszy kod i zresetuj kod

    git fetch origin
    git reset --hard origin/[tag/branch/commit-id usually: master]
    
  • Rozwiązanie 2: Usuń folder i sklonuj ponownie: D

    rm -rf [project_folder]
    git clone [remote_repo]
    

Przypadek 2: Dbaj o lokalne zmiany

  • Rozwiązanie 1: brak konfliktów z nową wersją online

    git fetch origin
    git status
    

    zgłosi coś takiego:

    Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
    

    Następnie pobierz najnowszą wersję

    git pull
    
  • Rozwiązanie 2: koliduje z nową wersją online

    git fetch origin
    git status
    

    zgłosi coś takiego:

    error: Your local changes to the following files would be overwritten by merge:
        file_name
    Please, commit your changes or stash them before you can merge.
    Aborting
    

    Zatwierdź lokalne zmiany

    git add .
    git commit -m ‘Commit msg’
    

    Spróbuj uzyskać zmiany (nie powiedzie się)

    git pull
    

    zgłosi coś takiego:

    Pull is not possible because you have unmerged files.
    Please, fix them up in the work tree, and then use 'git add/rm <file>'
    as appropriate to mark resolution, or use 'git commit -a'.
    

    Otwórz plik konfliktu i napraw konflikt. Następnie:

    git add .
    git commit -m ‘Fix conflicts’
    git pull
    

    zgłosi coś takiego:

    Already up-to-date.
    

Więcej informacji: Jak użyć „git reset --hard HEAD”, aby powrócić do poprzedniego zatwierdzenia?

tvl
źródło
@ tvl.Jak mogę uzyskać najnowsze aktualizacje bez popełniania mojego kodu (konflikty) do oddziału .. proszę o pomoc
user3354457
@ user3354457 xm, ciekawe pytanie. Nigdy wcześniej tego nie próbowałem, ale możesz spróbować i zgłoś się;) więc: - Zrób łatkę ze zmianami: git diff> unommited-changes.patch - Zresetuj gałąź - ściągnij zmiany - zastosuj łatkę
tvl
3
Ta odpowiedź zasługuje na znacznie więcej głosów pozytywnych niż ta, która została zaakceptowana jako odpowiedź.
James
@James :) Cieszę się, że moja odpowiedź ci pomoże. Wskazówka: spróbuj napisać dokumentację, tak jakbyś nic nie wiedział o temacie, a na pewno gadatliwość pomoże ci wrócić.
tvl
4
Najlepsza pełna odpowiedź na git fetch. Ten post powinien być zamknięty
Callat
17

Podejrzewam, że mogło się zdarzyć, że usunąłeś zmodyfikowane pliki (ponieważ nie przejmowałeś się tymi zmianami), a teraz git przyjmuje zmianę za zmianę.

Oto podejście, które przenosi zmiany z kopii roboczej do „skrytki” (możliwe do odzyskania, jeśli rzeczywiście okaże się, że kiedykolwiek będziesz ich potrzebować), dzięki czemu możesz pobrać najnowsze zmiany z góry.

git stash  
git pull

Jeśli kiedykolwiek chcesz odzyskać swoje pliki (potencjalne konflikty z wcześniejszymi zmianami i wszystkim), uruchom a, git stash applyaby przykleić te zmiany do kodu. W ten sposób masz podejście „cofnij”.

Kzqai
źródło
1
Prawdopodobnie zaleciłbym używanie, git stash popchyba że chcesz mieć historię swoich
skrytek
7

Najpierw musisz scalić swoje pliki. Wykonaj a, git statusaby zobaczyć, jakie pliki należy scalić (oznacza to, że musisz najpierw rozwiązać konflikty). Gdy to zrobisz, zrób git add file_mergedi zrób to pullponownie.

Amokrane Chentir
źródło
2
Dzięki. Miałem do czynienia z tym problemem. Mam pewne zmiany w moich plikach roboczych, których nie chcę zatwierdzać. Ale w tym przypadku nie mogę zrobić nic dziwnego. Więc robię - git stash, git pull --rebase, git stash pop. Następnie ręcznie scal i dodaj polecenie file_merged
RuntimeException
6

wypróbuj ten kod

cd /go/to/path
git pull origin master
Amirouche Zeggagh
źródło
5
Witamy w Stackoverflow! Rozważ dodanie wyjaśnienia do swojego rozwiązania, aby lepiej opisać, w jaki sposób rozwiązuje problem. To sprawi, że twoje odpowiedzi będą jeszcze bardziej przydatne
dkackman,
2

Jeśli chcesz po prostu wyrzucić wszystko z folderu roboczego (np. Wyniki nieudanego lub przerwanego scalenia) i powrócić do czystego poprzedniego zatwierdzenia, wykonaj git reset --hard.

Damian
źródło
1

Rozumiem, że chcesz zniszczyć lokalne zmiany i zdjąć to, co masz na pilocie?

Jeśli wszystko inne zawiedzie, a jeśli (całkiem zrozumiale) boisz się „zresetować”, najprostszą rzeczą jest po prostu sklonowanie źródła w nowym katalogu i wyrzucenie starego.

Dan Ray
źródło
1

Po uruchomieniu tego polecenia otrzymasz najnowszy tag, który zwykle jest wersją twojego projektu:

git describe --abbrev=0 --tags
ReCatCoder
źródło
0

Wydaje mi się, że masz problemy z core.autocrlf. core.autocrlf = true może powodować problemy takie jak te, które opisujesz w systemie Windows, jeśli nowe wiersze CRLF zostały sprawdzone w repozytorium. Spróbuj wyłączyć core.autocrlf dla repozytorium i wykonaj twardy reset.

kusma
źródło
0

Jeśli używasz Git GUI, najpierw pobierz, a następnie scal.

Pobierz za pomocą menu zdalnego >> Pobierz >> Pochodzenie. Scal za pomocą menu Scal >> Scal lokalnie.

Pojawi się następujące okno dialogowe.

wprowadź opis zdjęcia tutaj

Wybierz przycisk radiowy gałęzi śledzenia (również domyślnie zaznaczony), pozostaw żółte pole puste i naciśnij przycisk scalania, co powinno zaktualizować pliki.

Przed wykonaniem tych kroków cofnąłem już niektóre lokalne zmiany, ponieważ i tak chciałem je odrzucić, więc nie muszę później eliminować poprzez scalanie.

zar
źródło