Jak wyciągnąć zdalną gałąź z repozytorium innej osoby


265

Mam projekt hostowany na GitHub, który ktoś rozwidlił. Na swoim widelcu utworzyli nową gałąź „foo” i wprowadzili pewne zmiany. Jak przeciągnąć ich „foo” do nowej gałęzi o nazwie „foo” w moim repozytorium?

Rozumiem, że mogą przesłać mi prośbę o wycofanie, ale sam chciałbym zainicjować ten proces.

Załóż, że:

  1. Ponieważ rozwidlili mój projekt, oba nasze repozytoria mają tę samą „historię”
  2. Chociaż GitHub pokazuje, że ich projekt został rozwidlony z mojego, moje lokalne repozytorium nie ma żadnych odniesień do projektu tej osoby. Czy muszę dodać ich jako pilota?
  3. Nie mam jeszcze gałęzi o nazwie „foo” - nie wiem, czy najpierw muszę to ręcznie utworzyć.
  4. Zdecydowanie chcę, aby zostało to wciągnięte do oddzielnej gałęzi, a nie mojego mistrza.

Odpowiedzi:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Spowoduje to skonfigurowanie oddziału lokalnego foo, śledzenie oddziału zdalnego coworker/foo. Kiedy więc Twój współpracownik wprowadzi jakieś zmiany, możesz je łatwo wyciągnąć:

git checkout foo
git pull

Odpowiedź na komentarze:

Fajnie :) A jeśli chciałbym wprowadzić własne zmiany w tej gałęzi, czy powinienem utworzyć drugi lokalny „pasek” od „foo” i pracować tam zamiast bezpośrednio na moim „foo”?

Nie musisz tworzyć nowego oddziału, mimo że go polecam. Równie dobrze możesz zaangażować się bezpośrednio fooi poprosić współpracownika o odebranie oddziału. Ale ta gałąź już istnieje i twoja gałąź foomusi być skonfigurowana jako gałąź nadrzędna:

git branch --set-upstream foo colin/foo

zakładając, że colintwoje repozytorium (zdalne do repozytorium współpracowników) jest zdefiniowane w podobny sposób:

git remote add colin git://path/to/colins/repo.git

3
To było bardzo szybkie :) Możesz dodać, że powinien używać git://adresu URL ze strony repozytorium GitHub drugiej osoby zamiast //path/to/coworkers/repo.git. (Opisanie tego sprawiło, że moja odpowiedź była zbyt wolna;))
Mark Longair

Fajnie :) A jeśli chciałbym wprowadzić własne zmiany w tej gałęzi, czy powinienem utworzyć drugi lokalny „pasek” od „foo” i pracować tam zamiast bezpośrednio na moim „foo”?
Colin O'Dell

A może bezpiecznie jest pracować bezpośrednio w moim „foo” i pobierać / scalać jego zmiany później? Jaka jest tutaj najlepsza praktyka?
Colin O'Dell

1
Idealnie, właśnie tego szukałem :) Dzięki za pomoc !!
Colin O'Dell

1
Dobra odpowiedź za 3 minuty!
Tieme,

103

Nie, nie musisz dodawać ich jako pilota. Byłoby to nieporęczne i trudne do zrobienia za każdym razem.

Chwytając swoje zobowiązania:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Spowoduje to utworzenie lokalnego oddziału o nazwie ournameforbranchdokładnie takiej samej, jak theirbranchdla niego. Na przykład w pytaniu byłby ostatni argument foo:foo.

Uwaga: :ournameforbranchczęść można jeszcze pominąć, jeśli wymyślenie nazwy, która nie jest sprzeczna z jedną z twoich gałęzi, jest uciążliwe. W takim przypadku wywoływane odwołanie FETCH_HEADjest dostępne. Możesz git log FETCH_HEADzobaczyć ich zobowiązania, a następnie robić rzeczy, takie jak cherry-pickedwiśnia, wybierać ich zobowiązania.

Przekazywanie go z powrotem do nich:

Często chcesz coś naprawić i odepchnąć. To też możliwe:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

Jeśli martwi Cię praca w stanie odłączonym , za wszelką cenę utwórz gałąź, używając :ournameforbranchi zamień FETCH_HEADi HEADpowyżej na ournameforbranch.


2
Dziękujemy za to, druga odpowiedź nie działa, jeśli zarówno ty, jak i druga osoba ma identyczne nazwy oddziałów (jak domyślny masteroddział)
Job

2
Warto wspomnieć, że ta metoda nie zadziała, jeśli nie masz czegoś takiego jak klucz SSH powiązany z kontem github, patrz stackoverflow.com/questions/12940626
Przemek D

nie musisz być dodawany jako współpracownik, abyś mógł wypchnąć ich repozytorium?
Honey,

@ Kochanie, oczywiście! Pushing zakłada, że ​​masz niezbędne uprawnienia na zdalnym końcu do pushowania. Pobieranie podobnie zakłada, że ​​ścieżka jest dostępna.
antak

Jeśli uruchomisz się git branch -m newbranchw tym odłączonym stanie, git straci rozum i zacznie mówić, że twoje repo nie jest już ważne. git initwydaje się to naprawić i przywrócić cię do stanu, w jakim byłeś wcześniej, z gałęzią o nazwie „newbranch”.
Ian Hickson

14

Jeśli odpowiedź Antaka:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

daje Ci:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Następnie (zgodnie z radą Przemka D) użyj

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

Poniżej znajduje się przydatne rozwiązanie, które współpracuje z GitHub do sprawdzania gałęzi PR z rozwidlenia innego użytkownika. Musisz znać identyfikator żądania ściągnięcia (który GitHub wyświetla wraz z tytułem PR).

Przykład:

Naprawa niepewnego kodu nr 8
Alicja chce scalić 1 zatwierdzenie your_repo:masterzher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Zamień pilota, jeśli jest inny niż origin.
Zastąp 8poprawnym identyfikatorem żądania ściągnięcia.


2
To wymaga więcej pozytywnych opinii. działa perfekcyjnie i uniknął błędu „fatal: Nie można znaleźć zdalnego ref”, który otrzymywałem przy odpowiedzi, która była najczęściej głosowana. Dzięki!
Michael Romrell,

2 linie łatwego kodu. Dziękujemy za udostępnienie tego! Jedyną przyjemniejszą rzeczą jest połączenie aktualizacji z powrotem w żądanie ściągnięcia w prosty sposób.
klewis

4

GitHub ma nową opcję w stosunku do poprzednich odpowiedzi, wystarczy skopiować / wkleić wiersze poleceń z PR:

  1. Przewiń na dół PR, aby zobaczyć przycisk MergelubSquash and merge
  2. Kliknij link po prawej: view command line instructions
  3. Naciśnij ikonę Kopiuj po prawej stronie Kroku 1
  4. Wklej polecenia do terminala

2

Jeśli rozwidlone repozytorium jest chronione, więc nie możesz wcisnąć go bezpośrednio, a Twoim celem jest wprowadzenie zmian w jego foo, musisz wprowadzić do repo ich gałęzi foo w następujący sposób:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Teraz masz lokalną kopię foo bez powiązanego z nią wcześniejszego programu. Możesz zatwierdzić zmiany (lub nie), a następnie wypchnąć foo do własnego zdalnego repozytorium.

git push --set-upstream origin foo

Teraz foo jest w Twoim repozytorium na GitHub, a lokalny foo go śledzi. Jeśli nadal wprowadzają zmiany w foo, możesz pobrać ich i połączyć się z foo.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
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.