Ich habe kürzlich ein Projekt gegabelt und mehrere Korrekturen vorgenommen. Ich habe dann eine Pull-Anfrage erstellt, die dann akzeptiert wurde.
Einige Tage später wurde eine weitere Änderung von einem anderen Mitwirkenden vorgenommen. Meine Gabel enthält diese Änderung also nicht.
Wie kann ich dieses Wechselgeld in meine Gabel bekommen? Muss ich meine Gabel löschen und neu erstellen, wenn ich weitere Änderungen vornehmen muss? Oder gibt es eine Update-Schaltfläche?
git
github
pull-request
git-fork
Lea Hayes
quelle
quelle
Antworten:
In Ihrem lokalen Klon Ihres gegabelten Repositorys können Sie das ursprüngliche GitHub-Repository als "Remote" hinzufügen. ("Fernbedienungen" sind wie Spitznamen für die URLs von Repositorys -
origin
beispielsweise eine.) Anschließend können Sie alle Zweige aus diesem Upstream-Repository abrufen und Ihre Arbeit neu starten, um die Arbeit an der Upstream-Version fortzusetzen. In Bezug auf Befehle, die wie folgt aussehen könnten:Wenn Sie den Verlauf Ihres Hauptzweigs nicht neu schreiben möchten (z. B. weil andere ihn möglicherweise geklont haben), sollten Sie den letzten Befehl durch ersetzen
git merge upstream/master
. Um jedoch weitere Pull-Anforderungen zu stellen, die so sauber wie möglich sind, ist es wahrscheinlich besser, die Basis neu zu erstellen.Wenn Sie Ihren Zweig neu aufgebaut haben, müssen
upstream/master
Sie möglicherweise den Push erzwingen, um ihn in Ihr eigenes gegabeltes Repository auf GitHub zu verschieben. Das würdest du machen mit:Sie müssen
-f
das erste Mal erst verwenden, nachdem Sie die Basis neu festgelegt haben.quelle
-f
wodurch alle durcheinander gebracht werden, die Ihre Version hätten klonen können.git merge --no-ff upstream/master
diese Weise sind Ihre Commits nicht mehr oben.Ab Mai 2014 ist es möglich, eine Gabel direkt von GitHub aus zu aktualisieren. Dies funktioniert immer noch ab September 2017, ABER es wird zu einem schmutzigen Commit-Verlauf führen.
Update from original
. B. ).Jetzt haben Sie drei Optionen, aber jede führt zu einem weniger sauberen Commit-Verlauf.
This branch is X commits ahead, Y commits behind <original fork>
.Ja, Sie können Ihr Repo über die GitHub-Web-Benutzeroberfläche mit dem Upstream auf dem neuesten Stand halten. Dadurch wird jedoch Ihr Commit-Verlauf beeinträchtigt. Halten Sie sich stattdessen an die Befehlszeile - es ist einfach.
quelle
Hier ist das offizielle Dokument von GitHub zum Synchronisieren einer Gabel :
quelle
git push origin master
--follow-tags
: stackoverflow.com/a/26438076/667847git merge upstream/master
, danngit merge upstream/develop
Permission denied (publickey). fatal: Could not read from remote repository.
beim Versuch, von Facebooks Github-Konto Upstream abzurufen, etwas bekommen habe .Viele Antworten führen dazu, dass Ihr Fork One Commit vor dem übergeordneten Repository verschoben wird. Diese Antwort fasst die hier gefundenen Schritte zusammen, mit denen Sie Ihre Gabel auf das gleiche Commit wie das übergeordnete Element verschieben .
Wechseln Sie in Ihr lokales Repository.
git checkout master
Fügen Sie das übergeordnete Element als Remote-Repository hinzu.
git remote add upstream <repo-location>
git fetch upstream
Problem
git rebase upstream/master
git status
Problem
git push origin master
Weitere Informationen zu diesen Befehlen finden Sie in Schritt 3 .
quelle
Wenn Sie, wie ich, niemals etwas direkt dem Meister übertragen , was Sie wirklich sollten, können Sie Folgendes tun.
Erstellen Sie aus dem lokalen Klon Ihrer Gabel Ihre Upstream-Fernbedienung. Sie müssen das nur einmal tun:
Wann immer Sie den Upstream-Repository-Hauptzweig einholen möchten, müssen Sie:
Angenommen, Sie haben selbst nie etwas für den Meister getan, sollten Sie bereits fertig sein. Jetzt können Sie Ihren lokalen Master auf Ihre ursprüngliche Remote-GitHub-Gabel schieben. Sie können Ihren Entwicklungszweig auch auf Ihrem jetzt aktuellen lokalen Master neu aufbauen.
Nach dem anfänglichen Upstream-Setup und dem Master-Checkout müssen Sie nur den folgenden Befehl ausführen, um Ihren Master mit dem Upstream zu synchronisieren: git pull upstream master .
quelle
Vorwort: Ihre Gabel ist der "Ursprung" und das Repository, aus dem Sie gegabelt haben, ist der "Upstream".
Nehmen wir an, Sie haben Ihre Gabel bereits mit einem Befehl wie diesem auf Ihren Computer geklont:
Wenn dies angegeben ist, müssen Sie in dieser Reihenfolge fortfahren:
Fügen Sie den "Upstream" zu Ihrem geklonten Repository hinzu ("Ursprung"):
Holen Sie sich die Commits (und Zweige) aus dem "Upstream":
Wechseln Sie zum "Master" -Zweig Ihrer Gabel ("Ursprung"):
Verstecken Sie die Änderungen Ihres "Master" -Zweigs:
Führen Sie die Änderungen aus dem "Master" -Zweig des "Upstream" in den "Master" -Zweig Ihres "Ursprungs" ein:
Lösen Sie etwaige Zusammenführungskonflikte und legen Sie Ihre Zusammenführung fest
Schieben Sie die Änderungen an Ihre Gabel
Holen Sie sich Ihre versteckten Änderungen zurück (falls vorhanden)
Du bist fertig! Herzliche Glückwünsche!
GitHub bietet auch Anweisungen zu diesem Thema: Synchronisieren einer Gabel
quelle
git remote add upstream [email protected]:original_author/project_name.git
nur ein Alias fürgit remote add upstream https://github.com/original_author/project_name.git
?git stash
undgit stash pop
Teil sehr hilfreichSeit November 2013 gibt es eine inoffizielle Feature-Anfrage bei GitHub, in der sie gebeten werden, eine sehr einfache und intuitive Methode hinzuzufügen, um eine lokale Abzweigung mit dem Upstream synchron zu halten:
https://github.com/isaacs/github/issues/121
Hinweis: Da die Funktionsanforderung inoffiziell ist, ist es auch ratsam, Kontakt aufzunehmen
[email protected]
, um Ihre Unterstützung für eine zu implementierende Funktion wie diese hinzuzufügen. Die obige inoffizielle Merkmalsanforderung könnte als Beweis für das Ausmaß des Interesses an der Umsetzung verwendet werden.quelle
Zum Datum dieser Antwort hat GitHub diese Funktion in der Weboberfläche nicht ( oder soll ich nicht mehr sagen? ). Sie können jedoch darum bitten
[email protected]
, Ihre Stimme dafür hinzuzufügen.In der Zwischenzeit hat der GitHub-Benutzer bardiharborow ein Tool dafür erstellt: https://upriver.github.io/
Quelle ist hier: https://github.com/upriver/upriver.github.io
quelle
Wenn Sie GitHub für Windows oder Mac verwenden, haben sie jetzt eine Ein-Klick-Funktion zum Aktualisieren von Gabeln:
quelle
Tatsächlich ist es möglich, aus jedem Commit des Upstreams im Browser einen Zweig in Ihrem Fork zu erstellen:
https://github.com/<repo>/commits/<hash>
, wobei Repo Ihre Abzweigung ist und Hash der vollständige Commit- Hash ist, den Sie in der Upstream-Weboberfläche finden. Zum Beispiel kann ich https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 öffnen , was auflinux
master
den Zeitpunkt des Schreibens hinweist .Sie können diesen Zweig dann zu Ihrem lokalen Klon abrufen, und Sie müssen nicht alle Daten an GitHub zurücksenden, wenn Sie Änderungen zusätzlich zu diesem Commit übertragen. Oder verwenden Sie die Weboberfläche, um etwas in diesem Zweig zu ändern.
Wie es funktioniert (es ist eine Vermutung, ich weiß nicht genau, wie GitHub es macht): Gabeln teilen den Objektspeicher und verwenden Namespaces , um Benutzerreferenzen zu trennen. Sie können also über Ihre Gabel auf alle Commits zugreifen, auch wenn diese zum Zeitpunkt des Gabelns noch nicht vorhanden waren.
quelle
Befolgen Sie die folgenden Schritte. Ich habe es versucht und es hat mir geholfen.
Kasse zu Ihrer Filiale
Ziehen Sie den Quell-Repository-Zweig, um den neuesten Code abzurufen
quelle
git push HttpsForYourForkOfTheRepo BRANCH_NAME
Ich aktualisiere meine gegabelten Repos mit dieser einen Zeile:
Verwenden Sie diese Option, wenn Sie Ihrem Projekt keinen weiteren Remote-Endpunkt hinzufügen möchten, wie andere hier veröffentlichte Lösungen.
quelle
pull
.Als Ergänzung zu dieser Antwort suchte ich nach einer Möglichkeit, alle entfernten Zweige meines geklonten Repos ( Ursprungs ) von vorgelagerten Zweigen auf einmal zu aktualisieren . So habe ich es gemacht.
Dies setzt voraus, dass Sie bereits eine Upstream- Fernbedienung konfiguriert haben, die auf das Quell-Repository zeigt (von dem der Ursprung stammt), und diese mit synchronisiert haben
git fetch upstream
.Dann renne:
Der erste Teil dieses Befehls listet alle Köpfe im Upstream- Remote-Repo auf und entfernt den SHA-1, gefolgt vom
refs/heads/
Präfix des Zweignamens.Anschließend wird für jeden dieser Zweige die lokale Kopie des vorgelagerten Fernverfolgungszweigs (
refs/remotes/upstream/<branch>
auf der lokalen Seite) direkt an den entfernten Zweig am Ursprung (refs/heads/<branch>
auf der entfernten Seite) gesendet.Jeder dieser Verzweigungssynchronisierungsbefehle kann aus einem von zwei Gründen fehlschlagen: Entweder wurde der Upstream- Zweig neu geschrieben, oder Sie haben Commits für diesen Zweig an Ihre Verzweigung gesendet. Im ersten Fall, in dem Sie dem Zweig Ihrer Gabel nichts zugewiesen haben, können Sie sicher kräftig drücken (Fügen Sie den Schalter -f hinzu , dh
git push -f
im obigen Befehl). Im anderen Fall ist dies normal, da Ihr Gabelzweig auseinander gegangen ist und Sie nicht erwarten können, dass der Synchronisierungsbefehl funktioniert, bis Ihre Commits wieder in den Upstream zusammengeführt wurden .quelle
Die "Pull" App ist eine automatische Lösung zum Einrichten und Vergessen. Der Standardzweig Ihrer Gabel wird mit dem Upstream-Repository synchronisiert.
Besuchen Sie die URL, klicken Sie auf die grüne Schaltfläche "Installieren" und wählen Sie die Repositorys aus, in denen Sie die automatische Synchronisierung aktivieren möchten.
Der Zweig wird einmal pro Stunde direkt auf GitHub aktualisiert. Auf Ihrem lokalen Computer müssen Sie den Hauptzweig ziehen, um sicherzustellen, dass Ihre lokale Kopie synchron ist.
quelle
mergemethod
. Mehr dazu hierAndroid Studio hat jetzt gelernt, mit GitHub-Fork-Repositorys zu arbeiten (Sie müssen nicht einmal das "Upstream" -Remote-Repository per Konsolenbefehl hinzufügen).
Öffnen Sie das Menü VCS → Git
Beachten Sie auch die beiden letzten Popup-Menüpunkte:
Rebase meine GitHub Gabel
Pull-Anfrage erstellen
Versuch sie. Ich verwende das erste, um mein lokales Repository zu synchronisieren. Auf jeden Fall können Sie auf die Zweige des übergeordneten Remote-Repositorys ("Upstream") in Android Studio zugreifen, nachdem Sie auf "Rebase my GitHub fork" geklickt haben, und Sie können problemlos mit ihnen arbeiten.
(Ich verwende Android Studio 3.0 mit den Plugins "Git Integration" und "GitHub".)
quelle
Wenn Sie Ihr gegabeltes Repository geklont haben, wechseln Sie zu dem Verzeichnispfad, in dem sich Ihr Klon befindet, und zu den wenigen Zeilen in Ihrem Git Bash Terminal.
Und los geht's. Alle aktualisierten Änderungen im Haupt-Repository werden in Ihr Fork-Repository übertragen.
Der Befehl "Abrufen" ist unverzichtbar, um in einem Projekt auf dem neuesten Stand zu bleiben: Nur wenn Sie einen "Git-Abruf" durchführen, werden Sie über die Änderungen informiert, die Ihre Kollegen auf den Remote-Server übertragen haben.
Sie können hier noch weitere Fragen stellen
quelle
Wenn Sie Ihren Upstream einstellen. Überprüfen Sie mit
git remote -v
, dann wird dies ausreichen.quelle
Das hängt von der Größe Ihres Repositorys ab und davon, wie Sie es gegabelt haben.
Wenn es sich um ein ziemlich großes Repository handelt, möchten Sie es möglicherweise auf besondere Weise verwalten (z. B. Drop-Verlauf). Grundsätzlich können Sie Unterschiede zwischen aktuellen und vorgelagerten Versionen feststellen, diese festschreiben und dann zum Master zurückkehren.
Versuchen Sie, dieses zu lesen . Es wird beschrieben, wie große Git-Repositorys behandelt und mit den neuesten Änderungen vorgelagert werden.
quelle
Ich möchte die Antwort von @ krlmlr ergänzen .
Anfänglich hat das gegabelte Repository einen Zweig mit dem Namen :
master
. Wenn Sie an einer neuen Funktion oder einem Fix arbeiten, erstellen Sie im Allgemeinen einen neuen Zweigfeature
und nehmen die Änderungen vor.Wenn Sie möchten, dass das gegabelte Repository mit dem übergeordneten Repository synchronisiert ist, können Sie eine Konfigurationsdatei (
pull.yml
) für die Pull-App ( im Feature-Zweig ) wie folgt einrichten :Dies hält den
master
Zweig des gegabelten Repos mit dem übergeordneten Repo auf dem neuesten Stand. Es hält denfeature
Zweig des gegabelten Repos über denmaster
Zweig des gegabelten Repos auf dem neuesten Stand, indem es zusammengeführt wird. Dies setzt voraus, dass derfeature
Zweig der Standardzweig ist, der die Konfigurationsdatei enthält.Hier sind zwei
mergemethods
im Spiel, einehardreset
hilft dabei, Synchronisierungsänderungen immaster
Zweig des gegabelten Repos mit dem übergeordneten Repo zu erzwingen, und die andere Methode istmerge
. Diese Methode wird verwendet, um von Ihnen in derfeature
Verzweigung vorgenommene Änderungen und Änderungen, die aufgrund der erzwungenen Synchronisierung in dermaster
Verzweigung vorgenommen wurden, zusammenzuführen. Im Falle eines Zusammenführungskonflikts können Sie mit der Pull-App die nächste Vorgehensweise während der Pull-Anforderung auswählen.Sie können über grundlegende und erweiterte Konfigurationen lesen und verschiedene
mergemethods
hier .Ich verwende diese Konfiguration derzeit in meinem gegabelten Repo hier , um sicherzustellen, dass eine hier angeforderte Verbesserung auf dem neuesten Stand bleibt.
quelle
Es gibt zwei wichtige Dinge, um ein gegabeltes Repository immer für immer zu aktualisieren.
Wenn Ihre Pull-Anfrage akzeptiert wird, können Sie den Zweig sicher löschen, da Ihr beigetragener Code dann in Ihrem Master Ihres gegabelten Repositorys gespeichert wird, wenn Sie ihn mit dem Upstream aktualisieren. Auf diese Weise befindet sich Ihr Master immer in einem sauberen Zustand, um einen neuen Zweig für eine weitere Änderung zu erstellen.
Dies kann mit cron erfolgen . Hier ist ein Beispielcode, wenn Sie es unter Linux tun.
Setzen Sie diesen Code auf
crontab file
, um den Job stündlich auszuführen.Erstellen Sie dann die
cron.sh
Skriptdatei und eine Git-Interaktion mit ssh-agent und / oder erwarten Sie wie folgtÜberprüfen Sie Ihr gegabeltes Repository. Von Zeit zu Zeit wird immer diese Benachrichtigung angezeigt:
quelle
Verwenden Sie diese Befehle (im Glück)
quelle