Ist es in Git möglich, zu einem anderen Zweig zu wechseln, ohne alle Dateien auszuchecken?
Nach dem Zweigwechsel muss ich alle Dateien löschen, neu generieren, festschreiben und zurückschalten. Das Auschecken von Dateien ist also nur Zeitverschwendung (und es gibt ungefähr 14.000 Dateien - es ist ein langer Vorgang).
Um alles klar zu machen:
Ich brauche das alles, um Dokumentation auf GitHub hochzuladen .
Ich habe ein Repository mit dem Zweig gh-pages . Wenn ich die Dokumentation lokal neu erstelle, kopiere ich sie in das Repository-Verzeichnis, schreibe sie fest und drücke sie an GitHub. Aber ich war nicht glücklich, weil ich zwei Kopien der Dokumentation vor Ort hatte. Und ich habe beschlossen, einen leeren Zweig zu erstellen und nach dem Festschreiben zu leeren Dateien zu wechseln und diese zu löschen. Das Zurückschalten ist jedoch ein langer Vorgang - daher habe ich diese Frage gestellt.
Ich weiß, dass ich einfach auf dem Gh-Pages- Zweig bleiben und Dateien löschen kann, aber ich mag keine schmutzig arbeitenden Bäume.
quelle
Antworten:
Ja, das kannst du machen.
Wenn Sie einen Commit für diesen Zweig durchführen müssen, möchten Sie auch den Index zurücksetzen, da Sie sonst etwas festschreiben, das auf dem zuletzt ausgecheckten Zweig basiert.
quelle
echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEAD
gefolgt vongit reset
, um auf einen Verweis anstelle eines Zweigs zu zeigen.git update-ref HEAD refs/heads/otherbranch
git stash
2.git checkout -b otherBranch
3.git stash pop
git update-ref
ist nützlich, verschiebt aber auch die Spitze des aktuellen Zweigs.Verwenden Sie nur grundlegende Git-Befehle:
Diese Antwort ist etwas länger als die von Charles, besteht jedoch ausschließlich aus grundlegenden Git-Befehlen, die ich verstehen und somit merken kann, sodass ich nicht mehr nachschlagen muss.
Markieren Sie Ihren aktuellen Standort (bei Bedarf zuerst festschreiben):
Setzen Sie den Marker zurück in den anderen Zweig, ohne das Arbeitsverzeichnis zu ändern:
Jetzt verweisen Temp und andere Verzweigungen auf dasselbe Commit, und Ihr Arbeitsverzeichnis bleibt unberührt.
Da Ihr HEAD bereits auf dasselbe Commit zeigt, wird das Arbeitsverzeichnis nicht berührt
Beachten Sie, dass diese Befehle auch von jedem grafischen Client verfügbar sind.
quelle
git reset --soft <branch where you want to go>
, die Aktualisierung des Index zu vermeidenZum Nutzen des Lesers:
Während ich denke, dass die Lösung von Charles Bailey die richtige ist, muss diese Lösung angepasst werden, wenn zu etwas gewechselt wird, bei dem es sich nicht um eine lokale Niederlassung handelt. Es sollte auch eine Möglichkeit geben, dies mit regulären Befehlen zu tun, was leicht zu verstehen ist. Folgendes habe ich mir ausgedacht:
Erklärt:
git checkout --detach
ist das gleiche wie das,git checkout HEAD^{}
was den aktuellen Zweig hinterlässt und in den "losgelösten Kopfzustand" übergeht. Die nächste ÄnderungHEAD
betrifft also keinen Zweig mehr. Das TrennenHEAD
wirkt sich weder auf den Arbeitsbaum noch auf den Index aus.git reset --soft commitish
bewegt sich dannHEAD
zum SHA des Gegebenencommitish
. Wenn Sie auch den Index aktualisieren möchten, lassen Sie ihn--soft
weg, aber ich empfehle dies nicht. Dies berührt wiederum nicht den Arbeitsbaum und (--soft
) nicht den Index.git checkout commitish
hängt dann wieder anHEAD
den gegebenencommitish
(Zweig) an. (Wenncommitish
es sich um eine SHA handelt, passiert nichts.) Auch dies wirkt sich weder auf den Index noch auf den Arbeitsbaum aus.Diese Lösung akzeptiert alles, was sich auf ein Commit bezieht, daher ist dies für einige
git
Alias ideal . Dasrev-parse
Folgende ist nur ein Test, um sicherzustellen, dass nichts in der Kette bricht, sodass Tippfehler nicht versehentlich in den Zustand des abgetrennten Kopfes wechseln (Fehlerbehebung wäre viel komplexer).Dies führt zu folgendem
git hop treeish
Alias:Zu Ihrer Information, Sie finden es in meiner Liste der
git
Aliase .quelle
$@
lieber verwenden als$*
? Der Unterschied besteht darin, dass $ @ nicht erweiterte Anführungszeichen enthält, die Leerzeichen enthalten.$@
ist hier definitiv nicht gemeint.$*
wird stattdessen verwendet$1
, so dassgit switch -f b
das gleiche wird,git switch '-f b'
was ein Fehler sein sollte. Auf diese Weise kann ich den Alias verkürzen, indem ich einige Fehlerbehandlungen wie!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
Wäre es nicht eine bessere Lösung, zwei Arbeitsverzeichnisse (zwei Arbeitsbereiche) mit einem Repository oder sogar zwei Repositorys zu haben?
Es gibt ein Tool von git-new-workdir im
contrib/
Abschnitt, das Ihnen dabei hilft.quelle
git-new-worktree
Skript ist älter als dergit worktree
Unterbefehl. Dieser Befehl war nicht verfügbar, als die Antwort geschrieben wurde. Das Skript erfordert beispielsweise Symlink-Unterstützung. IMHO ist es besser, native Unterstützung zu verwenden.Ich denke, Sie suchen nach dem Sanitärbefehl
git read-tree
. Dadurch wird der Index aktualisiert, es werden jedoch keine Dateien in Ihrem Arbeitsverzeichnis aktualisiert. Angenommen,branch
der Name des zu lesenden Zweigs lautet:Wenn Sie sich dann auf den gerade gelesenen Zweig festlegen möchten, müssen Sie außerdem:
quelle
read-tree
generiert den Fehler:fatal: Not a valid object name branch
wenn es noch keinegit switch branch
gabSie können Ihre HEAD-Datei mit einem anderen Filialnamen überschreiben:
echo "ref: refs / Heads / MyOtherBranch"> .git / HEAD
quelle
git symbolic-ref HEAD refs/heads/MyOtherBranch
kernel.org/pub/software/scm/git/docs/git-symbolic-ref.htmlgit symbolic-ref
?Bei so vielen Dateien ist es möglicherweise am besten, nur zwei Repos zu behalten, eines für jeden Zweig. Sie können Änderungen nach Bedarf hin und her ziehen. Dies wird weniger überraschend sein als der Versuch, mit Git Skorbut-Streiche zu spielen.
quelle
git-new-worktree
dafür stattdessen (incontrib/
) verwendenWenn Sie lediglich versuchen zu ändern, wo ein entfernter Zweig zeigt, können Sie dies mit "git push" tun, ohne Ihre lokale Kopie zu berühren.
http://kernel.org/pub/software/scm/git/docs/git-push.html
Um foo zu aktualisieren, um c5f7eba festzuschreiben, gehen Sie wie folgt vor:
Ich bin mir nicht sicher, ob du danach gesucht hast oder nicht.
quelle
Sie können nutzen
Vorherige-Verzweigungs-Festschreibungs-ID ist die Festschreibung, von der Sie die alten Daten kopieren möchten.
quelle
Angenommen, Sie möchten in Zweig A sein, aber mit den Dateien aus Zweig B.
Finden Sie die aktuelle Commit-Referenz von Zweig A mit Git-Protokoll, z. B. "99ce9a2".
Sie sollten sich jetzt in Zweig A mit einer Ordnerstruktur befinden, die B entspricht und als nicht bereitgestellte Änderungen angezeigt wird (ein Verlauf hat sich nicht geändert).
quelle