Ziehen Sie für einen anderen Git-Zweig, ohne zu wechseln

55

Wir sind kürzlich von SVN zu Git gewechselt und haben gleichzeitig unsere Live-Systeme in die Versionskontrolle versetzt (anstelle von lokalem Checkout und Dateikopie zu leben).

Bei dem Projekt, dem ich zugewiesen bin, greifen wir alle auf dasselbe Repository zu und um Änderungen ins Leben zu rufen, sind wir einfach git pullda. Dies verursacht Probleme, da unsere Webdesigner Änderungen in das VCS übertragen, die noch nicht live sein sollten, sich jedoch in der Webtestumgebung befinden sollten.

Wenn einer der Entwickler nun ins Leben gerufen wird, erhält er alle (möglicherweise unvollendeten) Änderungen.

Ich dachte daran, live in eine zusätzliche Filiale zu wechseln und einfach zu verschmelzen, was sich geändert hat, aber aufgrund meines Mangels an Git-Kenntnissen habe ich keine Ahnung, wie.

Meine Idee ist:

  • Erstelle einen neuen Branch in live ( git branch live).
  • Jedes Mal muss etwas live gehen
    • Pull Änderungen im Master (wie: git checkout master; git pull; git checkout live)
    • git merge master

Das Problem ist, dass ein Wechsel zum Master oder ein direktes Einspielen in das Live-System zu Problemen führen würde. Daher würde ich dies lieber vermeiden.

Gibt es eine Möglichkeit, dies zu tun oder gibt es eine bessere Möglichkeit, das Live-System zu verwalten?

Morfildur
quelle
git pull --allWird Master standardmäßig nicht in Live gezogen, wird Master gezogen und mit Master zusammengeführt, und (falls auf dem Server vorhanden) wird Live gezogen, um in Live zusammengeführt zu werden. Hast Du es versucht?
Tobias Kienzler
Wird Ihr Problem durch eine Datei verursacht, die vor dem Verzweigen nicht der Versionskontrolle unterlag und nach einer späteren Änderung zum Master hinzugefügt wurde? Das ist , was vor mir passiert ist , in der Regel sollte es ausreichen , um vorübergehend die Datei zu umbenennen, oder wenn es nicht benötigt wird , leben , verwenden , git checkout -fum das Problem zu ignorieren - aber ein Backup machen!
Tobias Kienzler
1
related: stackoverflow.com/questions/3216360/…
Ciro Santilli

Antworten:

21

Sie können git stashvor dem Auschecken von master und pullen und nach dem Auschecken von live wieder verwenden git stash pop(oder wenn Ihr Git älter ist git stash applyund git stash clearvorausgesetzt, Sie haben nichts anderes verstaut).

Tobias Kienzler
quelle
6
git pull --allruft alle Fernbedienungen ab, aber es wird weiterhin versucht, einen Zweig (oder den Standardzweig) mit dem aktuellen Zweig zusammenzuführen.
Mipadi
@mipadi ja, aber nur der aktuelle Zweig in sich selbst, ohne zu versuchen, Master auszulösen und den Konflikt zu verursachen, nein?
Tobias Kienzler
Es wird der Zweig zusammengeführt, der so konfiguriert ist, dass er automatisch mit dem aktuellen Zweig zusammengeführt wird (sofern ein solcher Zweig konfiguriert ist).
Mipadi
1
@ Superole Es ist dokumentiert als "fetch all remotes", das nicht nur mehrere Repositorys, sondern auch Zweige enthält. Im Nachhinein git fetch --allwäre es vielleicht eine bessere Antwort gewesen
Tobias Kienzler,
2
@TobiasKienzler Weist git nur an, von allen konfigurierten Fernbedienungen abzurufen. Am häufigsten wird nur ein entfernter benannter Ursprung verwendet. WENN Sie zufällig mehr als eine Fernbedienung mit demselben Zweig wie Ihr aktueller haben und diese nicht in einer schnellen Vorwärtsbeziehung zueinander stehen, können Sie mit dieser --allOption die verschiedenen Versionen des Zweigs mit einem Oktopus in den aktuellen Zweig einfügen ! Mein Rat ist also, sich fern zu halten, es --allsei denn, das ist es, wonach Sie suchen, denn in den meisten anderen Fällen gibt es Ihnen nichts.
Superole
73

Mit dem folgenden Befehl konnte ich Änderungen von origin/masterin masterabrufen, während ich in einem anderen Zweig arbeitete:

git fetch origin master:master
Jeff B
quelle
6
Genial! Genau das, wonach ich gesucht habe - das muss viel deutlicher dokumentiert werden ...
Markus Shepherd
2
Dokumentation dazu finden Sie hier: git-scm.com/docs/git-fetch#_examples
c1moore
fetch! =pull
D. Kovács
5

Lösen Sie zuerst das Problem. Sie sollten nicht zu einer Niederlassung drängen, zu der sie kein Geschäft haben.

Was Sie zu fragen scheinen, wäre so etwas wie

git checkout live
git pull origin master

Dadurch wird versucht, den Remote-Master und Ihren Live-Zweig zusammenzuführen.

Josh K
quelle
Das Problem ist, dass wir derzeit nur einen Zweig haben und es nicht wirklich möglich ist, das zu ändern, da jeder zu sehr an SVN gewöhnt ist und nicht bereit ist, die Vorteile von etwas Neuem zu lernen. Es kann nur ein neuer Zweig im Live-Verzeichnis erstellt werden. Das Zusammenführen des Remote-Masters mit dem Live-Zweig ist das, was ich vermeiden möchte, da ich niemanden daran hindern kann, Debug-Code, unvollständige Funktionen, Syntaxfehler und alles andere an den Master zu senden (schließlich bin ich nur der Junior-Entwickler). Vielen Dank für Ihren Vorschlag.
Morfildur
2
@dbeme: Sie könnten Tarballs und Patches verwenden. ;) Es sei denn, sie sind bereit, Git zu lernen (und es ist überhaupt nicht schwer, sich zu verzweigen und zusammenzuführen), werden Sie Probleme haben.
Josh K
0

Ich empfehle Ihnen, ein Test-Git-Repo zu erstellen, das jeder ausführen kann. Alle Repos, einschließlich Ihrer Live-Website, sind Klone des Testrepos. Auf diese Weise kann jeder zum Testen übergehen, ohne die Live-Website zu berühren. Wenn jemand die Live-Site aktualisieren muss, können Sie die Live-Site aus dem Git-Test-Repo ziehen. Dieser Workflow ist dem von SVN ziemlich ähnlich. Für zusätzliche Flexibilität empfehle ich die Verwendung des von Ihnen beschriebenen "Live" -Zweigs.

Zusammenfassend ist jedermanns Git-Repo ein Klon des Test-Repos. Die Live-Produktionsstätte ist nur ein Klon des Test-Repos. Alternativ könnte das Testen ein Klon der Live-Produktion sein, so dass ein "Git Push" immer in Richtung Produktion geht.

Weitere Optionen sind das Hinzufügen des "Live" -Zweigs zu diesem Arrangement oder ein "Staging" -Repo zwischen Test und Produktion. Für zusätzliche Sicherheit empfehle ich, den Zugriff auf das Live-Git-Repo einzuschränken und die Benutzer dazu zu zwingen, ein geschütztes Skript zu verwenden, das den Pull für die Live-Produktion ausführt.

Kantenschneider
quelle