Skip to main content

Enterprise Server 3.20 está disponível no momento como versão candidata a lançamento.

O commit aparece no GitHub, mas não no meu clone local

Às vezes, um commit poderá ser visto no GitHub, mas não existirá no clone local do repositório.

Ao usar git show para ver um commit específico na linha de comando, talvez você receba um erro fatal.

Por exemplo, você poderá receber um erro bad object localmente:

$ git show 1095ff3d0153115e75b7bca2c09e5136845b5592
> fatal: bad object 1095ff3d0153115e75b7bca2c09e5136845b5592

No entanto, ao exibir o commit no sua instância do GitHub Enterprise Server, será possível vê-lo sem qualquer problema:

github.com/ACCOUNT/REPOSITORY/commit/1095ff3d0153115e75b7bca2c09e5136845b5592

Há várias explicações possíveis:

  • O repositório local está desatualizado.
  • O branch que contém o commit foi excluído, de modo que o commit não é mais referenciado.
  • Alguém fez push forçado no commit.

O repositório local está desatualizado

O repositório local pode não ter o commit ainda. Para obter informações do repositório remoto para o seu clone local, use git fetch:

git fetch REMOTE

Isso copia com segurança as informações do repositório remoto para o clone local sem fazer nenhuma alteração nos arquivos dos quais você fez check-out. Use git fetch upstream para obter informações de um repositório com fork ou git fetch origin para obter informações de um repositório que você apenas clonou.

Dica

Para obter mais informações, leia sobre como gerenciar repositórios remotos e buscar dados no livro Pro Git.

O branch que continha o commit foi excluído

Se um colaborador no repositório tiver excluído o branch contendo o commit ou tiver forçado o push no branch, o commit ausente poderá ter ficado órfão (ou seja, não poderá ser acessado de nenhuma referência) e, portanto, o fetch dele não poderá ser feito no clone local.

A boa notícia é que, se um colaborador tiver um clone local do repositório com o commit ausente, ele poderá fazer push de volta para GitHub. Eles precisam garantir que o commit esteja referenciado por um branch local e fazer o push dele como novo branch para o GitHub.

Suponha que a pessoa ainda tenha um branch local (chamando-o de B) que contém o commit. Pode ser que esteja rastreando o branch que recebeu um push forçado ou que foi excluído, e simplesmente ainda não foi atualizado. Para preservar o commit, é possível fazer o push desse branch local para um novo branch (vamos chamá-lo de recover-B) no GitHub. Para este exemplo, vamos supor que exista um repositório remoto chamado upstream por meio do qual há permissão de push para github.com/ACCOUNT/REPOSITORY.

A outra pessoa corre.

$ git branch recover-B B
# Create a new local branch referencing the commit
$ git push upstream B:recover-B
# Push local B to new upstream branch, creating new reference to commit

Agora, você pode executar:

$ git fetch upstream recover-B
# Fetch commit into your local repository.

Evitar pushes forçados

Evite o push forçado em um repositório, a menos que seja absolutamente necessário. Isso se aplica especialmente quando mais de uma pessoa pode fazer push no repositório. Se alguém fizer um push forçado em um repositório, esse push forçado poderá sobrescrever commits nos quais outras pessoas basearam seu trabalho. O push forçado modifica o histórico do repositório e pode corromper os pull requests.

Leitura adicional

  •         ["Como trabalhar com repositórios remotos" do livro _Pro Git_](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
    
  •         ["Recuperação de dados" do livro _Pro Git_](https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery)