Empurrando um repositório Git existente para Github só envia cerca de metade das submissões?
-
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 ...
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 cometerF
no diagrama acima
- O ramo
-
Fast-forward
master
paratmp
git checkout master
git merge tmp
-
master
agora está apontando para cometerF
.
-
-
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.