No Git, qual é a diferença entre origem / mestre e mestre de origem?

290

Eu sei, origem é um termo para o repositório remoto e master é o ramo lá.

Estou propositadamente omitindo o "contexto" aqui e espero que a resposta não dependa do contexto. Portanto, nas linhas de comando git, qual é a diferença entre origem / mestre e mestre de origem . Existe uma maneira não ambígua de entender quando usar origem / mestre e quando devo usar o mestre de origem ?

Senthil Kumaran
fonte

Respostas:

390

Na verdade, existem três coisas aqui: origin masterduas coisas separadas e origin/masteruma coisa. Três coisas no total.

Dois ramos:

  • master é uma filial local
  • origin/masteré uma ramificação remota (que é uma cópia local da ramificação chamada "master" no controle remoto chamado "origin")

Um controle remoto:

  • origin é um controle remoto

Exemplo: execute duas etapas

Como origin/masteré um ramo, você pode mesclá-lo. Aqui está um exemplo em duas etapas:

Etapa um, busque masterno controle remoto origin. A masterramificação originativada será buscada e a cópia local será nomeada origin/master.

git fetch origin master

Então você origin/masterentra master.

git merge origin/master

Em seguida, você pode enviar suas novas alterações de mastervolta para origin:

git push origin master

Mais exemplos

Você pode buscar várias ramificações por nome ...

git fetch origin master stable oldstable

Você pode mesclar várias ramificações ...

git merge origin/master hotfix-2275 hotfix-2276 hotfix-2290
Dietrich Epp
fonte
5
A primeira parte é realmente útil. Não consegui conectar como. Mais exemplos, especialmente o merge, é aplicável. Obrigado pela resposta.
Senthil Kumaran
1
... porque quando eu "git checkout origin / master", entro em um estado desanexado. Se eu realmente tenho uma cópia local da ramificação principal remota, por que não consigo trabalhar, confirmar e adicionar a ela? Ou talvez eu possa, mas por que isso é desapegado?
stu
3
Você só pode se comprometer com uma filial local; portanto, ao fazer check-out de uma filial remota, você obtém "cabeça desanexada". Obviamente, é uma cópia local de uma filial remota, mas ainda é uma filial remota. Não há regra de que "mestre" esteja relacionado a "origem / mestre", eles podem ser completamente diferentes.
Dietrich Epp 28/03
7
@ Jwan622 "origem é um remoto" ... "origem" é apenas um nome, você pode escolher qualquer nome para controles remotos, mas "origem" é o nome padrão. Um controle remoto é um repositório em outro lugar. Pode ser o GitHub ou um computador diferente ou pode estar em outro lugar no mesmo computador.
Dietrich Epp 30/10
2
@ Jwan622: "git remote add" é um comando que cria um novo controle remoto. "origem" é o nome que o controle remoto adiciona. Como "origem" é apenas um nome, você pode escolher um nome diferente, se quiser. Por exemplo, git remote add home my-server:projects/my-projectadiciona um controle remoto chamado "casa". Você pode consultar a documentação: git-scm.com/docs/git-remote
Dietrich Epp
16

origin/masteré uma entidade (uma vez que não é uma ramificação física) representando o estado da masterramificação no controle remoto origin.

origin masteré o ramo masterno controle remoto origin.

Então, temos os seguintes:

  • origem / mestre (uma representação ou um ponteiro para a ramificação remota)
  • mestre - ( ramificação real )
  • <Seu_local_branch> ( ramificação real )
  • <Seu_local_branch2> ( ramificação real )
  • <Seu_local_branch3> ( ramificação real )

Exemplo (na filial local master):

git fetch # get current state of remote repository
git merge origin/master # merge state of remote master branch into local branch
git push origin master # push local branch master to remote branch master
Femaref
fonte
24
Isso está incorreto ... origin masternão é um ramo ... são de fato duas coisas separadas, "origem" (um controle remoto) e "mestre" (um ramo local).
Dietrich Epp
O estado da ramificação principal remota está presente localmente, certo?
Senthil Kumaran
4
Sim, isso está incorreto origin/masteré a ramificação principal remota. A filial local é apenas o mestre.
Aniket Thakur
5

origin/masteré o masterramo remoto

Normalmente, depois de fazer um git fetch originpara trazer todas as alterações do servidor, você faria um git rebase origin/masterpara refazer as alterações e mover a ramificação para o índice mais recente. Aqui, origin/masterestá se referindo à ramificação remota, porque você está basicamente dizendo ao GIT para refazer a origin/masterramificação na ramificação atual.

Você usaria origin masterao empurrar, por exemplo. git push origin masteré simplesmente dizer ao GIT para enviar ao repositório remoto a masterramificação local .

Raul Rene
fonte
1
Isso parece realmente mais próximo do que o OP estava procurando - origin masteré dizer ao software para fazer algo com o que estiver no 'master' no repositório 'origin'. origin/masteré uma referência da mesma maneira f3a4d5ou HEADé.
Nemesarial
4

origin é um nome para git url remoto. Pode haver muito mais exemplo de controles remotos abaixo.

bangalore => bangalore.example.com:project.git

boston => boston.example.com:project.git

No que diz respeito à origem / mestre (por exemplo, bangalore / master), é um ponteiro para "master" confirmar no site de bangalore . Você vê isso no seu clone.

É possível que o bangalore remoto tenha avançado desde que você tenha "buscado" ou "puxado"

forvaidya
fonte
2

Dado o fato de poder alternar para origin/master(embora no estado desconectado) enquanto o cabo de rede está desconectado, deve ser uma representação local da masterfilial em origin.

Martin
fonte
Nas respostas acima e abaixo, as pessoas dizem que origem / mestre é o ramo mestre remoto. Sua resposta está meio que contradizendo o que eles dizem. Por favor, explique.
Luna Lovegood