Wie finde ich den Ort des Ursprungs / Masters in Git und wie ändere ich ihn?


227

Ich bin ein Git-Neuling. Ich habe kürzlich ein Rails-Projekt von Subversion auf Git verschoben. Ich habe das Tutorial hier verfolgt: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

Ich verwende auch unfuddle.com, um meinen Code zu speichern. Ich nehme Änderungen an meinem Mac-Laptop im Zug zur / von der Arbeit vor und schiebe sie dann mit dem folgenden Befehl zum Entwirren, wenn ich eine Netzwerkverbindung habe:

git push unfuddle master

Ich verwende Capistrano für Bereitstellungen und ziehe Code mithilfe des Hauptzweigs aus dem Unfuddle-Repository.

In letzter Zeit ist mir die folgende Meldung aufgefallen, wenn ich auf meinem Laptop "git status" ausführe:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

Und ich bin verwirrt warum. Ich dachte, mein Laptop wäre der Ursprung ... aber ich weiß nicht, ob die Tatsache, dass ich ursprünglich von Subversion gezogen oder auf Unfuddle verschoben habe, dazu führt, dass die Nachricht angezeigt wird. Wie kann ich:

  1. Finden Sie heraus, wo Git 'origin / master' denkt?
  2. Wenn es woanders ist, wie verwandle ich meinen Laptop in den "Ursprung / Master"?
  3. Holen Sie sich diese Nachricht zu verschwinden. Ich denke, Git ist über etwas unglücklich.

Auf meinem Mac wird Git Version 1.6.0.1 ausgeführt.


Wenn ich git remote show originwie von dbr vorgeschlagen laufe, erhalte ich Folgendes:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

Wenn ich git remote -vwie von Aristoteles Pagaltzis vorgeschlagen laufe, erhalte ich Folgendes:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    git@spilth.unfuddle.com:spilth/geekfor.git

Interessanterweise arbeite ich jetzt an meinem Projekt im geekforVerzeichnis, aber es besagt, dass mein Ursprung mein lokaler Computer im gfVerzeichnis ist. Ich glaube, es gfwar das temporäre Verzeichnis, das ich beim Konvertieren meines Projekts von Subversion zu Git verwendet habe, und wahrscheinlich das, von dem aus ich mich zum Entwirren gedrängt habe. Dann glaube ich, dass ich eine neue Kopie von Unfuddle in das geekforVerzeichnis ausgecheckt habe .

Es sieht also so aus, als ob ich dem Rat von dbr folgen und Folgendes tun sollte:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git

Antworten:


202

1. Finden Sie heraus, wo Git denkt, dass 'origin / master' verwendet git-remote

git remote show origin

..was wird so etwas wie zurückgeben ..

* remote origin
  URL: me@remote.example.com:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Eine Remote ist im Grunde eine Verbindung zu einem Remote-Repository. Wenn Sie das tun..

git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle

..git überträgt Änderungen an der von Ihnen hinzugefügten Adresse. Es ist wie ein Lesezeichen für Remote-Repositorys.

Beim Ausführen git statuswird überprüft, ob auf der Fernbedienung Commits fehlen (im Vergleich zu Ihrem lokalen Repository), und wenn ja, um wie viele Commits. Wenn Sie alle Ihre Änderungen auf "Ursprung" verschieben, werden beide synchronisiert, sodass Sie diese Nachricht nicht erhalten.

2. Wenn es woanders ist, wie verwandle ich meinen Laptop in den "Ursprung / Master"?

Es macht keinen Sinn, dies zu tun. Angenommen, "Ursprung" wird in "Laptop" umbenannt - Sie möchten dies niemals git push laptopvon Ihrem Laptop aus tun .

Wenn Sie die Ursprungsfernbedienung entfernen möchten, tun Sie ..

git remote rm origin

Dadurch wird nichts gelöscht (in Bezug auf Dateiinhalt / Revisionsverlauf). Dadurch wird die Meldung "Ihr Zweig ist um ... voraus" gestoppt, da Ihr Repository nicht mehr mit der Fernbedienung verglichen wird (weil es weg ist!).

Eine Sache, an die man sich erinnern sollte, ist, dass es nichts Besonderes gibt origin, es ist nur ein Standardname, den git verwendet.

Git originwird standardmäßig verwendet, wenn Sie Dinge wie git pushoder tun git pull. Wenn Sie also eine Fernbedienung haben, die Sie häufig verwenden (in Ihrem Fall Unfuddle), würde ich empfehlen, Unfuddle als "Ursprung" hinzuzufügen:

git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

oder führen Sie die obigen Schritte in einem Befehl mit set-url aus:

git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

Dann können Sie einfach tun git pushoder git pullaktualisieren, anstattgit push unfuddle master


1
Er schreibt, dass er in das originRepository pusht (obwohl er nicht weiß, wie das in Git-Begriffen funktioniert) - das Entfernen der Fernbedienung wäre für ihn kaum eine nützliche Sache.
Aristoteles Pagaltzis

10
Ich verstehe nicht, warum Leute Fragen umformulieren. Es ändert die Bedeutung der Frage, macht vorhandene Antworten sinnlos und lässt andere nicht wissen, dass der Fragesteller mehr Informationen benötigt, da seine Frage möglicherweise leicht „falsch“ ist.
stu

9
Das Entfernen des Remote-Ursprungs war genau das , was ich brauchte, da es auf ein lokales Repository zeigte, das nicht mehr existierte, nicht auf das Unfuddle-Repository.
Brian Kelly

3
stu: Umformulierung ist eine gute Sache! Wenn sie nicht an erster Stelle stehen, ist es sinnlos, Antworten zu erhalten, die das eigentliche Problem nicht lösen.
dbr

4
Aber es ist so viel einfacher, wütend zu werden und bitter zu sein. :-) Aber ich verstehe deinen Standpunkt.
stu

286

Ich bin auf diese Frage gekommen und habe nach einer Erklärung gesucht, was die Nachricht "Ihr Zweig ist voraus ..." im allgemeinen Schema von git bedeutet. Hier gab es keine Antwort darauf, aber da diese Frage derzeit oben in Google angezeigt wird, wenn Sie nach dem Ausdruck "Ihre Filiale ist vor" Ursprung / Master "" suchen, habe ich seitdem herausgefunden, was die Nachricht wirklich bedeutet Ich dachte, ich würde die Informationen hier posten.

Als Git-Neuling kann ich sehen, dass die Antwort, die ich brauchte, eine ausgesprochen neue Antwort war. Konkret bedeutet der Ausdruck "Ihr Zweig ist voraus ...", dass Sie Dateien hinzugefügt und in Ihr lokales Repository übernommen haben, diese jedoch nie an den Ursprung verschoben haben. Die Absicht dieser Nachricht wird weiter durch die Tatsache verschleiert, dass "git diff", zumindest für mich, keine Unterschiede zeigte. Erst als ich "git diff origin / master" ausführte, wurde mir gesagt, dass es Unterschiede zwischen meinem lokalen Repository und dem Remote-Master gibt.

Also, um klar zu sein:


"Ihre Niederlassung ist um ..." => Sie müssen zum Remote-Master pushen. Führen Sie "git diff origin / master" aus, um festzustellen, welche Unterschiede zwischen Ihrem lokalen Repository und dem Remote-Master-Repository bestehen.


Hoffe das hilft anderen Neulingen.

(Ich erkenne auch, dass es Konfigurations-Feinheiten gibt, die diese Lösung teilweise ungültig machen können, z. B. die Tatsache, dass der Master möglicherweise nicht "remote" ist und dass "origin" ein rekonfigurierbarer Name ist, der von Konventionen usw. verwendet wird. Neulinge tun dies jedoch Wir wollen einfache, unkomplizierte Antworten. Wir können später über die Feinheiten lesen, sobald wir das dringende Problem gelöst haben.)

Graf


2
@Earl Wäre hier keine git diff --cached origin/masterbessere Anweisung, da dort angegeben wird, was das Ergebnis des nächsten Pushs sein würde ? Der hervorgehobene Befehl, den Sie oben haben, zeigt auch nicht festgeschriebene und nicht bereitgestellte Dateien (ich denke, ich bin auch ein Git-Neuling)
nhed

48
Es ist auch möglich, dass Sie ausgeführt werden müssen, git fetchwenn Sie diesen Fehler nach a erhalten git pull remote branch. Ihre Refs sind möglicherweise veraltet. git fetchbehebt das.
Bryan Kennedy

Bedeutet der origin/masterTeil masterZweig im originRepo?
Rakib

1
Beachten Sie, dass diese Beschreibung unvollständig ist. Ich erlebe derzeit, # On branch master # Your branch is ahead of 'origin/master' by 3 commits. aber Git Diff Origin / Master zeigt nichts an (und die Option --cached ändert dies nicht). Und Git-Abruf ändert dies nicht, Git-Pull ändert dies nicht, Git-Reset - Hard ändert dies nicht. Um dies zu ändern, brauchte ich: git reset --hard origin / master Und ich wähle diese Route, weil andere Leute mit mir in diesem Repository arbeiten und ich ihre Tests nicht ungültig machen wollte und weil ich nicht herausfinden konnte, was diese Commits sind sind.
Rdm

1
Ich erhalte diese Nachricht auch, wenn ich von Origin zu Master / Master ziehen muss, anstatt sie zu verschieben. zB von einem anderen Zweig, wenn ich git checkout masterdie Nachricht bekomme, was bedeutet, dass ich git pull origin mastervor der Arbeit sollte. aber ich finde es sehr verwirrend, weil der Wortlaut der Nachricht das Gegenteil nahelegt
Anentropic

38

Ich hatte ein ähnliches Problem wie mein Arbeitsverzeichnis, ahead of origin by X commitsaber das git pullführte dazu Everything up-to-date. Ich habe es geschafft, das Problem zu beheben, indem ich diesen Rat befolgt habe . Ich poste dies hier, falls es jemand anderem mit einem ähnlichen Problem hilft.

Die grundlegende Lösung lautet wie folgt:

$ git push {remote} {localbranch}:{remotebranch}

Wo die Wörter in Klammern durch Ihren Remote-Namen, Ihren lokalen Filialnamen und Ihren Remote-Filialnamen ersetzt werden sollen. z.B

$ git push origin master:master

1
Danke, das hat es für mich getan. git diffhabe nichts gezeigt, und nachdem ich das getan habe, was du beschrieben hast, bekomme ich diese verwirrende und nervige Nachricht nicht mehr.
LaundroMat

1
Benötigt mehr Upvotes :). Die Antworten mit den höheren Stimmen waren alle "kein Effekt" für mich (dh "git fetch" - habe nichts getan ... überprüfe "git remote show origin" - nichts falsches, nichts muss geändert werden)
Adam


10

Ich dachte mein Laptop wäre der Ursprung ...

Das ist irgendwie unsinnig: originbezieht sich auf das Standard-Remote-Repository - das, aus dem Sie normalerweise die Änderungen anderer Personen abrufen / abrufen.

Wie kann ich:

  1. git remote -vwird dir zeigen, was originist; origin/masterist Ihr "Lesezeichen" für den letzten bekannten Status des masterZweigs des originRepositorys, und Ihr eigener masterist ein Verfolgungszweig für origin/master. Das ist alles so wie es sein sollte .

  2. Das tust du nicht. Zumindest macht es keinen Sinn, dass ein Repository das Standard-Remote-Repository für sich selbst ist.

  3. Ist es nicht. Es wird Ihnen lediglich mitgeteilt, dass Sie lokal so und so viele Commits durchgeführt haben, die sich nicht im Remote-Repository befinden (gemäß dem letzten bekannten Status dieses Repositorys).


1
Ich nahm an, dass mein Laptop der Ursprung war, da ich dort zuerst das Repository erstellt habe (wo es entstanden ist).
Brian Kelly

1
Im Gegensatz dazu ist es für mich durchaus sinnvoll, originlokal auf den Laptop zu verweisen, da Offline- oder Netzwerkwechsel ein sehr häufiger Fall für tragbare Geräte wie Laptops sind. Auf diese Weise Sie verwenden können git pushund git pulljederzeit, über keine Notwendigkeit zu denken , wenn Sie sich gerade an der richtigen Netzwerk verbunden sind. Diese lokale originVerbindung kann abhängig vom aktuellen Roaming-Status automatisch mit den realen Fernbedienungen synchronisiert werden, wenn eine Netzwerkverbindung verfügbar ist. Der problematische Teil ist, wann welche Synchronisierung ausgeführt werden soll, im Vergleich dazu ist der GIT-Teil recht einfach.
Tino

2
Das Zeigen originauf ein anderes Repository auf Ihrem Laptop ist natürlich absolut sinnvoll. Das Zeigen origindes Repository an sich aber nicht: es würde keinen Unterschied machen wird , ob Sie laufen git pushoder git pull, da ein Repository immer genau synchron mit sich selbst sowieso. Es ist ähm, irgendwie tautologisch.
Aristoteles Pagaltzis

3

[Lösung]

$ git push origin

^ das hat es für mich gelöst. Was es getan hat, es hat meinen Master (auf dem Laptop) mit "origin" synchronisiert, der sich auf dem Remote-Server befindet.


1

Ich habe mit diesem Problem zu kämpfen und keine der vorherigen Antworten befasst sich mit der Frage, wie ich sie sehe. Ich habe das Problem auf die Grundlagen reduziert, um zu sehen, ob ich mein Problem klarstellen kann.

Ich erstelle ein neues Repository (rep1), lege eine Datei hinein und schreibe es fest.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Ich erstelle einen Klon von rep1 und nenne ihn rep2. Ich schaue in rep2 und sehe, dass die Datei korrekt ist.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

In rep1 nehme ich eine einzelne Änderung an der Datei vor und schreibe sie fest. Dann erstelle ich in rep1 eine Fernbedienung, die auf rep2 zeigt und die Änderungen überträgt.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Wenn ich jetzt in rep2 gehe und einen 'Git-Status' mache, wird mir gesagt, dass ich dem Ursprung voraus bin.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

README in rep2 ist wie ursprünglich vor dem zweiten Commit. Die einzigen Änderungen, die ich vorgenommen habe, sind rep1 und alles, was ich tun wollte, war, sie an rep2 zu senden. Was begreife ich nicht?


1
Zwei Dinge: Die "Origin / Master" -Prüfung von rep2 betrachtet rep1 nicht wirklich. Wenn Sie in rep2 einen "Git Pull" ausführen, werden Sie feststellen, dass sie sich im selben Zustand befinden und sich nicht mehr beschweren. Um die Änderungen von einem Push in einer Arbeitskopie tatsächlich zu sehen, müssen Sie eine 'Git-Kaufabwicklung' durchführen - Pushs berühren niemals die Arbeitskopie des Ziel-Repos.
Walter Mundt

Ich dachte, das könnte der Fall sein, aber ich bekomme "git checkout M README Ihr Zweig ist um 1 Commit vor 'origin / master'." Aber meine Arbeitskopie liegt tatsächlich um 1 Commit zurück, nicht voraus.
Steve Hindmarch

1

Es wartet darauf, dass Sie "pushen". Versuchen:

$ git push


1

Ich hatte dieses Problem kürzlich und dachte, es lag daran, dass ich einige Dateien gelöscht hatte, die ich nicht mehr brauchte. Das Problem ist, dass git nicht weiß, dass die Dateien gelöscht wurden und es sieht, dass der Server sie noch hat. (Server = Ursprung)

Also rannte ich

git rm $(git ls-files --deleted)

Und dann lief ein Commit und Push.

Das hat das Problem gelöst.


1
Dies funktioniert nur, wenn die Commit-Nachricht delete - <Dateiname>
looneydoodle

1

Ich bin auch ein Idiot. Ich hatte das gleiche Problem mit den Nachrichten "Ihr Zweig ist durch N Commits vor dem Ursprung / Master". Das Ausführen des vorgeschlagenen 'git diff origin / master' zeigte einige Unterschiede, die ich nicht behalten wollte. So ...

Da mein Git-Klon für das Hosting vorgesehen war und ich eine genaue Kopie des Master-Repos wollte und keine lokalen Änderungen vornehmen wollte, beschloss ich, mein gesamtes Repo zu speichern und ein neues zu erstellen:

(auf dem Hosting-Computer)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

Aus Gründen der Zweckmäßigkeit habe ich Änderungen am Klon auf meinem Hosting-Computer vorgenommen. Nicht mehr. Ich werde diese Änderungen am Master vornehmen, dort ein Git-Commit durchführen und einen Git-Pull durchführen. Hoffentlich sollte dies meinen Git-Klon auf dem Hosting-Computer vollständig synchron halten.

/ Nara


0

Ich habe mich das Gleiche über mein Repo gefragt. In meinem Fall hatte ich eine alte Fernbedienung, auf die ich nicht mehr drückte, also musste ich sie entfernen.

Liste der Fernbedienungen abrufen:

git remote

Entfernen Sie die nicht benötigte

git remote rm {insert remote to remove}

0

Es ist möglich, auf ein bestimmtes Commit zurückzusetzen, bevor Ihre eigenen Commits stattfinden.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Verwenden git logSie diese Option, um herauszufinden, welches Commit das Commit war, das Sie vor den lokalen Änderungen hatten.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Beachten Sie die lokalen Commits und setzen Sie sie direkt auf das vorherige Commit zurück:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

Ich hatte das Problem "Ihre Filiale liegt bei nn Commits vor 'origin / master'." als ich zu einem Remote-Repository pushe mit:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

Als ich feststellte, dass sich meine Remote-Adresse in der Datei .git / FETCH_HEAD befand und verwendet wurde:

git push

Das Problem verschwand.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.