Wie bringt man Git dazu, immer aus einem bestimmten Zweig zu ziehen?

485

Ich bin kein Git-Meister, aber ich arbeite schon seit einiger Zeit damit, mit verschiedenen Projekten. In jedem Projekt kann ich immer git clone [repository]und von diesem Punkt an immer git pull, solange ich natürlich keine herausragenden Änderungen habe.

Vor kurzem musste ich zu einem früheren Zweig zurückkehren, und zwar mit git checkout 4f82a29. Als ich wieder zum Ziehen bereit war, stellte ich fest, dass ich meinen Zweig wieder auf Master setzen musste. Jetzt kann ich nicht mit einer Geraden ziehen, git pullsondern muss angeben git pull origin master, was nervt und mir anzeigt, dass ich nicht ganz verstehe, was los ist.

Was hat sich geändert, was es mir nicht erlaubt, eine Straße git pullohne Angabe des Ursprungsmasters zu erstellen, und wie kann ich sie zurück ändern?

AKTUALISIEREN:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = [email protected]:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

UPDATE 2: Um klar zu sein, ich verstehe, dass meine ursprüngliche Methode möglicherweise falsch war, aber ich muss dieses Repo reparieren, damit ich es einfach git pullwieder verwenden kann. Derzeit führt Git Pull zu:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

Ich kann erkennen, git pullwelcher Zweig zusammengeführt werden soll, und er funktioniert ordnungsgemäß, aber git pullnicht wie ursprünglich vor meinem git checkout.

David Smith
quelle
Wie sieht deine .git / config aus? Was haben Sie getan, nachdem Sie dieses Commit ausgecheckt haben?
Ryan Graham
Haben Sie zusätzlich zu 4f82a29 Commits durchgeführt?
Pat Notz
Pat, ich habe darüber hinaus keine Commits gemacht. Dies ist auf einem Server, und wir mussten auf eine stabile Version zurücksetzen, um einen von uns erstellten Fehler zu verbergen. Dieses System ist nicht für Entwicklungszwecke gedacht, daher wollte ich einfach einen Rollback durchführen, warten, während wir den Fehler behoben haben, und dann zur Head-Version zurückkehren.
David Smith
2
Ryan, ich habe die .git / config aktualisiert. Nach dem Auschecken habe ich nichts gemacht. Dieser Computer ist ein Server, nicht für die Entwicklung.
David Smith

Antworten:

730

Unter [branch "master"], versuchen Sie Folgendes in die Git - Konfigurationsdatei des Repo - Zugabe ( .git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

Dies sagt Git 2 Dinge:

  1. Wenn Sie sich in der Hauptniederlassung befinden, ist die Standardfernbedienung origin.
  2. Verwenden Sie git pullbei Verwendung in der Hauptverzweigung, ohne dass eine Fernbedienung und eine Verzweigung angegeben sind, die Standardfernbedienung (Ursprung) und führen Sie die Änderungen aus der Fernverzweigung zusammen.

Ich bin mir nicht sicher, warum dieses Setup aus Ihrer Konfiguration entfernt worden wäre. Möglicherweise müssen Sie den Vorschlägen folgen, die auch andere Personen veröffentlicht haben, aber dies kann funktionieren (oder zumindest helfen).

Wenn Sie die Konfigurationsdatei nicht manuell bearbeiten möchten, können Sie stattdessen das Befehlszeilentool verwenden:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
Mipadi
quelle
2
Das funktionierte auch für mich, ich hatte ein Projekt von Github ausgecheckt. Ich verwende OS X 10.4
Sam Barnum
Vielen Dank sehr viel - das auf einem einzigen Entwickler Projekt mir passiert mit einem „Server“ Repository und zwei Computer (was ich drücken verwendet / Pull häufig ohne Probleme vor dem Glitch), weiß nicht , warum, aber das Update gearbeitet fein!
Chesterbr
1
Was meinst du mit Under [branch "master"]
ianj
3
@ianj: In der Git-Konfigurationsdatei (aus dem Repo-Stammverzeichnis .git/config).
Mipadi
1
@ianj: Über die Befehlszeile können Sie dies $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/masterstattdessen immer tun .
Mipadi
139

Wenn Sie möchten, können Sie diese Optionen über die Befehlszeile (anstatt die Konfigurationsdatei zu bearbeiten) wie folgt festlegen:

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

Wenn Sie wie ich sind und möchten, dass dies die Standardeinstellung für alle Ihre Projekte ist, einschließlich derer, an denen Sie möglicherweise in Zukunft arbeiten, fügen Sie sie als globale Konfigurationseinstellung hinzu:

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master
Kopf
quelle
12
+1 für die Kenntnis des Zauberworts "refs / Heads / Master". Ich hatte keine Probleme , herauszufinden , wie die Variable zu setzen, hatte aber absolut keine Ahnung , was sie setzen auf , und der Mann Seiten waren nicht viel helfen. Nachdem ich diese Antwort gefunden hatte, fand ich schließlich den richtigen Platz in den Dokumenten. Für Neugierige: Das Zauberwort bezieht sich auf einen Dateipfad, .gitin dem git den Hash-Code des masteraktuellen Commits zu behalten scheint .
Mokus
84
git branch --set-upstream master origin/master

Dadurch werden Ihrer configDatei die folgenden Informationen hinzugefügt :

[branch "master"]
    remote = origin
    merge = refs/heads/master

Wenn Sie branch.autosetuprebase = alwaysdann haben, wird es auch hinzufügen:

    rebase = true
cmcginty
quelle
1
Ich finde, dass dies der einfachste Weg ist, Git dazu zu bringen, sich wie gefragt zu verhalten, insbesondere wenn es mehr Zweige gibt, nicht nur entfernt (selbst wenn Sie dies für jeden Zweig tun müssen, ist es einmal pro Zweig)
s3v3n
2
Ich habe es gerade versucht und erhalte den Fehler fatal: Not a valid object name: 'origin/master'., obwohl origines sich um eine gültige Fernbedienung handelt master, die wie üblich in beiden Repos vorhanden ist.
Ken Williams
2
Ken, du musst zuerst "git fetch origin" machen, um die Namen der Remote-Zweige zu erhalten.
Eric Lee
14
Neuerer Git möchte, dass du ihn benutzt git branch --set-upstream-to=origin/master master.
Orbeckst
52

Es fällt mir schwer, mich an die genauen git configoder git branchArgumente wie in den Antworten von mipadi und Casey zu erinnern, daher verwende ich diese beiden Befehle, um die vorgelagerte Referenz hinzuzufügen:

git pull origin master
git push -u origin master

Dadurch werden die gleichen Informationen zu Ihrer .git / config hinzugefügt, aber ich finde es einfacher, mich daran zu erinnern.

Luke Sampson
quelle
1
Genau. Dies sollte die einfachste Antwort sein.
Linbianxiaocao
2
Ihre Antwort sollte enthalten, warum es funktioniert, und sich auf den Abschnitt in den Dokumenten beziehen, in dem erklärt wird, warum.
vfclists
24

Git Pull kombiniert zwei Aktionen: Abrufen neuer Commits aus dem Remote-Repository in den verfolgten Zweigen und anschließendes Zusammenführen dieser Commits in Ihrem aktuellen Zweig .

Wenn Sie ein bestimmtes Commit ausgecheckt haben, haben Sie keinen aktuellen Zweig, sondern nur HEAD, das auf das zuletzt von Ihnen vorgenommene Commit verweist. Es sind git pullalso nicht alle Parameter angegeben. Deshalb hat es nicht funktioniert.

Basierend auf Ihren aktualisierten Informationen versuchen Sie, Ihr Remote-Repo zurückzusetzen. Wenn Sie das Commit kennen, das den Fehler verursacht hat, können Sie am einfachsten damit umgehen, indem Sie git revertein neues Commit aufzeichnen, das das angegebene Buggy-Commit rückgängig macht:

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

Da es Ihr Server ist, den Sie ändern möchten, gehe ich davon aus, dass Sie den Verlauf nicht neu schreiben müssen, um das fehlerhafte Festschreiben zu verbergen.

Wenn der Fehler in einem Merge-Commit eingeführt wurde, funktioniert dieses Verfahren nicht. Siehe Zurücksetzen einer fehlerhaften Zusammenführung .

Paul
quelle
Sie geben mir hier eine großartige Ausbildung, die ich sehr schätze, aber ich kann meine Situation möglicherweise nicht sehr gut beschreiben, sodass dies nicht genau zu meinem Workflow passt. Ich werde wahrscheinlich eine weitere Frage stellen, um das zu beantworten. Danke aber, Paul! +1 für Sie, Sir.
David Smith
Ich habe deine Situation nur falsch verstanden. Ich bin froh, dass du die Antwort bekommen hast, die du brauchst.
Paul
12

Es gibt auch eine Möglichkeit, Git so zu konfigurieren, dass immer der entsprechende Remote-Zweig zu dem Zweig gezogen und verschoben wird, der gerade in der Arbeitskopie ausgecheckt ist. Es wird als Tracking-Zweig bezeichnet, der von git ready standardmäßig empfohlen wird .

Für das nächste Repository über dem aktuellen Arbeitsverzeichnis:

git config branch.autosetupmerge true

Für alle Git-Repositorys, die nicht anders konfiguriert sind:

git config --global branch.autosetupmerge true

Art der Magie, IMHO aber dies könnte helfen , in Fällen , in denen der spezifischen Zweig ist immer der aktuelle Zweig .

Wenn Sie zum ersten Mal einen Zweig branch.autosetupmergeeingerichtet trueund ausgecheckt haben, informiert Sie Git über die Verfolgung des entsprechenden Remote-Zweigs:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

Git wird dann automatisch zu diesem entsprechenden Zweig pushen:

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To [email protected]:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages
Bengt
quelle
10

Da ich meine Git-Konfigurationsdatei nicht bearbeiten wollte, folgte ich den Informationen in @ mipadis Beitrag und verwendete:

$ git pull origin master

quelle
13
Es ging darum, dies automatisch zu tun, anstatt es anzugeben.
Eric
4

Ihre unmittelbare Frage, wie man es zum Master macht, müssen Sie tun, was es sagt. Geben Sie in Ihrer Zweigstellenkonfiguration die Referenz an, aus der abgerufen werden soll.

[branch "master"]
    merge = refs/heads/master
Ryan Graham
quelle
Sollte das nicht "Refs / Heads / Master" sein? Laut git-pull (1) ist dies der Name des Zweigs am Remote-Standort, der standardmäßig zusammengeführt wird.
Adam Monsen
Ja, du hast recht. Das Repo, aus dem ich mein Beispiel genommen habe, ist ein Sonderfall. Korrigiert.
Ryan Graham
0

Ich wollte nur einige Informationen hinzufügen, die wir überprüfen können, ob sie sich git pullautomatisch auf einen Zweig beziehen oder nicht.

Wenn Sie den Befehl ausführen git remote show origin(unter der Annahme, dass origin der Kurzname für remote ist), zeigt git diese Informationen an, unabhängig davon, ob eine Standardreferenz für vorhanden ist git pulloder nicht.

Unten finden Sie eine Beispielausgabe (aus der Git-Dokumentation).

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Bitte beachten Sie den Teil, in dem der lokale Zweig für Git Pull konfiguriert ist.

In diesem Fall git pullwird darauf verwiesengit pull origin master

Wenn Sie das Repository mit git clone geklont haben, werden diese Dinge zunächst automatisch erledigt. Wenn Sie jedoch eine Fernbedienung manuell mit git remote add hinzugefügt haben, fehlen diese in der git-Konfiguration. Wenn dies der Fall ist, fehlt in der Ausgabe von der Teil, in dem "Lokaler Zweig konfiguriert für 'git pull':" angezeigt wird git remote show origin.

Die nächsten Schritte, die ausgeführt werden müssen, wenn keine Konfiguration für vorhanden ist git pull, wurden bereits durch andere Antworten erläutert.

dr_dev
quelle