Wie kann ich in Git Folgendes tun?
Mein aktueller Zweig ist branch1 und ich habe einige lokale Änderungen vorgenommen. Jetzt ist mir jedoch klar, dass ich diese Änderungen eigentlich auf branch2 anwenden wollte. Gibt es eine Möglichkeit, diese Änderungen anzuwenden / zusammenzuführen, sodass sie in Zweig2 zu lokalen Änderungen werden, ohne sie in Zweig1 festzuschreiben?
Antworten:
Da Ihre Dateien noch nicht festgeschrieben sind in
branch1
:oder
Wie von Benjamin kommentiert (siehe
git stash
Manpage ):quelle
-u
, so:git stash -u
.Verstecken, vorübergehende Festschreibungen und erneutes Basieren können übertrieben sein. Wenn Sie die geänderten Dateien noch nicht zum Index hinzugefügt haben, können Sie möglicherweise nur den anderen Zweig auschecken.
Dies funktioniert so lange, wie sich keine Dateien, die Sie bearbeiten, zwischen Zweig1 und Zweig2 unterscheiden. Sie bleiben auf branch2, und Ihre Arbeitsänderungen bleiben erhalten. Wenn sie unterschiedlich sind, können Sie angeben, dass Sie Ihre lokalen Änderungen mit den Änderungen zusammenführen möchten, die durch Wechseln der Zweige mit der
-m
Option zum Auschecken eingeführt wurden.Wenn Sie dem Index Änderungen hinzugefügt haben, möchten Sie diese Änderungen zuerst mit einem Reset rückgängig machen. (Dadurch bleibt Ihre Arbeitskopie erhalten, es werden nur die bereitgestellten Änderungen entfernt.)
quelle
checkout -m
es in einer bestimmten Situation nicht "sicher" ist (möglicherweise würde dies zu einem Zusammenführungskonflikt führen), würde Stash einen Vorteil bieten (z. B. können Sie einen Stash-Pop entfernen)?.orig
?Eine kürzere Alternative zum zuvor erwähnten Stash-Ansatz wäre:
git stash
git stash branch new_branch_name
Dann einfach
add
undcommit
die Änderungen an diesem neuen Zweig.quelle
WARNUNG: Nicht für Git-Neulinge.
Dies kommt in meinem Workflow so oft vor, dass ich fast versucht habe, einen neuen Git-Befehl dafür zu schreiben. Der übliche
git stash
Ablauf ist der richtige Weg, aber etwas umständlich. Normalerweise mache ich zuerst ein neues Commit, da, wenn ich mir die Änderungen angesehen habe, alle Informationen in meinem Kopf frisch sind und es besser ist, einfach mit dem zu beginnen,git commit
was ich gefunden habe (normalerweise ein Bugfix des Masters, den ich bei der Arbeit an einem entdeckt habe Feature-Zweig) sofort.Wie ich das erreiche, sieht so aus:
git commit
die Änderungen sofort mit einer guten Commit-Nachricht.git reset HEAD~1
um das Commit von der aktuellen Verzweigung rückgängig zu machen.Manchmal später (asynchron) oder sofort in einem anderen Terminalfenster:
cd my-project-master
Das ist ein weiterer WD, der das gleiche teilt.git
git reflog
um den Bugfix zu finden, den ich gerade gemacht habe.git cherry-pick SHA1
des Commits.Optional (immer noch asynchron) können Sie dann Ihren Feature-Zweig neu gründen (oder zusammenführen), um den Bugfix zu erhalten, normalerweise, wenn Sie eine PR einreichen möchten und Ihren Feature-Zweig und WD bereits bereinigt haben:
cd my-project
Das ist der Haupt-WD, an dem ich arbeite.git rebase master
um die Bugfixes zu bekommen.Auf diese Weise kann ich ununterbrochen an der Funktion weiterarbeiten und muss mich nicht darum kümmern,
git stash
irgendetwas zugit checkout
tun oder meinen WD vor einem zu bereinigen (und dann den Backout des Feature-Zweigs erneut überprüfen zu lassen.) Und trotzdem alle meine Bugfixes aufmaster
anstatt gehen lassen versteckt in meinem Feature-Zweig.IMO
git stash
undgit checkout
ist eine echte PIA, wenn Sie gerade an einem großen Feature arbeiten.quelle
my-project-master
Teilen des gleichen.git
lässt es so klingen. Warum nichtgit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
, dann später (asynchron) , während aufmaster
,git cherry-pick <SHA1 of the commit(s) in bugfixABC
? (oder sogar, um zu vermeiden, dass Sie die SHA1 herausfinden müssengit rebase --onto master feature bugfixABC
, von wo auch immer Sie sich gerade befinden. Das bedeutet, dass Sie dies direkt nach demgit reset
oben genannten tun können , während Sie eingeschaltet sindfeature
.)checkout -m
ist es einfach besser.Wenn es um festgeschriebene Änderungen geht, sollten Sie sich git-rebase ansehen, aber wie in einem Kommentar von VonC erwähnt, wäre git-stash sicherlich der gute Weg, dies zu tun, wenn Sie über lokale Änderungen sprechen.
quelle
Die bisher gegebenen Antworten sind nicht ideal, da sie viel unnötige Arbeit zur Lösung von Zusammenführungskonflikten erfordern oder zu viele Annahmen treffen, die häufig falsch sind. So macht man es perfekt. Der Link führt zu meiner eigenen Seite.
So verpflichten Sie sich zu einem anderen Zweig in git
Sie haben nicht festgeschriebene Änderungen an
my_branch
, für die Sie eine Festschreibung vornehmen möchtenmaster
, ohne alle Änderungen von zu übernehmenmy_branch
.Beispiel
Erläuterung
Beginnen Sie mit der Zusammenführung
master
in Ihrem Zweig, da Sie dies ohnehin irgendwann tun müssen. Jetzt ist der beste Zeitpunkt, um Konflikte zu lösen.Die
-u
Option (aka--include-untracked
) ingit stash -u
hindert Sie daran , untracked Dateien zu verlieren , wenn Sie später tungit clean -f -d
innerhalbmaster
.Nachdem
git checkout master
es wichtig ist, dass Sie NICHT tungit stash pop
, weil Sie diesen Vorrat später benötigen. Wenn Sie das Versteck Pop erstellt inmy_branch
und führen Sie danngit stash
inmaster
, werden Sie unnötige merge Konflikte verursachen , wenn Sie später , dass Stash geltenmy_branch
.git reset
stuft alles auf, was daraus resultiertgit stash apply
. Beispielsweise werden Dateien, die im Stash geändert wurden, aber nicht vorhanden sindmaster
, als Konflikte "von uns gelöscht" bereitgestellt.git checkout .
undgit clean -f -d
verwerfen Sie alles, was nicht festgeschrieben ist: alle Änderungen an nachverfolgten Dateien sowie alle nicht nachverfolgten Dateien und Verzeichnisse. Sie sind bereits im Stash gespeichert undmaster
würden beim Zurückschalten unnötige Zusammenführungskonflikte verursachen, wenn Sie zurück zu wechselnmy_branch
.Der letzte
git stash pop
basiert auf dem Originalmy_branch
und verursacht daher keine Zusammenführungskonflikte. Wenn Ihr Stash jedoch nicht verfolgte Dateien enthält, die Sie als Master festgelegt haben, beschwert sich git, dass "nicht verfolgte Dateien nicht aus dem Stash wiederhergestellt werden konnten". Um diesen Konflikt zu beheben, löschen Sie die Dateien von Ihrem Arbeits Baum, danngit stash pop
,git add .
undgit reset
.quelle