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.)
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.
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
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)
<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.
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 .)
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
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 :
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
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.
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.
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:
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.
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
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 :)
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.
git diff HEAD origin/HEAD
que parece apontar para um ramo remoto diferente daquele que eu pretendia. O uso do nome completo da ramificação funciona conforme o esperado.Respostas:
Para atualizar ramificações de rastreamento remoto, você precisa digitar
git fetch
primeiro e depois:Você pode
git branch -a
listar todas as filiais (local e remota) e escolher o nome da filial (basta removerremotes/
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.)fonte
git fetch
)[diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = false
Verifique se o caminho para o arquivo code.exe está correto.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 fetch
primeiro; e você precisa ter informações atualizadas sobre ramificações no repositório remoto.fonte
git diff <remote>/<remote branch> <local branch>
para ver o que meu envio fará para o repo remoto.git diff origin
é suficiente se você apenas comparar com o seu ramo upstream.git fetch
no início, ele causar problemas ao novato como eugit 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)Primeiro tipo
para obter a lista de ramificações disponíveis. Na saída, você pode ver algo como
Então mostre o diff
fonte
...
melhor do que..
?git log origin/my_branch..
que tomaráHEAD
como referência local, que é principalmente o que você quer dizer.fatal: bad revision
oufatal: 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.1Se você estiver em um determinado ramo e quiser compará-lo com um ramo upstream que estiver rastreando, use
se o seu upstream não estiver configurado (normalmente, obrigado Arijoon nos comentários)
Como cortesia desta resposta , a documentação do git para especificar revisões tem:
fonte
git diff @ @{upstream}
. O extra@
éHEAD
que é onde você está agora, então você está comparandoHEAD
com 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 tofatal: ambiguous argument '@upstream': unknown revision or path not in the working tree
. Teve que usar em seugit diff @\{upstream\}
lugar. Landgit fetch
primeiro; 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.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.
fonte
O caminho fácil:
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 .)fonte
É assim que eu faço.
isso buscará tudo do controle remoto; portanto, quando você verificar a diferença, ele comparará a diferença com a ramificação remota.
o comando acima exibirá todos os ramos.
Agora, você pode verificar a diferença da seguinte maneira.
isso comparará sua filial local com a filial remota
fonte
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
fonte
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
Aqui eu tenho dois ramos locais (
my-branch
emaster
) e 4 (Remotesome-branch
,some-other-branch
,master
, emy-branch
).Além disso, o asterisco próximo a
my-branch
sinaliza o fato de que estou atualmente nesse ramo (você também saberia disso usando o comandogit status
que 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 :
Para mostrar apenas ramificações locais, você pode ser tentado a usar,
git branch -l
mas esse é um comando completamente diferente. Para mostrar filiais locais, usegit branch
sem opçõesPara concluir uma revisão das opções básicas de ramificação, existe o
--list
contrário do que você pode esperar para permitir a filtragem . Use-o com um padrão como este:Você também pode combinar
--list
com as opções-a
e-r
mas certifique-se de adaptar o seu padrão de conformidade ( lembre-se: filiais remotas começar com "controles remotos" ). Exemplo: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:Nota: você deve fornecer o nome completo dos ramos sem aspas.
Também posso comparar o local
my-branch
com o remotomaster
. Aqui recebo alguma saída porque o controle remotomy-branch
não foi mesclado na ramificação principal.fonte
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>
fonte
Aqui está uma resposta abreviada se você estiver comparando sua ramificação atual e com algo que deseja
git pull
.O primeiro comando descobrirá qual ramificação remota corresponde à sua ramificação atual. Um artefato desse cálculo na
FETCH_HEAD
referência. Em seguida, o segundo comando usa essa comparação de referência versus a que sua filial atual possui.fonte
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
heroku
que não é oorigin
e, como não estava sincronizado, recebi esse erro ao tentar executar ogit 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 fetch
antes de executargit diff
, no meu caso:Espero que ajude outras pessoas com esse mesmo problema.
fonte
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:
(e você não precisa de busca por git, a menos que seja necessário comparar com novas confirmações)
fonte
Exemplo
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.
fonte
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
Adicionado abaixo
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
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.
fonte
Gostaria de saber se há alguma mudança no meu ramo mestre ...
fonte
Configuração
git config alias.udiff 'diff @{u}'
Diferenciando HEAD com HEAD @ {upstream}
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
fonte
Isto é bem simples. Você pode usar:
git diff remote/my_topic_branch my_topic_branch
Onde
my_topic_branch
está o seu ramo de tópico.fonte
Digamos que você já configurou o seu
origin
como repositório remoto. Então,git diff <local branch> <origin>/<remote branch name>
fonte
tentar:
Supondo que você queira diferenciar as ramificações locais atuais em
HEAD
relação à origem. E supondo que você esteja no ramo local. :)fonte
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ção
Compare with previous revision
visualizar as diferenças lado a lado.fonte