So ziehen Sie einen Remote-Zweig aus dem Repo eines anderen

265

Ich habe ein auf GitHub gehostetes Projekt, das jemand gespalten hat. Auf ihrer Gabel haben sie einen neuen Zweig "foo" erstellt und einige Änderungen vorgenommen. Wie ziehe ich ihr "foo" in einen neuen Zweig, der in meinem Repo auch "foo" heißt?

Ich verstehe, dass sie mir eine Pull-Anfrage senden könnten, aber ich möchte diesen Prozess selbst initiieren.

Nehmen Sie Folgendes an:

  1. Da sie mein Projekt gespalten haben, teilen unsere beiden Repos dieselbe "Geschichte".
  2. Obwohl GitHub zeigt, dass ihr Projekt von meinem gespalten wurde, enthält mein lokales Repository keine Verweise auf das Projekt dieser Person. Muss ich ihre als Fernbedienung hinzufügen?
  3. Ich habe noch keinen Zweig namens "foo" - ich weiß nicht, ob ich diesen zuerst manuell erstellen muss.
  4. Ich möchte auf jeden Fall, dass dies in einen separaten Zweig gezogen wird und nicht mein Meister.
Colin O'Dell
quelle

Antworten:

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

Dadurch wird ein lokaler Zweig eingerichtet foo, der den Remote-Zweig verfolgt coworker/foo. Wenn Ihr Mitarbeiter einige Änderungen vorgenommen hat, können Sie diese einfach abrufen:

git checkout foo
git pull

Antwort auf Kommentare:

Cool :) Und wenn ich meine eigenen Änderungen an diesem Zweig vornehmen möchte, sollte ich aus "foo" eine zweite lokale Zweigstelle "bar" erstellen und dort arbeiten, anstatt direkt an meinem "foo"?

Sie müssen keinen neuen Zweig erstellen, obwohl ich ihn empfehle. Sie können sich genauso gut direkt an fooIhren Kollegen wenden und Ihren Zweig ziehen lassen. Dieser Zweig ist jedoch bereits vorhanden und Ihr Zweig foomuss als vorgelagerter Zweig eingerichtet werden:

git branch --set-upstream foo colin/foo

Angenommen, colinIhr Repository (ein Remote-Repository für Ihre Mitarbeiter) ist auf ähnliche Weise definiert:

git remote add colin git://path/to/colins/repo.git
ralphtheninja
quelle
3
Das war sehr schnell :) Vielleicht möchten Sie hinzufügen, dass er die git://URL von der GitHub-Repository-Seite der anderen Person anstelle von verwenden sollte //path/to/coworkers/repo.git. (Das zu beschreiben hat meine Antwort zu langsam gemacht;))
Mark Longair
Cool :) Und wenn ich meine eigenen Änderungen an diesem Zweig vornehmen möchte, sollte ich aus "foo" eine zweite lokale Zweigstelle "bar" erstellen und dort arbeiten, anstatt direkt an meinem "foo"?
Colin O'Dell
Oder ist es sicher, direkt in meinem "foo" zu arbeiten und seine Änderungen später abzurufen / zusammenzuführen? Welches ist hier die beste Vorgehensweise?
Colin O'Dell
1
Perfekt, genau das habe ich gesucht :) Danke für deine Hilfe !!
Colin O'Dell
1
Schöne Antwort in 3 Minuten!
Tieme
103

Nein, Sie müssen sie nicht als Fernbedienung hinzufügen. Das wäre umständlich und jedes Mal schmerzhaft.

Ergreifen ihrer Verpflichtungen:

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

Dadurch wird ein lokaler Zweig mit dem Namen erstellt, ournameforbranchder genau dem entspricht, was theirbranchfür sie vorgesehen war. Für das Fragenbeispiel wäre das letzte Argument foo:foo.

Beachten Sie, dass ein :ournameforbranchTeil weiter weggelassen werden kann, wenn es störend ist, sich einen Namen auszudenken, der nicht mit einem Ihrer eigenen Zweige in Konflikt steht. In diesem Fall ist eine aufgerufene Referenz FETCH_HEADverfügbar. Sie können git log FETCH_HEADihre Commits sehen und dann Dinge tun cherry-picked, um ihre Commits auszuwählen.

Schieben Sie es zurück zu ihnen:

Oft möchten Sie etwas von ihnen reparieren und es sofort zurückschieben. Das ist auch möglich:

git fetch [email protected]:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push [email protected]:theirusername/reponame.git HEAD:theirbranch

Wenn Sie sich Sorgen machen, wenn Sie in einem getrennten Zustand arbeiten , erstellen Sie auf jeden Fall einen Zweig mit :ournameforbranchund ersetzen Sie FETCH_HEADund HEADdarüber ournameforbranch.

Antak
quelle
2
Vielen Dank dafür, die andere Antwort funktioniert nicht, wenn sowohl Sie als auch die andere Person identisch benannte Zweige haben (wie der Standardzweig master)
Job
2
Es ist erwähnenswert, dass diese Methode nicht funktioniert, wenn Ihrem Github-Konto kein SSH-Schlüssel zugeordnet ist. Siehe stackoverflow.com/questions/12940626
Przemek D
Müssen Sie nicht als Mitarbeiter hinzugefügt werden, damit Sie zu deren Repo gelangen können?
Honig
@ Honig sicher! Beim Pushing wird davon ausgegangen, dass Sie auf der Remote-Seite über die erforderlichen Berechtigungen zum Pushing verfügen. Beim Abrufen wird ebenfalls davon ausgegangen, dass der Pfad zugänglich ist.
Antak
Wenn du git branch -m newbranchin diesem getrennten Zustand rennst, verliert git den Verstand und beginnt zu sagen, dass dein Repo nicht mehr gültig ist. git initscheint das Problem zu beheben und Sie wieder in den Zustand zu versetzen, in dem Sie sich zuvor befanden, mit dem Zweig "newbranch".
Ian Hickson
14

Wenn Antaks Antwort:

git fetch [email protected]:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

gibt Ihnen:

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

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

Dann (nach dem Rat von Przemek D) verwenden

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

Das Folgende ist eine nette, zweckmäßige Lösung, die mit GitHub zusammenarbeitet, um den PR-Zweig von der Gabel eines anderen Benutzers aus zu überprüfen. Sie müssen die Pull-Request-ID kennen (die GitHub zusammen mit dem PR-Titel anzeigt).

Beispiel:

Das Korrigieren Ihres unsicheren Codes # 8
Alice möchte 1 Commit in your_repo:mastervon zusammenführenher_repo:branch

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

Ersetzen Sie Ihre Fernbedienung, falls abweichend von origin.
Ersetzen Sie 8durch die richtige Pull-Request-ID.

Subfuzion
quelle
2
Dies erfordert mehr Upvotes. funktioniert einwandfrei und vermeidet den Fehler "fatal: Remote Ref konnte nicht gefunden werden", den ich mit der Antwort mit der höchsten Bewertung erhalten habe. Vielen Dank!
Michael Romrell
2 Zeilen einfachen Codes. Danke, dass du das geteilt hast! Das einzige, was süßer ist, ist das einfache Zusammenführen von Updates in ihre Pull-Anfrage.
Klewis
4

GitHub hat eine neue Option in Bezug auf die vorhergehenden Antworten. Kopieren Sie einfach die Befehlszeilen aus der PR:

  1. Scrollen Sie zum unteren Rand des PR, um die Schaltfläche Mergeoder Squash and mergeanzuzeigen
  2. Klicken Sie auf den Link rechts: view command line instructions
  3. Klicken Sie auf das Kopiersymbol rechts neben Schritt 1
  4. Fügen Sie die Befehle in Ihr Terminal ein
Robert Monfera
quelle
2

Wenn das gegabelte Repo geschützt ist, so dass Sie nicht direkt hineinschieben können und Ihr Ziel darin besteht, Änderungen an seinem Foo vorzunehmen, müssen Sie seinen Zweig-Foo wie folgt in Ihr Repo integrieren:

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

Jetzt haben Sie eine lokale Kopie von foo, der kein Upstream zugeordnet ist. Sie können Änderungen daran vornehmen (oder nicht) und dann Ihr foo auf Ihr eigenes Remote-Repo übertragen.

git push --set-upstream origin foo

Jetzt ist foo in deinem Repo auf GitHub und dein lokales foo verfolgt es. Wenn sie weiterhin Änderungen an foo vornehmen, können Sie ihre abrufen und in Ihr foo einbinden.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
J Smith
quelle