Como comparar uma ramificação git local com sua ramificação remota?


1052

Como posso ver diffentre uma filial local e uma filial remota?


5
Essas perguntas foram feitas novamente mais tarde. Ele tem uma boa resposta: stackoverflow.com/questions/11935633/…
rustybeanstalk 17/13

3
exemplo: git diff master origin / master (onde master é filial local principal e origin / master é filial principal remota).
Dung

@klyngbaek, esta resposta em particular ;-)

Eu estava tentando originalmente, o git diff HEAD origin/HEADque parece apontar para um ramo remoto diferente daquele que eu pretendia. O uso do nome completo da ramificação funciona conforme o esperado.
219 Deanna

Respostas:


594

Para atualizar ramificações de rastreamento remoto, você precisa digitar git fetchprimeiro e depois:

git diff <masterbranch_path> <remotebranch_path>

Você pode git branch -alistar todas as filiais (local e remota) e escolher o nome da filial (basta remover remotes/do nome da filial remota).

Exemplo: git diff master origin/master(onde "mestre" é a filial principal local e "origem / mestre" é um remoto, a saber, origem e filial principal.)


23
Ele pode precisar de uma busca antes ( git fetch)
Houssem Badri 10/10

Isso apenas mostra uma amostra das mudanças no bash. Existe alguma maneira de abrir todas as alterações em um IDE como o código VS?
Harsh Phoujdar

@Harsh Phoujdar Adicione o código abaixo no seu arquivo .git / .gitconfig [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseVerifique se o caminho para o arquivo code.exe está correto.
Aman

1307
git diff <local branch> <remote>/<remote branch>

Por exemplo git diff master origin/master, ougit diff featureA origin/next

É claro que para ter dito o ramo de rastreamento remoto, você precisa git fetchprimeiro; e você precisa ter informações atualizadas sobre ramificações no repositório remoto.


98
para ser mais exato: git diff <ramificação local> <remote> / <ramificação remota>
nalply

38
Geralmente faço git diff <remote>/<remote branch> <local branch>para ver o que meu envio fará para o repo remoto.
Michał Tatarynowicz 12/08

76
O menor ainda git diff originé suficiente se você apenas comparar com o seu ramo upstream.
quer

12
adicione por favor git fetchno início, ele causar problemas ao novato como eu
Saif

1
Ei, não deveria ser git diff <remote>/<remote branch> <local branch>? Caso contrário, fico com a adições e exclusões ligado no meu computador (versão git 2.7.0.windows.2)
Martín Coll

183

Primeiro tipo

git branch -a

para obter a lista de ramificações disponíveis. Na saída, você pode ver algo como

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Então mostre o diff

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master

1
não deveria ser ...melhor do que ..?
Eliran Malka # 9/13

9
Definitivamente, eu teria escolhido isso como resposta. Seguindo suas instruções, pude ver as diferenças entre uma filial local e uma filial remota. Obrigado!
Tass

1
Eu costumo fazer o git log origin/my_branch..que tomará HEADcomo referência local, que é principalmente o que você quer dizer.
Rudie 22/10/2013

4
+1 na melhor resposta, na minha humilde opinião. Seria digno de +2 se você mencionasse "buscar" para sincronizar a imagem "remota" da fonte clonada. A etapa de visão geral de estatísticas / cores é particularmente útil.
BVJ

3
Obrigado pela resposta que finalmente resultou nas sete ou oito "respostas" que resultaram em pouco mais que fatal: bad revisionou fatal: ambiguous argument. Tudo que eu queria era ver o diff no mesmo arquivo de outro ramo, era pedir muito? Sim, foi sim. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>funciona muito bem no git 1.8.3.1
Steve Bonds

144

Se você estiver em um determinado ramo e quiser compará-lo com um ramo upstream que estiver rastreando, use

git diff @{upstream}

se o seu upstream não estiver configurado (normalmente, obrigado Arijoon nos comentários)

git diff @{push}

Como cortesia desta resposta , a documentação do git para especificar revisões tem:

<branchname>@{upstream}, por exemplo master@{upstream}, @{u}
o sufixo @{upstream}para um nome da filial (formato abreviado <branchname>@{u}) refere-se à ramificação que a ramificação especificada por branchnameestá configurada para construir em cima de (configurada com branch.<name>.remotee branch.<name>.merge). Um branchnamepadrão ausente é o atual.


10
Resposta muito boa, faltando apenas uma pequena parte. Mude a linha para git diff @ @{upstream}. O extra @é HEADque é onde você está agora, então você está comparando HEADcom o upstream que sua filial está rastreando. Você pode usar @{push}em vez da montante para obter diff entre o ramo que você está definido para push to
Arijoon

3
melhor resposta, não requer buscar o controle remoto. precisa de mais votos!
jcomeau_ictx

3
Nos peixes desembolsar cheguei resultado: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Teve que usar em seu git diff @\{upstream\}lugar. Land
Landon Kuhn

Você precisa git fetchprimeiro; caso contrário, isso não faz nada, não mostra saída; testado ao excluir um arquivo na origem do repositório e executou esse comando localmente. .. funciona somente após a busca.

Além disso, como a resposta dada inclui quaisquer alterações locais. às vezes isso é desejado, outras vezes, não.
214 Deanna

44

Eu entendo muito melhor a saída de:

git diff <remote-tracking branch> <local branch>

isso me mostra o que será descartado e o que será adicionado se eu pressionar a filial local. Claro que é o mesmo, apenas o inverso, mas para mim é mais legível e estou mais confortável olhando o que vai acontecer.


Eu obter exatamente o mesmo resultado com: git diff <filial local> <-rastreamento remoto ramo> ou git diff <-rastreamento remoto ramo> <filial local>
user2928048

32

O caminho fácil:

git fetch
git log -p HEAD..FETCH_HEAD

Isso buscará primeiro as alterações no seu controle remoto padrão (origem). Isso será criado automaticamente quando você clonar um repo. Você também pode ser explícito:git fetch origin master .

Em seguida, o git log é usado para comparar sua ramificação atual com a recém-obtida. (A opção -p(gerar patch) é o que mostra as diferenças .)


14

É assim que eu faço.

#To update your local.
git fetch --all

isso buscará tudo do controle remoto; portanto, quando você verificar a diferença, ele comparará a diferença com a ramificação remota.

#to list all branches
git branch -a

o comando acima exibirá todos os ramos.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Agora, você pode verificar a diferença da seguinte maneira.

git diff origin/<branch_name>

isso comparará sua filial local com a filial remota


2
git fetch --all irá buscar tudo, desde TODOS os controles remotos. A busca do git deve ser suficiente se você usar o controle remoto de origem padrão.
Christophe Keller

Surpreendente é que, após 8 anos, obtemos uma resposta completa que explica adequadamente as etapas. Podemos fazer uma --help para obter os comandos. SO é sobre entendê-los.
Gdbj

11

Deixe seu ramo de trabalho ser desenvolvimento e queira diferenciar entre ramo de desenvolvimento local e ramo de desenvolvimento remoto; nesse caso, a sintaxe deve ser semelhante git diff remotes/origin/development..development
ou

git fetch origin git diff origin/development


11

tl; dr :git diff <local branch> <remote branch>

Ao usar o git no shell, primeiro gosto de me orientar olhando em volta. Aqui está um comando para mostrar todos os ramos

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Aqui eu tenho dois ramos locais ( my-branche master) e 4 (Remote some-branch, some-other-branch, master, emy-branch ).

Além disso, o asterisco próximo a my-branchsinaliza o fato de que estou atualmente nesse ramo (você também saberia disso usando o comando git statusque produziria:) On branch my-branch..

Nota: as ramificações remotas no shell do git bash são mostradas em vermelho, enquanto as ramificações locais são mostradas em verde.

Se você quer apenas mostrar ramificações remotas :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Para mostrar apenas ramificações locais, você pode ser tentado a usar, git branch -lmas esse é um comando completamente diferente. Para mostrar filiais locais, use git branchsem opções

$ git branch
* my-branch 
  master

Para concluir uma revisão das opções básicas de ramificação, existe o --listcontrário do que você pode esperar para permitir a filtragem . Use-o com um padrão como este:

$ git branch --list 'my*'
* my-branch

Você também pode combinar --listcom as opções -ae -rmas certifique-se de adaptar o seu padrão de conformidade ( lembre-se: filiais remotas começar com "controles remotos" ). Exemplo:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Documentos: https://git-scm.com/docs/git-branch

Agora você pode comparar dois ramos de todas as disponíveis (você também pode comparar dois locais ou dois controles remotos).

Aqui estou comparando o local com o controle remoto my-branch, eles são sincronizados para que eu não obtenha nenhuma saída:

$ git diff my-branch remotes/origin/my-branch

Nota: você deve fornecer o nome completo dos ramos sem aspas.

Também posso comparar o local my-branchcom o remoto master. Aqui recebo alguma saída porque o controle remoto my-branchnão foi mesclado na ramificação principal.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]

11

Se você quiser ver a diferença como apenas os nomes dos arquivos foram alterados, use :, caso contrário

git diff --name-status <remote-branch> <local-branch>,

isso mostraria todas as diferenças entre os dois ramos:

git diff <remote-branch> <local-branch>


9

Aqui está uma resposta abreviada se você estiver comparando sua ramificação atual e com algo que deseja git pull.

git fetch
git diff FETCH_HEAD

O primeiro comando descobrirá qual ramificação remota corresponde à sua ramificação atual. Um artefato desse cálculo na FETCH_HEADreferência. Em seguida, o segundo comando usa essa comparação de referência versus a que sua filial atual possui.


6

Eu sei que já existem várias respostas para essa pergunta, mas estava recebendo um erro estranho ao tentar a maioria delas.

No meu caso, tenho um segundo controle remoto chamado herokuque não é o origine, como não estava sincronizado, recebi esse erro ao tentar executar o git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

ou isso ao tentar a outra abordagem git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

A solução mencionava explicitamente o nome remoto git fetchantes de executar git diff, no meu caso:

$ git fetch heroku
$ git diff master heroku/master

Espero que ajude outras pessoas com esse mesmo problema.


4
git difftool <commit> .

Isso irá comparar a confirmação que você deseja com seus arquivos locais. Não esqueça o ponto no final (para local).

Por exemplo, para comparar seus arquivos locais com algumas confirmações:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(e você não precisa de busca por git, a menos que seja necessário comparar com novas confirmações)


Eu acho que é interessante, porque é uma comparação que posso fazer antes de confirmar e enviar. Infelizmente, no Windows, o vimdiff para exibição é feio; existe alguma maneira de usar algo melhor, como o bloco de notas ++?
Stefano Scarpanti

3

Exemplo

git diff 'master' 'testlocalBranch'

Se você estiver usando um editor como o webstorm, clique com o botão direito do mouse no arquivo selecione comparar com o ramo e digite / selecione seu ramo.

insira a descrição da imagem aqui

insira a descrição da imagem aqui


2
O que isso acrescenta na resposta aceita de 7,5 anos com mais de 170 votos positivos?
Mark Rotteveel

Isso é para mrblah o usuário ou para usuários semelhantes que adicionaram comentários para a resposta aceita. A sintaxe é diferente de um exemplo e o exemplo ajuda mais do ponto de vista do iniciante.
precisa saber é o seguinte

2
Nesse caso, deve estar no comentário dessa resposta.
Rachit #

1

No VS 2019, basta executar FETCH Não puxe o código.

Foi o que eu fiz. Adicionado abaixo no arquivo .gitconfig para que eu possa usar o Beyond Compare

File location: C:\Users\[username]\.gitconfig

Adicionado abaixo

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Abra o prompt de comando e vá para o diretório de trabalho. Eu dei abaixo para comparar a filial local do DEV com a filial remota do DEV

git difftool dev origin/dev --dir-diff

Isso abrirá o Beyond Compare e os diretórios que possuem arquivos diferentes. Se não houver alterações, o Beyond Compare não será iniciado.


0

Gostaria de saber se há alguma mudança no meu ramo mestre ...

  1. Em primeiro lugar, você precisa alterar sua ramificação (se você já está sob essa ramificação, não precisa fazer isso!)

mestre de verificação geral do git

  1. Você pode ver qual arquivo foi modificado em sua ramificação principal por este comando

status git

  1. Listar os ramos

git branch -a

  • mestre
    remotes / origin / master
  1. Encontre as diferenças

origem / mestre do git diff


0

Configuração

git config alias.udiff 'diff @{u}'

Diferenciando HEAD com HEAD @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Diferenciando com uma ramificação remota arbitrária

Isso responde à pergunta em seu cabeçalho ("seu controle remoto"); se você quiser fazer uma comparação com "um controle remoto" (que não esteja configurado como upstream para a ramificação), será necessário direcioná-lo diretamente. Você pode ver todas as ramificações remotas com o seguinte:

git branch -r

Você pode ver todos os controles remotos configurados com o seguinte:

git remote show

Você pode ver a configuração de ramificação / rastreamento de um único controle remoto (por exemplo, origem) da seguinte maneira:

git remote show origin

Depois de determinar o ramo de origem apropriado, basta fazer uma comparação normal :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH


0

Isto é bem simples. Você pode usar:git diff remote/my_topic_branch my_topic_branch

Onde my_topic_branchestá o seu ramo de tópico.


0

Digamos que você já configurou o seu origincomo repositório remoto. Então,

git diff <local branch> <origin>/<remote branch name>


0

tentar:

git diff origin HEAD

Supondo que você queira diferenciar as ramificações locais atuais em HEADrelação à origem. E supondo que você esteja no ramo local. :)


-3

Se você usa o TortoiseGit (fornece GUI para Git), clique com o botão direito do mouse na pasta de repositório do Git e clique em Git Sync.

Você pode selecionar suas ramificações para comparar se não estiver selecionado. Do que você pode ver as diferenças comprometidas. Você também pode clicar com o botão direito em qualquer confirmaçãoCompare with previous revision visualizar as diferenças lado a lado.tortoise git sync para comparar ramificações remota e local

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.