Digamos que haja uma ramificação remota chamada origin/nameofbranch . Quando faço checkout neste branch usando Git no Intellij , ele cria automaticamente um branch local com o mesmo nome, por que isso está acontecendo?
relate perguntas
-
Acidentalmente, cliquei em um botão que excluiu todos os commits feitos para um site, mas tenho um backup no meu computador - como restaurar? [fechado]
-
Modificando autores e utilizando Git Rebase em fluxos de trabalho colaborativos
-
Como imprimir facilmente as informações padrão do autor do Git?
-
Qual é a maneira certa de extrair minhas alterações do gitlab para o servidor remoto?
-
Posso rebasear e mesclar uma solicitação pull para uma ramificação que bloqueia push e commits não assinados?
Porque você não pode trabalhar em uma filial de rastreamento remoto. As ramificações de rastreamento remoto existem para fornecer uma visão off-line da última vez que você sincronizou com o repositório remoto (
push
,fetch
, oupull
).Se você quiser trabalhar, precisará de uma filial local que seja mais ou menos independente da filial remota. Caso contrário, as atualizações da filial remota substituiriam seu trabalho local e você não teria a opção de reconciliar as filiais. O IntelliJ assume que você realizará trabalho local e, posteriormente, criará uma filial local para você trabalhar.
Se você fizer o mesmo com o
git
cliente de linha de comando, ele o moverá para um estado HEAD desanexado :Isso é muito diferente de
git checkout yourbranch
, que é uma maneira DWIM ("faça o que eu quis dizer") de criar uma filial local a partir da filial de rastreamento remoto. A resposta de Romain Valeri ajuda você se quiser aprender mais sobre a lógica DWIM.Parece que o IntelliJ é inteligente o suficiente para ligar
git checkout <branch>
nos bastidores, em vez degit checkout origin/<branch>
. Isso é bom, veja a resposta do knittl para entender o porquê.Quando você tenta fazer checkout branch
foo
, o git basicamente segue estas etapas:Se existir localmente (ou seja, se você tiver um file
.git/refs/heads/foo
), é uma simples opção de ramificação (com todas as advertências usuais sobre git checkout, é claro).Se não existir localmente , o git verifica se um dos seus controles remotos tem uma referência chamada
foo
. Então:Se existir mais de um (por exemplo, se você tiver ambos
origin/foo
eorigin2/foo
), então ele para e pede para você desambiguar.Se não existir, o checkout falhará com uma mensagem sobre o pathspec não existir.
Se existir exatamente um , o git assume que você deseja que uma nova ramificação local seja associada a ele. Duas consequências: ele cria a nova ramificação apontando para o mesmo commit
<your-remote>/foo
que aponta e, em seguida, define a configuração de rastreamento de ramificação entre os dois. (Ele transforma vocêgit checkout foo
em um implícitogit checkout -b foo <your-remote>/foo
e então faz agit config branch.foo.remote '<your-remote>'
egit config branch.foo.merge 'refs/heads/foo'
)Como outros já disseram, a pergunta não deixa claro o que você esperava que ela fizesse, mas podemos analisar as coisas possíveis que ela poderia fazer.
Porém, primeiro precisamos deixar claro o que significa "verificar um branch" no git:
Agora, o objetivo do rastreamento remoto de ramificações
origin/nameofbranch
é que elas atuem como um cache de alguma versão remota do repositório, atualizada por comandos comogit fetch
egit pull
. Se o git executasse todas as três etapas normalmente, você acabaria adicionando commits locais ao branch "remoto", o que seria muito confuso.Então o git pode fazer uma de duas coisas:
origin/nameofbranch
e comece a trabalhar em uma filial local ".Há uma certa opinião sobre o que é melhor; mas trabalhar no estado de "cabeça independente" provavelmente confunde mais as pessoas do que ter filiais locais criadas para elas.
Porque é isso que
git checkout
acontece . Da documentação desse comando:Atualiza os arquivos na árvore de trabalho para corresponder à versão no índice ou na árvore especificada.
A árvore de trabalho é um diretório local na sua máquina.
Um "branch" é na verdade apenas uma coleção de commits. Ao fazer check-out de um branch, você obtém todos os commits que juntos colocam o sistema de arquivos em um estado específico. Suas ferramentas, por exemplo, IntelliJ, precisam ser capazes de ler os arquivos na ramificação conforme necessário e lêem os arquivos do sistema de arquivos local, não de um servidor.