git: diff entre arquivo no repositório local e origem

190

Quero encontrar as diferenças entre um arquivo que tenho no meu repositório local e o que está no arquivo origin master.

Eu sei que existe git diff, no entanto, eu apenas quero isolá-lo neste arquivo em particular.

Para simplificar, digamos que o arquivo seja nomeado file1.txte tenha um caminho de arquivo local = [local_path]e na origem ele tenha o caminho de arquivo = [remote-path].

Qual seria o comando git que preciso digitar?

EDIT: Obrigado a todos por sua contribuição, foi muito esclarecedor. Para aqueles que estão usando o Eclipse (que eu sou e deveria ter declarado anteriormente), acabei de descobrir que você pode clicar com o botão direito do mouse -> Comparar com -> Filial, tag ou referência -> selecionar a versão apropriada e pronto.

BuscandoAlpha
fonte
O [caminho remoto] é diferente do [caminho local]?
Code-Apprentice
Acabei de notar sua edição. Sinta-se livre para publicá-lo como resposta.
Code-Apprentice
o que você chama de "mestre de origem"?
o método eclipse egit é bom
user1169587 5/06

Respostas:

251

Se [remote-path]e [local-path]são iguais, você pode fazer

$ git fetch origin master
$ git diff origin/master -- [local-path]

Nota 1: O segundo comando acima será comparado ao ramo de rastreamento remoto armazenado localmente. O comando buscar é necessário para atualizar a ramificação de rastreamento remoto para estar sincronizada com o conteúdo do servidor remoto. Como alternativa, você pode simplesmente fazer

$ git diff master:<path-or-file-name>

Nota 2: master pode ser substituída nos exemplos acima por qualquer nome de filial

Code-Apprentice
fonte
15
E pode até omitir o caminho local se esse for o diretório atual.
Tony Muro
19
Para aqueles extremamente Noob como eu, aqui está um exemplo:git diff master:README.md -- README.md
fabriciorissetto
24
Na verdade, aqui está um exemplo melhor:git diff origin/master -- README.md
JDiMatteo 7/16/16
Eu não poderia git fetch masterusar usado git fetch .(origem / mestre também não funcionou) Mas o resto funcionou bem.
22817 rob rob
1
@rob Você é o primeiro a apontar meu erro. Deveria ser git fetch **origin**.
Code-Apprentice
114

Para visualizar as diferenças que vão do arquivo remoto para o arquivo local:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

Para visualizar as diferenças na outra direção:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

Basicamente, você pode diferenciar dois arquivos em qualquer lugar usando esta notação:

git diff ref1:path/to/file1 ref2:path/to/file2

Como de costume, ref1e ref2podem ser nomes de filiais, nome do remot / branchname, confirmar SHAs etc.

janos
fonte
17

Para comparar o repositório local com o remoto, basta usar a sintaxe abaixo:

git diff @{upstream}
Ratna Halder
fonte
2

Para isso, escrevi um script bash:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

No script acima, busco a ramificação principal remota (não é necessário sua ramificação mestre QUALQUER ramificação) para FETCH_HEAD, em seguida, faço uma lista apenas do meu arquivo modificado e comparo os arquivos modificados git difftool.

Existem muitos difftoolsuportados pelo git, eu configurei Meld Diff Viewerpara uma boa comparação da GUI.
A partir do script acima, eu tenho conhecimento prévio de quais alterações foram feitas por outras equipes no mesmo arquivo, antes de seguir os estágios gituntrack-->staged-->commit que me ajudam a evitar conflitos desnecessários de mesclagem com a equipe remota ou criar uma nova filial local e comparar e mesclar na filial principal.

adg
fonte
1

Eu tentei algumas soluções, mas acho fácil dessa maneira (você está na pasta local):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

Então você comparou o último número de confirmação local do git e do git remoto ....

animati
fonte
0

A resposta completa para a pergunta original que estava falando sobre um possível caminho diferente no local e no remoto está abaixo

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

Supondo que o caminho local seja docs / file1.txt e o caminho remoto seja docs2 / file1.txt, use git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Isso é adaptado da página de ajuda do GitHub aqui e a resposta do Code-Apprentice acima

ng10
fonte