web-dev-qa-db-de.com

wechseln Sie den Git-Zweig ohne Überprüfung der Dateien

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.

78
tig

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
87
CB Bailey

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.

33
user1115652

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.

14
Jakub Narębski

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 .

9
Tino

Sie können Ihre HEAD -Datei mit einem anderen Zweignamen überschreiben:

echo "ref: refs/heads/MyOtherBranch"> .git/HEAD

8
user157005

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.

0
Tim Abell

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.

0
Norman Ramsey

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.

0
Haseena Parkar