Próba wyciągnięcia plików z mojego repozytorium Github: „odmowa scalania niepowiązanych historii”


151

Uczę się gita i podążam za książką społeczności Git.

Wcześniej (dawno temu) utworzyłem publiczne repozytorium na Githubie z kilkoma plikami. Teraz skonfigurowałem lokalne repozytorium Git na moim obecnym komputerze i zatwierdziłem kilka plików. Następnie dodałem pilota wskazującego na moją stronę Github:

[root@osboxes c]# git remote add learnc https://github.com/michaelklachko/Learning-C

To wydawało się skuteczne:

[root@osboxes c]# git remote show learnc
* remote learnc
  Fetch URL: https://github.com/michaelklachko/Learning-C
  Push  URL: https://github.com/michaelklachko/Learning-C
  HEAD branch: master
  Remote branch:
    master tracked
  Local ref configured for 'git push':
    master pushes to master (local out of date)

Teraz chcę pobrać pliki z repozytorium Github na komputer. Ja to zrobiłem:

[root@osboxes c]# git fetch learnc
[root@osboxes c]# git merge learnc/master
warning: refname 'learnc/master' is ambiguous.
Already up-to-date.

Jednak nie widzę żadnych nowych plików w moim katalogu lokalnym. Jak mogę je zdobyć?

Próbowałem też to zrobić:

[root@osboxes c]# git pull learnc master
From https://github.com/michaelklachko/Learning-C
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

BTW, lokalnie jestem w oddziale głównym (nie ma innych oddziałów):

[root@osboxes c]# git status
On branch master
nothing to commit, working directory clean

4
Czy podczas konfigurowania lokalnego repozytorium sklonowałeś repozytorium Github, czy po prostu to zrobiłeś git init? W tym drugim przypadku te repozytoria są niepowiązane (nie mają wspólnych zatwierdzeń) i nie można ich scalić (ściąganie to pobieranie + scalanie).
Paul,

Zrobiłem inicjalizację. Czy powinienem więc sklonować repozytorium Github, aby to naprawić?
MichaelSB,

1
Możesz sklonować repozytorium Github i kontynuować z nim pracę, ale nadal będzie to oddzielne repozytorium. Czy chcesz połączyć dwie niepowiązane ze sobą historie?
Paul

Myślę, że chcę scalić historie, ale tak naprawdę chcę po prostu połączyć pliki zarówno lokalnie, jak i na githubie. Chodzi mi o to, że nie obchodzi mnie historia starych plików, które mam na Github.
MichaelSB,

Odpowiedzi:


315

Próbować --allow-unrelated-histories

Jak skomentował max630, lub jak wyjaśniono tutaj, Git odmówił łączenia niepowiązanych historii


1
jak odnotowano w informacjach o wydaniu na
githubie

Dlaczego nie ma opcji konfiguracji, aby zawsze to ustawić? Za każdym razem muszę polować na tę opcję; Pracuję z git od 2k8 i jestem całkowicie zirytowany tą opieką nad dzieckiem. Głupia opcja nie zawsze była dostępna. Wiadomość o odmowie powinna zawierać przynajmniej informację o nadpisaniu.
nyov

98
git checkout master
git merge origin/master --allow-unrelated-histories

Więc rozwiąż konflikt

git add -A .
git commit -m "Upload"
git push

1
Dzięki za opracowanie powyższego rozwiązania.
Rahul Raj

39

Chociaż jestem zwolennikiem odblokowywania problemów związanych z pracą ludzi, nie sądzę, aby „push --force” lub „--allow_unrelated_histories” były uczone nowych użytkowników jako ogólnych rozwiązań, ponieważ mogą spowodować prawdziwe spustoszenie w repozytorium, gdy ich używa się bez zrozumienia, dlaczego rzeczy nie działają w pierwszej kolejności.

Kiedy masz taką sytuację, w której zaczynasz od lokalnego repozytorium i chcesz stworzyć pilota na GitHub, z którym możesz dzielić się swoją pracą, jest na co uważać.

Podczas tworzenia nowego repozytorium online dostępna jest opcja „Zainicjuj to repozytorium za pomocą pliku README”. Jeśli przeczytasz drobny druk, jest na nim napis „Pomiń ten krok, jeśli importujesz istniejące repozytorium”.

Być może zaznaczyłeś to pole. Lub podobnie, wykonałeś add / commit online przed próbą pierwszego push. Dzieje się tak, gdy tworzysz unikalną historię zatwierdzeń w każdym miejscu i nie można ich pogodzić bez specjalnego dodatku wymienionego w odpowiedzi Nevermore (ponieważ git nie chce, abyś działał w ten sposób). Możesz skorzystać z niektórych porad wymienionych tutaj lub po prostu nie zaznaczać tej opcji następnym razem, gdy chcesz połączyć niektóre pliki lokalne z nowym pilotem; utrzymywanie pilota w czystości podczas tego początkowego naciśnięcia.

Odniesienie: moje pierwsze doświadczenie z git + hub polegało na tym, że napotkałem ten sam problem i dużo się nauczyłem, aby zrozumieć, co się stało i dlaczego.


12

Jeśli na jednym końcu nie ma znaczącej historii (aka jeśli jest to tylko jedno zatwierdzenie readme na końcu github), często łatwiej jest ręcznie skopiować plik readme do mojego lokalnego repozytorium i zrobić, git push -faby moja wersja była nowym zatwierdzeniem roota .

Uważam, że jest nieco mniej skomplikowany, nie wymaga zapamiętywania niejasnej flagi i sprawia, że ​​historia jest nieco czystsza.


11

Na swojej gałęzi - mów mistrzu, wyciągaj i zezwalaj na niepowiązane historie

git pull origin master --allow-unrelated-histories

Pracował dla mnie.


1
To polecenie jest tym, którego potrzebujesz, wyrażając zgodę na dodanie licencji lub pliku ReadMe podczas tworzenia repozytorium pochodzenia w Github.
F1Linux,

4

Wykonaj następujące polecenie:

git pull origin master --allow-unrelated-histories

Otworzy się plik scalający vim. Dodaj wiadomość łączącą i:

  1. Naciśnij klawisz ESC
  2. Naciśnij Shift + ';'
  3. Naciśnij „w”, a następnie „q”.

I jesteś gotowy.


3

Kiedy użyłem --allow-unrelated-histories, to polecenie generowało zbyt wiele konfliktów. Wystąpiły konflikty w plikach, nad którymi nawet nie pracowałem. Aby obejść ten błąd " Refusing to merge unrelated histories", użyłem następującego polecenia rebase:

git pull --rebase=preserve --allow-unrelated-histories

Następnie zatwierdź niezatwierdzone zmiany za pomocą komunikatu o zatwierdzeniu. Na koniec uruchom następujące polecenie:

git rebase --continue

Po tym, moja kopia robocza była aktualna ze zdalną kopią i mogłem przesyłać swoje zmiany tak jak poprzednio. Nigdy więcej niepowiązanych błędów historii podczas ściągania.


1
Aktualna wersja: git pull --rebase=merge --allow-unrelated-historiesjak --rebase=preservejest przestarzała git-scm.com/docs/git-pull#Documentation/…
Luckylooke

0

W moim przypadku napotkałem ten sam problem, zwłaszcza pierwsze żądanie ściągnięcia próbowane po zdalnym dodaniu repozytorium Git. Wystąpił następujący błąd.

fatal: refusing to merge unrelated histories on every try

Użyj polecenia --allow-unrelated-histories. Działa doskonale.

git pull origin branchname --allow-unrelated-histories
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.