Empurrando um repositório Git existente para Github só envia cerca de metade das submissões?

StackOverflow https://stackoverflow.com/questions/237408

  •  04-07-2019
  •  | 
  •  

Pergunta

Eu tenho um repositório Git local tenho vindo a desenvolver em alguns dias: tem dezoito commits até agora. Hoje à noite, eu criei um repositório GitHub privado eu estava esperando para empurrá-lo para; no entanto, quando eu fiz isso, ele só acabou empurrando oito dos dezoito commit Github. Eu apaguei o repo Github e repetida, com o mesmo resultado.

Quaisquer pensamentos sobre por que isso pode estar acontecendo? Eu fiz esse procedimento antes, sem algumas vezes com sucesso, por isso estou um pouco perplexo.

Atualizar : Não é, e sempre foi, apenas o branch master neste repo. Só para abordar algumas das respostas postadas ...

Foi útil?

Solução

Eu levei um olhar para o repositório em questão e aqui está o que estava acontecendo:

  • git checkout [commit id] Em algum momento, RPJ tinha realizado. Esta cabeça apontada em um frouxo comprometer em vez de um ramo reconhecido. Eu acredito que este é o problema "pendurado de cabeça" que CesarB está se referindo.
  • Não perceber esse problema, ele continuou fazendo mudando e cometê-los, que bateu cabeça para cima o tempo todo. No entanto, HEAD estava apontando para uma cadeia pendente de commits, não em um ramo reconhecido.
  • Quando ele foi para empurrar suas mudanças, git empurrou tudo até o topo do mestre, que foi apenas cerca de metade do caminho através da árvore atual, ele estava ligado.
  • A confusão se seguiu

Este diagrama deve torná-la mais clara:

                 -- D -- E -- F
                /             ^
   A -- B -- C -              |
   ^         ^               HEAD
   |         |
 remote    master

Quando ele tentou empurrar suas alterações, apenas a A através C foram empurrados e remote subiu para C. Ele não conseguia commits D através F para empurrar, porque eles não são referenciados por um ramo conhecido.

Aqui está o que você vê quando você está neste estado:

$ git branch
* (no branch)
master

A solução é mover master até F na cadeia pendente de confirmações. Aqui está como eu fiz isso.

  • Criar um ramo legítimo para o estado atual:

    git checkout -b tmp

    • O ramo tmp agora está apontando para cometer F no diagrama acima
  • Fast-forward master para tmp

    git checkout master

    git merge tmp

    • master agora está apontando para cometer F.
  • Jogue fora o seu ramo temporária

    git branch -d tmp

  • Você pode feliz empurrar para o repositório remoto e ele deve enviar todas as suas alterações.

Outras dicas

De Git 1.7.3 em diante, você pode fazer isso com um simples comando:

git checkout -B master

Os meios de comutação -b “criar filial aqui antes check-out” e -B é a versão incondicional de que, “mesmo que o ramo já existe - nesse caso, movê-lo aqui antes check-out”.


Uma abordagem muito simples para corrigir este tipo de problema é simplesmente apagar o ramo master e recriá-lo. Afinal, filiais em git são apenas nomes para commits eo ramo master é nada de especial.

Assim, supondo que o commit atual é o que deseja master a ser, você simplesmente fazer

git branch -D master

para excluir o ramo master existente, em seguida, fazer

git checkout -b master

para a) criar um novo ramo chamado master que aponta para o atual cometer e b) atualização HEAD para apontar para o ramo master. Depois disso, HEAD será anexado ao master e, portanto, master vai avançar sempre que você cometer.

Verifique se você está empurrando os galhos corretos e que os ramos têm realmente o que você pensa que eles têm. Em particular, verifique se você não tem uma cabeça individual, que pode ser um pouco confuso se não for feito de propósito.

A maneira mais fácil de verificar é usar gitk --all, que mostra graficamente todos os ramos, o chefe, e muito mais.

Suponho que a primeira coisa que eu faria seria para executar git fsck em seu repositório local para se certificar de que está tudo em ordem.

Eu nunca vi esse problema antes, e eu não posso pensar no que poderia estar errado.

Eu não tenho a reputação de comentar diretamente sobre a resposta antes de CesarB, mas gitk --all não funciona neste caso, porque ele só enumera ramos conhecidos.

mostra gitk HEAD este problema, mas não é totalmente clara. A arma fumegante é que mostra master-se para baixo da árvore comprometer em vez de no mais recente cometer.

Assim, verifica-se que ambos: o hash comprometer em .git / refs / heads / master estava correto e as informações em .git / logs / refs / heads / master estava incompleto; em que eu quero dizer que só subiu ao e incluiu o hash especificado no .git / refs / heads / master cometer.

Uma vez que eu fixo esses arquivos (à mão), e empurrou de volta para Github, tudo era gravy novamente. Eu ainda tenho idéia o que aconteceu para fazer as coisas neste estado, mas estou feliz que eu, pelo menos, descobri a correção.

No caso de alguém está se perguntando: para corrigir .git / refs / heads / master, Acabei de substituir o conteúdo desse arquivo com o mais recente comprometer de hash (HEAD), e correção .git / logs / refs / heads / master , eu simplesmente copiou o conteúdo do .git / logs / HEAD em .git / logs / refs / heads / master. Fácil peasy ... NÃO.

Eu tive esse mesmo problema duas vezes, e finalmente descobri o que eu estava fazendo que estava causando isso. No processo de edição de um velho comprometer com git rebase -i, em vez de chamar git commit --amend, eu estava chamando git commit -a por força do hábito, imediatamente seguido por git rebase --continue, é claro. Alguém pode ser capaz de explicar o que está acontecendo nos bastidores, mas parece que o resultado é o problema CABEÇA destacada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top