Kann man in git zu einem anderen Zweig wechseln, ohne alle Dateien auszuchecken? Nach dem Wechseln der Verzweigung muss ich alle Dateien löschen, neu erstellen, festschreiben und zurückschalten. Das Auschecken von Dateien ist nur eine Verschwendung von Zeiten (und es gibt ungefähr 14000 Dateien - es ist eine lange Operation).
Um alles klar zu machen:
Ich brauche das alles, um Dokumentation zu github hochzuladen.
Ich habe Repo mit gh-pages branch. Wenn ich die Dokumentation lokal neu aufbaue, kopiere ich sie in das Repo-Verzeichnis, Commit und Push in github. Aber ich war nicht glücklich, weil ich vor Ort zwei Kopien der Dokumentation hatte. Und ich beschloss, einen leeren Zweig zu erstellen und nach dem Festschreiben auf leere Dateien zu wechseln und Dateien zu löschen. Aber das Zurückschalten ist eine lange Operation - also habe ich diese Frage gestellt.
Ich weiß, dass ich einfach auf gh-pages verzweigen und Dateien löschen kann, aber ich mag keine schmutzigen Bäume.
Ja, das kannst du tun.
git symbolic-ref HEAD refs/heads/otherbranch
Wenn Sie für diesen Zweig einen Commit ausführen müssen, müssen Sie auch den Index zurücksetzen. Andernfalls müssen Sie auf der Grundlage des letzten ausgecheckten Zweigs etwas festschreiben.
git reset
Nur grundlegende git-Befehle verwenden:
Diese Antwort ist etwas länger als die von Charles, aber sie besteht nur aus grundlegenden git-Befehlen, die ich verstehen kann und mich somit erinnere, so dass es nicht mehr nötig ist, nachzuschauen.
Markieren Sie Ihren aktuellen Standort (wenn nötig zuerst festschreiben):
git checkout -b temp
Setzen Sie die Markierung in den anderen Zweig zurück, ohne das Arbeitsverzeichnis zu ändern:
git reset <branch where you want to go>
jetzt verweisen temp und andere Verzweigungen auf dasselbe Commit, und Ihr Arbeitsverzeichnis bleibt unberührt.
git checkout <branch where you want to go>
da Ihr HEAD bereits auf dasselbe Commit zeigt, wird das Arbeitsverzeichnis nicht berührt
git branch -d temp
Beachten Sie, dass diese Befehle auch von jedem grafischen Client verfügbar sind.
Wäre es nicht besser, zwei Arbeitsverzeichnisse (zwei Arbeitsbereiche) mit einem Repository oder sogar zwei Repositorys zu haben?
Es gibt git-new-workdir tool in contrib/
, um Ihnen dabei zu helfen.
Zum Nutzen des Lesers:
Obwohl ich denke, dass die Lösung von Charles Bailey eine korrekte ist, benötigt diese Lösung einen Tweak, wenn auf etwas umgestellt wird, bei dem es sich nicht um einen lokalen Zweig handelt. Es sollte auch einen Weg geben, wie man es mit regulären Befehlen tun kann, was leicht zu verstehen ist. Folgendes habe ich mir ausgedacht:
git checkout --detach
git reset --soft commitish
git checkout commitish
Erklärt:
git checkout --detach
ist das gleiche wie git checkout HEAD^{}
, der den aktuellen Zweig zurücklässt und in den Zustand "losgelöst" geht. Die nächste Änderung von HEAD
betrifft also keinen Zweig mehr. Das Trennen von HEAD
hat weder Auswirkungen auf den Arbeitsbaum noch auf den Index.git reset --soft commitish
bewegt HEAD
an die SHA der angegebenen commitish
. Wenn Sie auch den Index aktualisieren möchten, lassen Sie --soft
weg, aber ich empfehle es nicht. Dies berührt wiederum nicht den Worktree und (--soft
) nicht den Index.git checkout commitish
fügt dann HEAD
wieder der angegebenen commitish
(Verzweigung) hinzu. (Wenn commitish
ein SHA ist, passiert nichts.) Auch dies wirkt sich nicht auf den Index oder die Arbeitsbaumstruktur aus.Diese Lösung akzeptiert alles, was sich auf ein Commit bezieht. Dies ist ideal für einen git
-Alias. Der rev-parse
ist nur ein Test, um sicherzustellen, dass nichts in der Kette bricht, so dass Tippfehler nicht versehentlich in den Status eines abgelösten Kopfes wechseln (Fehlerbehebung wäre viel komplexer).
Dies führt zu folgendem git switch treeish
-Alias:
git config --global alias.switch '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'
Zu Ihrer Information finden Sie es in meiner Liste der git
Aliase .
Ich denke, Sie suchen nach dem Installationsbefehl Wenn Sie sich dann zu dem Zweig verpflichten möchten, den Sie gerade lesen, müssen Sie außerdem:git read-tree
git symbolic-ref HEAD refs/heads/branch
Sie können Ihre HEAD -Datei mit einem anderen Zweignamen überschreiben:
echo "ref: refs/heads/MyOtherBranch"> .git/HEAD
Wenn Sie einfach versuchen, den Ort eines entfernten Zweigs zu ändern, 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
Das Format eines Parameters <refspec> ist ein optionales Plus +, gefolgt von der Quellenreferenz <src>, gefolgt von einem Doppelpunkt:, gefolgt von der Zielreferenz <dst>. Es wird verwendet, um anzugeben, mit welchem <src> -Objekt die Ref. <Dst> im fernen Repository aktualisiert werden soll.
um beispielsweise foo mit c5f7eba zu aktualisieren, gehen Sie folgendermaßen vor:
git Push Origin c5f7eba:foo
Nicht sicher, ob Sie danach waren oder nicht.
Bei so vielen Dateien können Sie am besten zwei Repos speichern, eines für jeden Zweig. Sie können die Änderungen nach Bedarf hin und her ziehen. Das ist weniger überraschend als der Versuch, mit Git Scurvy Tricks zu spielen.
sie können davon Gebrauch machen
1. git checkout -f <new-branch>
2. git cherry-pick -x <previous-branch-commit-id>
previous-branch-commit-id ist der Commit, von dem aus Sie die Daten kopieren möchten.