Wie kann ich wieder spiele meine Commits einer lokalen Git-Repository, auf ein Projekt, das ich auf github.com gegabelt?

StackOverflow https://stackoverflow.com/questions/1457248

  •  12-09-2019
  •  | 
  •  

Frage

Ja, ich weiß, sollte ich nur das Projekt von Anfang an gegabelt haben, aber das ist, was Situation, die ich in jetzt bin. :)

Ich habe eine lokale Git Repository, das mein Blog enthält, auf meinem lokalen Computer, die die Geschichte mehrere Monate zu begehen hat. Ursprünglich habe ich heruntergeladen einfach die Dateien aus dem Repository http://github.com/mojombo/mojombo.github.com , und ich Fortsetzung mit Repository meiner lokalen Git, mit dem Commit zunächst wie die neuesten Dateien aus mojombo Repository suchen.

Ich möchte nun das Projekt gabeln und haben Commits meinem lokalen Git-Repository auf ihm wiedergegeben werden, so sieht es aus wie ich das Projekt von Anfang an gegabelt, und schob es dann zurück zu meinem gegabelt Version von mojombo Repository, auf meinem GitHub Konto:

http://github.com/program247365/mojombo.github.com

So vielleicht wäre die Geschichte dann wie folgt aussehen:

mobjombo repository:         1---2---3----23
                                  \
my blog repository commits:       24---25---

Welche Git Befehle kann ich genau dies zu tun?

Ich habe unter dieser Frage aussehen. Muss ich mojombo Repository als Remote zu meinem Projekt hinzuzufügen, und es dann in ziehen, fusionieren, Konflikte zu lösen, und dann zu meinem gegabelt Projekt auf GitHub schieben?

War es hilfreich?

Lösung 2

Als ich git pull versuchte, es gab mir die folgende Fehlermeldung:

$ git pull grid master:master
! [rejected]        master     -> master  (non fast forward)

In meinem speziellen Fall, schien es, dass git rebase der Weg für uns zu gehen war, wie hier durch die Schritte gezeigt:

#Clone my forked project from github
git clone git@github.com:program247365/mojombo.github.com.git 

#Add my repo as a remote repo, with the alias 'grid'
git remote add grid "path/to/remote/gitrep/with/all/history/unrelated/to/mojombo/" 

#Rebase my commits on top of mojombo's
git rebase master grid/master

#Switch to the local master branch 
git checkout master

#Call up my mergetool via git, to start rectifying the conflicts that emerge between my repo, and mojombo's
git mergetool

#Push my rebased/combined repo back to Github.com
git push github

Andere Tipps

Kurz gesagt:

Eine Lösung zu verwenden ist Transplantate Geschichte zu verbinden, verwenden Sie dann git filter-branch Geschichte neu zu schreiben diese Transplantate nach, dann optional tun ein fusionieren .

Beachten Sie, dass Lösung, um die Änderungen zu wiederholen (Commits) auf der neuen Entwicklung in Original-Repository (die Fütterungsmaterial Lösung) ist eine andere praktikable Lösung.


Längere Version:

Nehmen wir an, dass Sie entweder erinnern, oder Sie können durch die Untersuchung Quelle und / oder mit git finden Befehle, um die Revision der Repository Snapshot heruntergeladen und begann die lokale Entwicklung. Lassen Sie uns diese Revision START oder A nennen.

Nehmen wir an, dass Sie lokale getrennt Geschichte ist in dem Klon des Original-Repository. Es bedeutet, dass Ihre lokale getrennte Entwicklung im gleichen Repository als vollständige Geschichte eines Projektes ist. Nehmen wir an, dass Sie lokale Niederlassungen in Zweig ‚Master‘ (und der Einfachheit halber, dass es nur ein Zweig).

Wenn Sie mit Ihrer lokalen getrennten Arbeit nicht abgerufen Projekt in Repository haben, können Sie dies mit:

$ git remote add origin git://github.com/mojombo/mojombo.github.com.git
$ git fetch origin

Die Geschichte sieht nun wie folgt aus:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)

                                     x---y---*---*---*      <--- master (your local disconnected history)

Die genannten A in obiger Diagramm begehen wird der START Sie als Snapshot heruntergeladen commit und begannen Ihre lokale Entwicklung aus.

Es gibt zwei Möglichkeiten. Sie haben comitted Schnappschuss von ‚A‘ als Anfang begehen ‚x‘, oder das erste begehen gemacht Sie mit Ihrer lokalen Änderung war

Im ersten Fall (Sie ursprünglichen Ausgangszustand begangen, zum Beispiel als ‚Initial commit‘ oder ‚Import‘) würden Sie die angeschlossenen Geschichte wie folgt aussieht wollen:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)
                                      \
                                        \-y---*---*---*       <--- master (your local disconnected history)

d. Ihr erstes Original begehen 'y' als Elternteil 'A' zu haben.

Im zweiten Fall (Sie mit Ihren Änderungen verpflichtet) Sie würde die Geschichte verbunden aussehen soll dies statt:

*---*---*---*---*---A---*---*---*---*           <--- origin/master (remote-tracking branch)
                                      \
                                        \-x---y---*---*---*      <--- master (your local disconnected history)

d. Sie wollen begehen erste ‚x‘ ‚A“ als Eltern zu haben.

In beide Fällen Sie volle SHA-1 Kennung begehen 'A' und voller SHA-1-Kennungen von Commits 'x' und 'y'.

finden wollen

Sie können finden SHA-1 von commit 'A' (unter der Annahme, dass Sie es nicht wissen schon) mit git rev-parsen :

$ git rev-parse A     # or A^{commit}
437b1b20df4b356c9342dac8d38849f24ef44f27

(die '^ {begehen}' Suffix könnte, um sicherzustellen, erforderlich sein, dass Sie gefunden commit SHA-1, was wichtig ist, wenn Sie zum Beispiel wissen, 'A“von seinem Tag, zB' v0.99' .; in Ihrem Fall ist es nicht notwendig, da das Repository in Frage keine Tags verwenden)

Hier finden Sie SHA-1 von Commits 'x' und 'y' mit git rev-Liste (vorausgesetzt, dass Sie mit der Entwicklung auf dem Zweig 'Master' durchgeführt wurden):

$ git rev-list --topo-order master | tail -2
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
e83c5163316f89bfbde7d9ab23ca2e25604af290

(die „| tail -2“ ist hier letzten zwei Commits in generierten Liste zu finden, Sie müssen es nicht verwenden, wenn Sie es nicht haben).

Hinweis: in allen Beispielen oben voll SHA-1 sind Beispiele , und sollte nicht als verwendet werden

Lassen Sie sich die Commit Namen, den Sie ‚A“ (oder ‚START‘) haben wollen (x ‚oder‚y‘als Eltern wie FIRST wäre es‘, je nachdem Sie Fall, wie oben angegeben). Wir jetzt verwenden Transplantate Mechanismus Geschichte verbinden:

$ echo "<SHA-1 of FIRST> <SHA-1 of START>" > .git/info/grafts

Dann sollten Sie überprüfen, ob Sie nun korrekt angeschlossen haben (verbunden) Geschichte, durch graphische Geschichte Browser wie gitk, oder QGit oder GitX ist, dass Sie auf MacOS X sind, oder sogar „git log --graph“ oder „git show-branch“, zB:

$ gitk master origin/master    # or --all

(wobei gitk ist hier nur als Beispiel, wenn Sie „git show branch“ Sie nicht immer verwenden können ‚--all‘ Option).

Schließlich würden wir wahrscheinlich wollen jene Änderung vornehmens permanent, die aus unserem Repository holen würden auch verbunden hat Geschichte würde so jemand. Wir können dies tun, indem Sie git filter- Zweig :

$ git filter-branch master

Sie müßten Original (getrennt) Geschichte in 'refs / Original / Master'.

Jetzt können Sie entfernen Transplantate Datei:

$ rm .git/info/grafts

Nun würde Sie in der Lage sein, in neue Entwicklung für Original-Repository zu fusionieren:

$ git merge origin/master

pro-Zweig-Konfiguration einrichten, so dass es ausreichen würde, einfach „git pull“ zu tun, wenn auf dem Zweig ‚Master‘ zu (merge) Änderungen der Herkunft (al) zu ziehen Repository wird als Übung überlässt den Leser .. .: -)


Hinweis: rebase Lösung in der folgenden Geschichte führen würde (unter der Annahme, dass wir Fall, wo erster comit war einfach Import):

*---*---*---*---*---A---*---*---*---*                                      <--- origin/master (remote-tracking branch)
                                                                     \
                                                                       \-y'---*'---*'---*'      <--- master (your local disconnected history)

(wobei y' Mittel, begehen y modifiziert wurde: Es sollte etwa die gleiche changeset sein, aber es ist anders als Festschreibung).

Hier ist ein Gedanke auf, was Sie tun können. Es ist eine Art des gegenüber der Idee, die Sie am Ende Ihrer Frage zusammengefasst.

  1. Fork mojombo Repo in GitHub.
  2. klonen gegabelt Kopie.
  3. Zusammenführen in den Änderungen aus Ihrer bestehenden (original) Repository.
  4. Löschen Sie Ihre Original-Repository (wenn gewünscht, aber Sie nicht wirklich brauchen es mehr).

Also im Grunde nach auf GitHub gabeln, können Sie die folgende Befehlsfolge verwenden:

$ git clone git://github.com/$YOUR_USERNAME/$YOUR_PROJECT.git  # Clone your GitHub fork (#2 from above)
$ git pull /path/to/your/original/repo master:master           # Clone your original repo's master branch into your new repo (cloned from GitHub)
$ rm -rf /path/to/your/original/repo                           # Might as well delete the original -- you don't need it anymore, since all your history is in your new repo

Insgesamt wird diese Methode in allen Änderungen zusammenführen Sie in der älteren Repo vorgenommen haben (also Ihre Entwicklungsgeschichte zu bewahren), während auch in mojombo Geschichte ziehen, und so dass Sie halten mit Änderungen des mojombo / contribute leicht Änderungen zurück zu seinem Repo, falls zutreffend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top