Como posso encontrar o local de origem / mestre no git e como alterá-lo?

227

Eu sou um novato no Git. Recentemente, mudei um projeto Rails do Subversion para o Git. Segui o tutorial aqui: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

Também estou usando unfuddle.com para armazenar meu código. Eu faço alterações no meu laptop Mac no trem para / do trabalho e as empurro para que eu não se mexa quando tiver uma conexão de rede usando o seguinte comando:

git push unfuddle master

Eu uso o Capistrano para implantações e recebo o código do repositório unfuddle usando a ramificação principal.

Ultimamente, tenho notado a seguinte mensagem quando executo o "status git" no meu laptop:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

E eu estou confuso sobre o porquê. Eu pensei que meu laptop era a origem ... mas não sei se o fato de eu ter originalmente retirado do Subversion ou enviado para o Unfuddle é o que está causando a mensagem aparecer. Como posso:

  1. Descubra onde o Git pensa 'origem / mestre'?
  2. Se estiver em outro lugar, como transformar meu laptop na 'origem / mestre'?
  3. Faça com que esta mensagem desapareça. Isso me faz pensar que Git está infeliz com alguma coisa.

Meu mac está executando o Git versão 1.6.0.1.


Quando executo git remote show originconforme sugerido pelo dbr, obtenho o seguinte:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

Quando corro git remote -vconforme sugerido por Aristóteles Pagaltzis, obtenho o seguinte:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    [email protected]:spilth/geekfor.git

Agora, curiosamente, estou trabalhando no meu projeto no geekfordiretório, mas ele diz que minha origem é minha máquina local no gfdiretório. Eu acredito que gffoi o diretório temporário que eu usei ao converter meu projeto do Subversion para o Git e provavelmente de onde trabalhei para me desfazer. Então, creio que fiz check-out de uma nova cópia do unfuddle para o geekfordiretório.

Parece que devo seguir os conselhos da dbr e fazer:

git remote rm origin
git remote add origin [email protected]:spilth/geekfor.git
Brian Kelly
fonte

Respostas:

202

1. Descubra onde o Git pensa que 'origem / mestre' está usando git-remote

git remote show origin

..que retornará algo como ..

* remote origin
  URL: [email protected]:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Um controle remoto é basicamente um link para um repositório remoto. Quando você faz..

git remote add unfuddle [email protected]/myrepo.git
git push unfuddle

..git enviará alterações para o endereço que você adicionou. É como um marcador para repositórios remotos.

Quando você executa git status, ele verifica se faltam confirmações no controle remoto (comparado ao seu repositório local) e, em caso afirmativo, quantas confirmações. Se você enviar todas as alterações para "origem", ambas estarão sincronizadas, para que você não receba essa mensagem.

2. Se estiver em outro lugar, como transformar meu laptop na 'origem / mestre'?

Não faz sentido fazer isso. Diga "origem" é renomeado para "laptop" - você nunca quer fazer isso git push laptopno seu laptop.

Se você deseja remover o controle remoto de origem, faça ..

git remote rm origin

Isso não excluirá nada (em termos de conteúdo do arquivo / histórico de revisões). Isso interromperá a mensagem "sua ramificação está adiantada por ..", pois não comparará mais seu repositório com o controle remoto (porque acabou!)

Uma coisa a lembrar é que não há nada de especial origin, é apenas um nome padrão que o git usa.

O Git usa originpor padrão quando você faz coisas como git pushou git pull. Portanto, se você tem um controle remoto, usa muito (Unfuddle, no seu caso), eu recomendaria adicionar unfuddle como "origin":

git remote rm origin
git remote add origin [email protected]:subdomain/abbreviation.git

ou faça o acima em um comando usando set-url:

git remote set-url origin [email protected]:subdomain/abbreviation.git

Então você pode simplesmente fazer git pushou git pullatualizar, em vez degit push unfuddle master

dbr
fonte
1
Ele escreve que empurra para o originrepositório (apesar de não estar ciente de como isso funciona em termos de git) - remover o controle remoto dificilmente seria uma coisa útil a fazer por ele.
Aristóteles Pagaltzis
10
Não entendo por que as pessoas reformulam as perguntas. Ele muda o significado da pergunta, faz com que as respostas existentes não façam sentido e não permite que outras pessoas saibam que o solicitante da pergunta precisa de mais informações com base no fato de que a pergunta pode ser um pouco "incorreta".
stu
9
Remover a origem remota era exatamente o que eu precisava, pois estava apontando para um repositório local que não existia mais, não para o repositório de distribuição.
Brian Kelly
3
stu: Reescrever é uma coisa boa! Se eles não pronunciaram claramente, em primeiro lugar, não há sentido em obter respostas que não resolvam o problema real.
DBR
4
Mas é muito mais fácil ficar com raiva e ser amargo. :-) Mas entendo o seu ponto.
stu
286

Cheguei a essa pergunta procurando uma explicação sobre o significado da mensagem "seu ramo está à frente de ...", no esquema geral do git. Não há resposta para isso aqui, mas como essa pergunta aparece no topo do Google no momento em que você pesquisa a frase "Sua filial está à frente de 'origem / mestre'", e desde então eu descobri o que realmente significa a mensagem , Pensei em publicar as informações aqui.

Então, sendo um novato no Git, posso ver que a resposta que eu precisava era claramente uma resposta para o novato. Especificamente, o que a frase "seu ramo está adiantado por ..." significa que existem arquivos que você adicionou e confirmou ao seu repositório local, mas que nunca foram enviados à origem. A intenção desta mensagem é ainda mais ofuscada pelo fato de que "git diff", pelo menos para mim, não mostrou diferenças. Não foi até eu executar o "git diff origin / master" que me disseram que havia diferenças entre meu repositório local e o mestre remoto.

Então, para ficar claro:


"sua ramificação está adiantada em ..." => Você precisa enviar para o mestre remoto. Execute "git diff origin / master" para ver quais são as diferenças entre o repositório local e o repositório principal remoto.


Espero que isso ajude outros iniciantes.

(Além disso, reconheço que existem sutilezas de configuração que podem invalidar parcialmente essa solução, como o fato de o mestre não ser realmente "remoto" e que "origem" é um nome reconfigurável usado por convenção etc. Mas os novatos fazem isso. não nos importamos com esse tipo de coisa. Queremos respostas simples e diretas. Podemos ler sobre as sutilezas mais tarde, depois de resolver o problema premente.)

Conde

Earl Jenkins
fonte
2
@ Earl não git diff --cached origin/masterseria uma instrução melhor aqui, pois afirma qual seria o resultado do próximo impulso? O comando destacado você tem acima mostra também arquivos não confirmadas & unstaged (eu penso, eu sou um novato git também)
nhed
48
Também é possível que você precise executar git fetchse estiver recebendo esse erro após a git pull remote branch. Seus árbitros podem estar desatualizados. git fetchcorrige isso.
Bryan kennedy
a origin/masterparte significa masterramificação no originrepositório?
Rakib 18/10/11
1
Observe que esta descrição está incompleta. No momento, estou enfrentando # On branch master # Your branch is ahead of 'origin/master' by 3 commits. Mas a origem / mestre do git diff não mostra nada (e a opção --cached não altera isso). E, o git fetch não muda isso, o git pull não muda isso, o git reset --hard não altera isso. Para mudar isso, eu precisava: git reset --hard origin / master E eu escolhi essa rota porque outras pessoas estão trabalhando comigo neste repositório e eu não queria invalidar seus testes e porque não conseguia descobrir o que essas confirmações estão.
Rdm
1
Também recebo esta mensagem quando preciso extrair, em vez de enviar para a origem / mestre. por exemplo, de outro ramo, se git checkout masterreceber a mensagem, o que significa que devo git pull origin masterantes de trabalhar. mas acho que é muito confuso, porque o texto da mensagem sugere o oposto
Anentropic
38

Eu tive um problema semelhante a este onde meu diretório de trabalho estava, ahead of origin by X commitsmas git pullestava resultando Everything up-to-date. Consegui corrigi-lo seguindo este conselho . Estou postando isso aqui, caso ajude alguém com um problema semelhante.

A correção básica é a seguinte:

$ git push {remote} {localbranch}:{remotebranch}

Onde as palavras entre colchetes devem ser substituídas por seu nome remoto, seu nome de filial local e seu nome de filial remota. por exemplo

$ git push origin master:master
Mims H. Wright
fonte
1
Obrigado, isso fez por mim. git diffnão mostrou nada e, depois de fazer o que você descreveu, não recebo mais essa mensagem confusa e irritante.
lavanderia
1
Precisa de mais votos positivos :). As respostas de maior votaram eram todos "nenhum efeito" para mim (ou seja, "git fetch" - não fez nada ... marque "origem mostram remoto git" - nada de errado, nada precisava mudar)
Adam
24

às vezes há uma diferença entre a versão em cache local do mestre de origem (origem / mestre) e o verdadeiro mestre de origem.

Se você executar, git remote updateisso sincronizará novamente o mestre de origem com o mestre de origem /

veja a resposta aceita para esta pergunta

Diferenças entre git pull origin master e git pull origin master /

chim
fonte
10

Eu pensei que meu laptop era a origem…

Isso é meio absurdo: originrefere-se ao repositório remoto padrão - aquele em que você geralmente busca / extrai as alterações de outras pessoas.

Como posso:

  1. git remote -virá mostrar o que originé; origin/masteré o seu "marcador" para o último estado conhecido da masterramificação do originrepositório e o seu próprio masteré uma ramificação de rastreamento para origin/master. Isto é tudo como deveria ser .

  2. Você não Pelo menos, não faz sentido que um repositório seja o repositório remoto padrão para si.

  3. Não é. É apenas dizer que você fez tantos e muitos commits localmente que não estão no repositório remoto (de acordo com o último estado conhecido desse repositório).

Aristóteles Pagaltzis
fonte
1
Eu assumi que meu laptop era a origem, pois foi aí que criei o repositório (onde ele se originou).
Brian Kelly
1
Por outro lado, faz perfeitamente sentido originapontar para o laptop localmente, pois estar offline ou trocar de rede é um caso muito comum para dispositivos portáteis como laptops. Dessa forma, você pode usar git pushe a git pullqualquer momento, não há necessidade de pensar se você está conectado à rede certa no momento. Esse local originpode ser sincronizado com os controles remotos reais automaticamente quando um link de rede estiver disponível, dependendo do status de roaming atual. A parte problemática é quando executar qual sincronização, em comparação com a parte GIT, é bastante fácil.
Tino
2
Apontar originpara outro repositório no seu laptop faz todo o sentido, com certeza. Apontar o originrepositório para si mesmo, no entanto, não faz: não faria diferença se você executa git pushou git pull, já que um repositório está sempre exatamente sincronizado consigo mesmo. É errado, meio tautológico.
Aristóteles Pagaltzis
3

[Solução]

$ git push origin

^ isso resolveu para mim. O que ele fez, sincronizou meu mestre (no laptop) com a "origem" que está no servidor remoto.

Chris
fonte
1

Estou lutando com esse problema e nenhuma das respostas anteriores aborda a questão da maneira que eu a vejo. Eu reduzi o problema de volta ao básico para ver se posso esclarecer meu problema.

Eu crio um novo repositório (rep1), coloco um arquivo nele e o comprometo.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Eu crio um clone de rep1 e chamo de rep2. Olho dentro do rep2 e vejo o arquivo está correto.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

No rep1, faço uma única alteração no arquivo e o confirmo. Em seguida, no rep1, crio um controle remoto para apontar para rep2 e enviar as alterações.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Agora, quando entro no rep2 e faço um 'status git', me dizem que estou à frente da origem.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

README no rep2 é como era originalmente, antes do segundo commit. As únicas modificações que fiz foram rep1 e tudo que eu queria fazer foi enviá-las para rep2. O que é que eu não estou entendendo?

Steve Hindmarch
fonte
1
Duas coisas: a verificação de "origem / mestre" do rep2 na verdade não olha para o rep1. Se você fizer um 'git pull' no rep2, ele perceberá que eles estão no mesmo estado e param de reclamar. Para realmente ver as alterações de um push em uma cópia de trabalho, você precisa fazer um 'git checkout' - os push nunca tocam na cópia de trabalho do repositório de destino.
Walter Mundt 29/07
Eu pensei que poderia ser esse o caso, mas recebo "git checkout M README Sua ramificação está à frente de 'origin / master' por 1 commit." Mas minha cópia de trabalho está realmente atrasada por 1 commit, não à frente.
30510 Steve Hindmarch
1

Está esperando você "empurrar". Experimentar:

$ git push

Vino
fonte
1

Eu tive esse problema recentemente e achei que era porque havia excluído alguns arquivos dos quais não precisava mais. O problema é que o git não sabe que os arquivos foram excluídos e vê que o servidor ainda os possui. (servidor = origem)

Então eu corri

git rm $(git ls-files --deleted)

E, em seguida, executou um commit e push.

Isso resolveu o problema.

looneydoodle
fonte
1
Isso funciona somente se a mensagem de confirmação de exclusão diz - <nome do arquivo>
looneydoodle
1

Eu sou um novato git também. Eu tive o mesmo problema com as mensagens 'sua filial está à frente da origem / mestre por N confirma'. Fazer o sugerido 'git diff origin / master' mostrou algumas diferenças que eu não queria manter. Assim ...

Como meu clone git era para hospedagem, e eu queria uma cópia exata do repositório principal e não queria manter nenhuma alteração local, decidi salvar todo o repositório e criar um novo:

(na máquina de hospedagem)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

Por conveniência, eu costumava fazer alterações no clone na minha máquina de hospedagem. Não mais. Farei essas alterações no mestre, git commit lá e executarei um git pull. Felizmente, isso deve manter meu clone do git na máquina de hospedagem em completa sincronização.

/ Nara

Nara Narasimhan
fonte
0

Eu queria saber a mesma coisa sobre o meu repo. No meu caso, eu tinha um controle remoto antigo que não estava mais pressionando, então precisava removê-lo.

Obter lista de controles remotos:

git remote

Remova o que você não precisa

git remote rm {insert remote to remove}
Jason Rikard
fonte
0

É possível redefinir para um commit específico antes que seus próprios commits ocorram.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Use git logpara encontrar qual confirmação era a confirmação que você tinha antes das alterações locais.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Anote as confirmações locais e redefina diretamente para a confirmação anterior:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
RobLoach
fonte
-1

Eu tive o problema "Sua ramificação está à frente de 'origin / master' por nn commits." quando enviei para um repositório remoto com:

git push ssh://[email protected]/yyy/zzz.git

Quando descobri que meu endereço remoto estava no arquivo .git / FETCH_HEAD e usei:

git push

o problema desapareceu.

novato
fonte