É possível no Git mudar para outro branch sem fazer check-out de todos os arquivos?
Depois de alternar o branch, preciso excluir todos os arquivos, gerá-los novamente, confirmar e voltar. Portanto, verificar os arquivos é uma perda de tempo (e existem cerca de 14.000 arquivos - é uma operação longa).
Para deixar tudo claro:
Preciso de tudo isso para carregar a documentação no GitHub.
Eu tenho um repositório com o branch gh-pages . Quando eu reconstruo a documentação localmente, eu a copio para o diretório do repositório, faço commit e envio para GitHub. Mas não fiquei feliz, porque tinha duas cópias da documentação localmente. E decidi criar um branch vazio e depois de fazer commit, mudar para vazio e deletar arquivos. Mas voltar é uma operação longa - por isso fiz esta pergunta.
Sei que posso simplesmente deixar no branch gh-pages e excluir arquivos, mas não gosto de árvores com trabalho sujo.
fonte
Respostas:
Sim, você pode fazer isso.
Se você precisa fazer um commit neste branch, você vai querer redefinir o índice também, caso contrário, você vai acabar cometendo algo baseado no último branch com check-out.
fonte
echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEAD
seguido degit reset
para apontar para um ref em vez de uma ramificação.git update-ref HEAD refs/heads/otherbranch
git stash
2.git checkout -b otherBranch
3.git stash pop
git update-ref
é útil, mas também move a ponta do branch atual.Usando apenas comandos git básicos:
Essa resposta é um pouco mais longa do que a de Charles, mas consiste apenas em comandos git básicos que posso entender e, portanto, lembrar, eliminando a necessidade de ficar procurando por eles.
Marque sua localização atual (confirme primeiro, se necessário):
Redefina (move) o marcador para o outro ramo sem alterar o diretório de trabalho:
agora temp e outro branch apontam para o mesmo commit, e seu diretório de trabalho permanece intocado.
uma vez que seu HEAD já está apontando para o mesmo commit, o diretório de trabalho não é tocado
Observe que esses comandos também estão disponíveis em qualquer cliente gráfico.
fonte
git reset --soft <branch where you want to go>
evitar a atualização do índicePara o benefício do leitor:
Embora eu ache que a solução de Charles Bailey seja a correta, essa solução precisa de um ajuste ao mudar para algo que não seja uma filial local. Também deve haver uma maneira de fazer isso com comandos regulares que seja fácil de entender. Aqui está o que eu descobri:
Explicado:
git checkout --detach
é o mesmogit checkout HEAD^{}
que deixa o ramo atual para trás e vai para o "estado principal destacado". Portanto, a próxima modificação doHEAD
no more afeta qualquer branch. A desanexaçãoHEAD
não afeta a árvore de trabalho nem o índice.git reset --soft commitish
então se moveHEAD
para o SHA do dadocommitish
. Se você quiser atualizar o índice também, pare--soft
, mas eu não recomendo fazê-lo. Isso, novamente, não afeta a árvore de trabalho e (--soft
) não o índice.git checkout commitish
em seguida, anexaHEAD
aocommitish
(ramo) fornecido novamente. (Secommitish
for um SHA, nada acontece.) Isso também não afeta o índice nem a árvore de trabalho.Esta solução aceita tudo que se refere a um commit, então isso é ideal para alguns
git
alias. O querev-parse
segue é apenas um teste para ter certeza de que nada quebra na cadeia, de forma que erros de digitação não mudem acidentalmente para o estado de cabeça destacado (a recuperação de erros seria muito mais complexa).Isso leva ao seguinte
git hop treeish
alias:Para sua informação, você pode encontrá-lo na minha lista de
git
apelidos .fonte
$@
vez de$*
? A diferença é que $ @ não expande os argumentos entre aspas, que possuem espaços dentro.$@
definitivamente não significa aqui.$*
é usado em vez de$1
, de modo quegit switch -f b
se torna o mesmogit switch '-f b'
que deveria ser um erro. Desta forma, posso encurtar o alias, deixando de lado algum tratamento de erros como!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
Não seria uma solução melhor ter dois diretórios de trabalho (duas áreas de trabalho) com um repositório, ou mesmo dois repositórios?
Há a ferramenta git-new-workdir na
contrib/
seção para ajudá-lo com isso.fonte
git-new-worktree
script é anterior aogit worktree
subcomando; este comando não estava disponível quando a resposta foi escrita. O script, por exemplo, requer suporte de link simbólico; IMHO é melhor usar o suporte nativo.Acho que você está procurando o comando do encanamento
git read-tree
. Isso atualizará o índice, mas não atualizará nenhum arquivo em seu diretório de trabalho. Por exemplo, supondo quebranch
seja o nome do ramo a ser lido:Se você quiser se comprometer com o branch que acabou de ler, também precisará:
fonte
read-tree
gera o erro:fatal: Not a valid object name branch
se não houver nenhumgit switch branch
aindaVocê pode substituir seu arquivo HEAD com um nome de branch diferente:
echo "ref: refs / heads / MyOtherBranch"> .git / HEAD
fonte
git symbolic-ref HEAD refs/heads/MyOtherBranch
kernel.org/pub/software/scm/git/docs/git-symbolic-ref.htmlgit symbolic-ref
?Com tantos arquivos, talvez seja melhor manter apenas dois repositórios, um para cada branch. Você pode puxar as alterações para frente e para trás conforme necessário. Isso vai ser menos surpreendente do que tentar pregar peças no git.
fonte
git-new-worktree
para isso (emcontrib/
)Se você está simplesmente tentando mudar para onde um branch remoto aponta, você pode fazer isso com "git push" sem tocar em sua cópia local.
http://kernel.org/pub/software/scm/git/docs/git-push.html
por exemplo, para atualizar foo para cometer c5f7eba, faça o seguinte:
Não tenho certeza se é isso que você quer ou não.
fonte
você pode fazer uso de
previous-branch-commit-id é o commit de onde você deseja copiar os dados antigos.
fonte
digamos que você queira estar no ramo A, mas com os arquivos do ramo B
encontre a referência do commit atual do branch A com o log do git, por exemplo, "99ce9a2",
você agora deve estar na ramificação A, com uma estrutura de pasta correspondente a B, que aparece como alterações não planejadas (um histórico não mudou).
fonte