Git-Commit nicht abgeschlossen, kann aber auf diesem Computer nicht fortgesetzt werden

11

Manchmal habe ich das Problem, dass auf einer Arbeitsstation nicht festgeschriebener Code vorhanden ist, der nicht festgeschrieben werden kann, aber auf einer anderen Arbeitsstation oder einem anderen Laptop ausgeführt werden muss.

Hat jemand eine Lösung für dieses Problem, z. B. ein "Soft Commit" oder eine andere Möglichkeit, die Änderungen auf einen anderen Computer zu übertragen, um sie an einem anderen Ort zu bearbeiten?

Ich würde es vorziehen, nicht gezwungen zu sein, Änderungen vorzunehmen und voranzutreiben, die nicht ordnungsgemäß implementiert wurden.

csteifel
quelle
2
Dieser Beitrag ist ziemlich schwer zu lesen (Textwand). Hätten Sie etwas dagegen bearbeiten sie in eine bessere Form ing?
Mücke
..sounds wie du bist nach git stash...?
Simon Whitehead
@SimonWhitehead Ja, aber kann ich einen Stash leicht auf eine andere Maschine verschieben?
csteifel
Alle Git-Commits sind "Soft Commits".
user253751
Nicht wirklich ein Duplikat, da es das Problem in umgekehrter Richtung angeht
try-catch-finally

Antworten:

12

Im Folgenden wird davon ausgegangen, dass Ihr lokales Repo ein Klon eines Repos auf einem anderen Server ist, z. B. Github. und dass Sie berechtigt sind, Änderungen am Upstream-Server vorzunehmen. In meinem Beispiel habe ich dieses Upstream-Repo "Ursprung" genannt. Führen Sie git remote showden Befehl aus, um andere Repos aufzulisten. Dies kann Ihnen einen Hinweis darauf geben, wie es heißt.

Ich würde vorschlagen, einen Zweig zu machen, dann können Sie den Zweig auf einem anderen Rechner auschecken. Tatsächlich können Sie, wenn Sie eine Verzweigung erstellen, sobald Sie mit der Arbeit beginnen, sich auf Ihre Verzweigung "festlegen", eine Nachverfolgung und ein Backup Ihrer Arbeit erstellen, ohne über einen stabilen Codesatz verfügen zu müssen. Sobald Sie mit Ihrer Arbeit zufrieden sind, können Sie sie wieder in Ihrem "Master" -Zweig zusammenführen.

  • So verzweigen Sie Ihr Repo: git checkout -b MyNewBranch
  • So übertragen Sie festgeschriebene Änderungen an Ihrem neuen Zweig: git push origin MyNewBranch
  • So checken Sie einen Zweig auf einem anderen Computer aus: git checkout MyNewBranch
  • So wechseln Sie zu einem anderen Zweig (z. B. "Master"): git checkout master
  • Um MyNewBranch im Master wieder zusammenzuführen, gehen Sie wie folgt vor: git merge MyNewBranch
  • So listen Sie Niederlassungen auf: git branch
AMADANON Inc.
quelle
3
Ja, das Problem lässt sich im Wesentlichen lösen, wenn Sie immer in Ihrer eigenen Filiale arbeiten. Sie können so oft Sie möchten, ohne andere zu beeinflussen. Noch besser ist es, jedes Mal eine neue Verzweigung zu erstellen, wenn Sie mit der Arbeit an einem neuen Feature beginnen oder einen neuen Fehler beheben. Dies macht es sehr einfach, zwischen Codebasen hin und her zu springen.
Gort the Robot
Außerdem und der Grund, warum ich das tue: Wenn Sie einen Fehler in der Mitte machen, können Sie zu vorherigen Commits für den aktuellen Zweig zurückkehren. Oder springen Sie zurück, schnappen Sie sich ein Stück davon, springen Sie nach vorne und bewerben Sie sich.
AMADANON Inc.
1
Würde diese Methode nicht auch die unvollständigen Festschreibungen in der zusammengeführten Master-Verzweigung einschließen?
Eimrek
Ja, und (meiner Meinung nach) ist das wahrscheinlich keine schlechte Sache. Wenn Sie das nicht möchten, führen Sie die obigen Schritte aus, und erstellen Sie statt des Festschreibens Ihres Codes ein Diff (das alle Dateiänderungen, aber keine Festschreibungen enthält), wenden Sie es auf eine neue Kopie des Zweigs an und drücken Sie dann darauf.
AMADANON Inc.
2
in bezug auf " zu einem anderen zweig wechseln machengit branch -d master " bin ich verwirrt, fragt das git nicht den master zweig zu löschen ?? (das ist sowieso der Eindruck, den ich beim Lesen des Git-Handbuchs
bekomme
2

Mit können Sie git diffeinen Patch erstellen und dann auf einem anderen Computer anwenden. Sie können auch ein temporäres Commit erstellen und es dann von einem anderen Computer herunterladen. Sie können sogar einen temporären Zweig auf einem anderen Computer erstellen, Ihr temporäres Commit dorthin übertragen und dann den Zweig löschen.

Meine Lieblingsmethode ist die zweite: ein temporäres Commit erstellen, dann zu einem anderen Computer gehen und so etwas tun:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^
Aragaer
quelle
Warum so kompliziert und nicht nur mit git format-patch?
try-catch-finally
Nicht wirklich anders als git diff. Fehlt mir etwas?
Aragaer
1
git format-patch deadbee..badcab1e- Es werden .patchDateien für jedes Commit separat erstellt, wobei der Name und die Commit-Nachricht erhalten bleiben.
try-catch-finally
Erstellt es auch einen Patch für Änderungen, die noch nicht festgeschrieben wurden? Trennt es den aktuellen Index und Dinge, die noch nicht inszeniert sind? Sieht so aus, als ob es nicht so wäre.
Aragaer
Nein, nicht für nicht festgeschriebene / nicht bereitgestellte Änderungen. Aber da ein Commit niemandem schadet, solange Sie es nicht pushen, sollte es in Ordnung sein, ein Commit durchzuführen (mit einer klaren Meldung, die besagt, dass "WIP" - work in progress).
try-catch-finally
2

Ich lege es fest. Das i schiebe zum persönlichen Zweig , checke auf der anderen Seite aus und ändere. Und löschen Sie den persönlichen Zweig, wenn Sie fertig sind.

Natürlich können Sie direkt zwischen den Repos pushen, Sie können Bundle oder format-patch/ und verwenden am, aber eine persönliche Filiale ist bei weitem die einfachste Lösung. Und das Umschreiben von Historie ist keine große Sache, solange sie nicht an eine gemeinsame Zweigstelle weitergegeben wird. In vielen Projekten sollen die Benutzer die Feature-Zweige zurückspulen, damit sie für die Überprüfung leichter zu verstehen sind.

Jan Hudec
quelle
0

Der einfache Ansatz ist der, den Sie beschreiben: Kopieren Sie die .git verborgene Verzeichnis und die Projektdateien auf einen anderen Computer, auf dem Sie entweder ein Commit ausführen und den Vorgang abschließen oder einfach weiterarbeiten können.

Das .git Verzeichnis ist der Ort, an dem Ihr Git-Verlauf gespeichert wird. Wenn Sie dies zusammen mit den eigentlichen Dateien beibehalten, bleibt der gesamte Projektverlauf erhalten.

Wenn Sie die ursprüngliche Maschine dauerhaft nicht mehr verwenden, würde ich diesen Ansatz wahrscheinlich empfehlen.

joshin4colours
quelle
0

Wie andere geantwortet haben, sollten Sie sich bei Git nicht um unvollständigen Code in Ihren persönlichen Zweigen kümmern. Wenn Sie jedoch aus irgendeinem Grund wirklich wirklich wirklich nicht möchten, dass Ihre unvollendete Arbeit jemals das Hauptrepo berührt, können Sie die verteilte Natur von Git nutzen!

Es gibt ein einfaches Tool mit dem Namen git bundle, mit dem Sie Änderungen problemlos ohne ein zentrales Repository weitergeben können. Klonen Sie zuerst das Repo:

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

Nehmen Sie einige Änderungen vor und weisen Sie sie einem temporären Zweig zu:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

Nun bündeln Sie die Änderungen:

git bundle create ../tmp.bundle tmp_branch

Jetzt haben Sie eine Bundle-Datei, die Sie an Ihren neuen Computer senden können. Wie benutzt du es dort? Erstellen wir eine neue Arbeitskopie:

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

Wir müssen unser Bundle wie eine andere Fernbedienung behandeln, damit wir die Änderungen daraus abrufen können

git remote add tmp ../tmp.bundle
git fetch tmp

Da der springende Punkt darin bestand, die Änderungen spurlos zu übertragen, möchten wir sie in die Arbeitskopie quetschen, um das temporäre Commit zu verlieren:

git merge tmp/tmp_branch --squash

und alles, was übrig bleibt, ist, die temporäre Fernbedienung zu entfernen:

git remote remove tmp

VIOLA! Die Änderungen wurden in die neue Arbeitskopie übernommen, ohne eine Spur von Verzweigung oder Festschreibung zu hinterlassen!

Aber wirklich - dieser Prozess ist ziemlich langwierig und umständlich. Dies ist Git, nicht SVN - es sollte wirklich keinen Grund geben, Ihre persönliche Filiale nicht auf das zentrale Repo zu verlagern.

Idan Arye
quelle