2013-02-28 17 views
61

Czytałem wszystkie podobne pytania na ten temat; Wydaje się, że żaden z poniższych pracowali:Git Pull nie jest możliwy, niezintegrowane pliki

Delete offending files 
git reset --hard HEAD 
git stash 
git pull 

prawie każde połączenie, stashing zmiany i ciągnięcie z repozytorium wyników w plikach unmergable. Chciałbym odrzucić wszystkie lokalne zmiany i po prostu użyć pilota, ale nie mogę ponownie sklonować (ograniczenia przepustowości i korzystania z Internetu, gdy programista próbuje to zrobić). Jak mam to zrobic?

Właśnie próbowałem:

git stash 
git pull 

także nie działa.

Więcej informacji

Jest jeden lokalny popełnienia, a prąd ma popełnić, jak również. Tak więc próbowałem git pull --rebase, ale nadal nie działa poprawnie ... To daje mi błędy - "wychodzenie z powodu nierozwiązanego konfliktu". Jeśli robię git stash, git reset --hard HEAD, git pull --rebase, otrzymuję błąd „ciągnąć nie jest możliwe, niezłączonych zmiany ...”

Odpowiedz

146

Say pilot jest origin i oddział jest master i powiedzieć masz już master wyrejestrowany, może spróbować wykonać następujące czynności:

git fetch origin 
git reset --hard origin/master 

To w zasadzie tylko bierze aktualną gałąź i zwraca go do HEAD z zdalny oddział.

UWAGA: Jak podano w komentarzach, będzie wyrzucić swoje lokalne zmiany i nadpisać z tym, co jest na początku.

Albo można użyć poleceń instalacyjnych zrobić w zasadzie takie same:

git fetch <remote> 
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>) 
git reset --hard 

EDIT: Chciałbym krótko wyjaśnić, dlaczego to działa.

Folder .git może przechowywać zatwierdzenia dla dowolnej liczby repozytoriów. Ponieważ wartość skrótu zatwierdzenia jest faktycznie metodą weryfikacji zawartości zatwierdzenia, a nie tylko losowo wygenerowaną wartością, jest używana do dopasowywania zestawów zatwierdzeń między repozytoriami.

Oddział jest po prostu nazwanym wskaźnikiem do danego skrótu. Oto przykładowy zestaw:

$ find .git/refs -type f 
.git/refs/tags/v3.8 
.git/refs/heads/master 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 

Każdy z tych plików zawiera skrót wskazujący na popełnienie:

$ cat .git/refs/remotes/origin/master 
d895cb1af15c04c522a25c79cc429076987c089b 

Są to wszystko dla wewnętrznego mechanizmu przechowywania git i działa niezależnie od katalogu roboczego . W następujący sposób:

git reset --hard origin/master 

git wskaże aktualną oddział w tym samym wartości hash, że punkty pochodzenie/Mistrz. Następnie wymusza zmianę katalogu roboczego w celu dopasowania do struktury pliku/zawartości tego skrótu.

Aby zobaczyć przy pracy śmiało wypróbować następujące:

git checkout -b test-branch 
# see current commit and diff by the following 
git show HEAD 
# now point to another location 
git reset --hard <remote>/<branch> 
# see the changes again 
git show HEAD 
+0

Nie mogę przetestować tak więc nie mam pojęcia, czy to działa - ale przegłosowałem dobre rozwiązanie –

+3

@timothyov To prawda, ale w oparciu o pytanie, które czułem, co było sugerowane. –

+1

Z ostatniej zatwierdzonej edycji, dodając na początku masywne ostrzeżenie, tak jak wskazać, że jest już wspomniane: "Następnie [git] wymusza wymuszenie zmiany katalogu roboczego w celu dopasowania do struktury pliku/zawartości tego skrótu." Ale domyślam się, że nie było wystarczająco wyraźne. –

1

Zakładając chcesz wyrzucić wszelkie zmiany, które należy najpierw sprawdzić moc git status. W przypadku każdego pliku, który obok nazwy "unmerged", uruchom git add <unmerged file>. Następnie postępuj zgodnie z git reset --hard. To pozbędzie się wszelkich lokalnych zmian, z wyjątkiem nieśledzonych plików.

+0

Dodano trochę informacji, to jeszcze nie działa poprawnie –

+0

No dobra. Może nie powiedzieć "niezałożona". Może również powiedzieć "oba zmodyfikowane" lub może jedną lub dwie inne rzeczy. Jaki jest wynik działania 'git status'? –

+0

http://prntscr.com/ufyqw –

3

rozwiązać, stosując następujący zestaw poleceń:

git reset --hard 
git pull --rebase 
git rebase --skip 
git pull 

Sztuką jest rebase zmiany ... Mieliśmy pewne problemy podścielanie jeden trywialny popełnienia, a więc po prostu pominięte go przy użyciu git rebase --skip (po skopiowaniu plików).

1

mam rozwiązany z git usunąć plik niezłączonych lokalnie.

$ git rm <the unmerged file name> 
$ git reset --hard 
$ git pull --rebase 
$ git rebase --skip 
$ git pull 
Already up-to-date. 

Kiedy wysłać git commit potem: odpowiedź

$ git commit . -m "my send commit" 
On branch master 
Your branch is up-to-date with 'origin/master'. 
nothing to commit, working directory clean 
0

Ryana Stewarta był prawie na miejscu. W przypadku, gdy rzeczywiście nie chcą usuwać swoich lokalnych zmian, nie ma przepływu pracy można użyć do scalenia:

  • Run git status. Da ci listę niezamkniętych plików.
  • połączyć je (ręcznie, itd.)
  • Run git commit

Git popełni tylko scala do nowego popełnić. (W moim przypadku miałem dodatkowe pliki na dysku, które nie zostały wrzucone do tego zatwierdzenia.)

Git uważa, że ​​scalenie się powiodło i pozwala iść do przodu.

0

Jeśli kiedykolwiek zdarzy się uzyskać ten problem po uruchomieniu git fetch a następnie git nie pozwala na uruchomienie git pull powodu konfliktu scalania (zarówno zmodyfikowane/pliki niezłączonych, i aby ci bardziej sfrustrowany, to won” t wyświetla wszystkie znaczniki konfliktu w pliku, ponieważ nie zostały jeszcze scalone). Jeśli nie chcesz stracić pracy, możesz wykonać następujące czynności.

rozmieść plik.

$ git add filename 

następnie przechowaj lokalne zmiany.

$ git stash 

ciągnąć i zaktualizować katalog roboczy

$ git pull 

przywrócić lokalną zmodyfikowanego pliku (GIT będzie automatycznie łączyć, jeżeli można, inaczej go rozwiązać)

$ git stash pop 

nadzieję, że to pomoże.