cambia ramo git senza checkout file

È ansible in git passare a un altro ramo senza estrarre tutti i file? Dopo aver cambiato ramo ho bisogno di cancellare tutti i file, rigenerarli, commetterli e tornare indietro. Quindi il controllo dei file è solo una perdita di tempo (e ci sono circa 14000 file – è un’operazione lunga).

Per rendere tutto chiaro:

Ho bisogno di tutto questo per caricare la documentazione su github.

Ho repo con ramo gh-pages. Quando ricostruisco la documentazione localmente, la copio nella directory repo, commetto e spingo su github. Ma non ero felice perché avevo due copie di documentazione a livello locale. E ho deciso di creare un ramo vuoto e dopo aver commesso passare a vuoto ed eliminare i file. Ma tornare indietro è un’operazione lunga, quindi ho fatto questa domanda.

So che posso lasciare il ramo gh-pages e cancellare i file, ma non mi piacciono gli alberi sporchi di lavoro)

Si, puoi fare questo.

git symbolic-ref HEAD refs/heads/otherbranch 

Se devi eseguire il commit su questo ramo, dovrai reimpostare l’indice, altrimenti finirai per commettere qualcosa in base all’ultimo ramo estratto.

 git reset 

Usando solo comandi git di base:

Questa risposta è un po ‘più lunga di quella di Charles, ma consiste solo in comandi di git di base che posso comprendere e quindi ricordare, eliminando la necessità di continuare a cercarlo.

Segna la tua posizione corrente (commetti prima se necessario):

 git checkout -b temp 

Reimposta (sposta) il marker sull’altro ramo senza modificare la directory di lavoro:

 git reset  

ora temp e altri rami puntano allo stesso commit e la tua directory di lavoro non è toccata.

 git checkout  

dal momento che il tuo HEAD sta già puntando allo stesso commit, la directory di lavoro non viene toccata

 git branch -d temp 

Nota che questi comandi sono anche prontamente disponibili da qualsiasi client grafico.

Non sarebbe una soluzione migliore avere due directory di lavoro (due aree di lavoro) con un repository, o anche due repository?

C’è uno strumento git-new-workdir in contrib/ section per aiutarti con questo.

Puoi sovrascrivere il tuo file HEAD con un nome di ramo diverso:

echo “ref: refs / heads / MyOtherBranch”> .git / HEAD

Penso che tu stia cercando il comando idraulico git read-tree . Questo aggiornerà l’indice ma non aggiornerà alcun file nella tua directory di lavoro. Ad esempio, assumendo il branch è il nome del ramo da leggere:

  git ramo di read-tree 

Se vuoi quindi impegnarti nel ramo che hai appena letto, dovrai anche:

  git simbolico-ref HEAD ref / heads / branch 

Per il beneficio del lettore:

Mentre penso che la soluzione di Charles Bailey sia corretta, questa soluzione ha bisogno di un ritouch quando si passa a qualcosa, che non è un ramo locale. Inoltre dovrebbe esserci un modo come farlo con i comandi regolari che è facile da capire. Ecco cosa mi è venuto in mente:

 git checkout --detach git reset --soft commitish git checkout commitish 

Ha spiegato:

  • git checkout --detach è lo stesso di git checkout HEAD^{} che lascia il ramo corrente dietro e passa allo “stato testa staccato”. Quindi la prossima modifica di HEAD non interessa più alcun ramo. Lo scollegamento di HEAD non influisce sul worktree né sull’indice.
  • git reset --soft commitish quindi sposta HEAD allo SHA del commitish . Se si desidera aggiornare anche l’indice, lasciare --soft via, ma io non consiglio di farlo. Questo, ancora una volta, non tocca il worktree, e ( --soft ) non l’indice.
  • git checkout commitish quindi attacca di nuovo HEAD al commitish (ramo) indicato. (Se commitish è uno SHA non succede nulla.) Anche questo non influisce sull’indice né sul worktree.

Questa soluzione accetta tutto ciò che si riferisce ad un commit, quindi questo è l’ideale per qualche alias git . La rev-parse sotto riportata è solo un test per essere sicuri, niente si rompe nella catena, in modo tale che gli errori di battitura non si spostino accidentalmente nello stato di testa staccata (il recupero degli errori sarebbe molto più complesso).

Questo porta al seguente alias git switch treeish :

 git config --global alias.switch '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f' 

Cordiali saluti, puoi trovarlo nella mia lista di alias git .

Con così tanti file, potrebbe essere meglio tenere solo due repository, uno per ogni ramo. Puoi tirare le modifiche avanti e indietro secondo necessità. Questo sarà meno sorprendente di provare a fare scherzi di scorbuto con git.

Se stai semplicemente cercando di cambiare dove punta un ramo remoto, puoi farlo con “git push” senza toccare la tua copia locale.

http://kernel.org/pub/software/scm/git/docs/git-push.html

Il formato di un parametro è un plus + opzionale, seguito dal riferimento sorgente , seguito da due punti:, seguito dal riferimento di destinazione . È usato per specificare con quale object deve essere aggiornato il ref nel repository remoto.

ad esempio, per aggiornare foo a commit c5f7eba fai quanto segue:

 git push origin c5f7eba:foo 

Non sono sicuro che sia quello che cercavi o no.

puoi fare uso di

  1. git checkout -f  2. git cherry-pick -x  

previous-branch-commit-id è il commit da cui si desidera copiare vecchi dati.