Como diferenciar entre alterações não confirmadas locais e origem

141

Digamos que eu clonei um repositório e comecei a modificar arquivos. Sei que, se houver alterações não confirmadas locais, posso fazer uma comparação da seguinte forma git diff test.txte ele me mostrará a diferença entre o HEAD local atual e as alterações não confirmadas modificadas no arquivo. Se eu confirmar essas alterações, posso diferenciá-lo do repositório original usandogit diff master origin/master

Mas existe alguma maneira de diferenciar as alterações locais com o repositório original no servidor antes de confirmar localmente? Eu tentei várias permutações de git diff --cached master origin/mastersem sorte.

Chaitanya
fonte
Eu queria saber o quanto meu arquivo mudou em relação à última versão confirmada no meu local. A resposta para minha pergunta foi essa pergunta. Obrigado!
Souvik Ghosh

Respostas:

133

Dado que o repositório remoto foi armazenado em cache via git fetch, deve ser possível comparar com esses commits. Tente o seguinte:

$ git fetch origin
$ git diff origin/master
JJD
fonte
5
Ah, excelente. A chave era deixar o mestre de fora. Eu tentei uma combinação em que estava fazendo uma busca antes, mas quando o fiz git diff master origin/masterainda estava comparando com a versão comprometida (óbvio em retrospecto). Mas deixar de fora o mestre agora compara as alterações locais com a versão buscada.
Chaitanya
@ Chaitanya Bom, eu poderia ajudar. Na verdade, acho os diferentes estilos que o Git usa um pouco irritante: depois que você precisa escrever origin mastere em outro lugar origin/master. Ainda há trabalho a fazer, IMHO.
JJD
Isso não parece funcionar: git diff origin/masterretornos fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.mestre existe na origem, porém, por exemplo, git fetch origin masterfunciona bem,
mikemaccana
42

Sei que não é uma resposta para a pergunta exata, mas encontrei essa questão procurando diferenciar um arquivo em uma ramificação e um arquivo não confirmado local e achei que compartilharia

Sintaxe:

git diff <commit-ish>:./ -- <path>

Exemplos:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Obrigado Eric Boehs pela maneira de não precisar digitar o nome do arquivo duas vezes)

Nate
fonte
Gosto mais da solução geral do que da estreita e específica acima. Partilha de mente onde você achou isso?
Fbicknel
Não consigo encontrar a documentação sobre os detalhes commit-ishe separador de dois pontos. Os documentos sobre git-diff não parecem mencionar. Eu o uso há tanto tempo que não me lembro onde o encontrei. Provavelmente os exemplos de outras pessoas em outros comandos e eu apenas experimentei git-diff. Receio que outra respostacommit-ish seja a melhor que posso encontrar no momento.
Nate
3
Uma boa adição a isso é git diff master:./ -- README.md. Dessa forma, você não precisa digitar README.mdduas vezes e pode adicioná-lo a um alias mais fácil.
Eric Boehs
Obrigado @EricBoehs, é uma ótima sugestão.
Nate
1
Essa sintaxe não está trabalhando para mim ... em vez git diff master: -- README.mddo ./cria uma /dev/nullfonte ao invés da filial remota. Usando git versão 2.19.0
rustyDev
21

Para ver alterações não preparadas (não adicionadas) nos arquivos existentes

git diff

Observe que isso não rastreia novos arquivos. Para ver as mudanças não confirmadas em etapas

git diff --cached

pepestar
fonte
9

Se você deseja comparar arquivos visualmente, pode usar:

git difftool

Ele iniciará seu aplicativo diff automaticamente para cada arquivo alterado.

PS: Se você não definiu um aplicativo diff, pode fazê-lo como no exemplo abaixo (eu uso o Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false
Caner
fonte
essa alteração entra em vigor imediatamente?
precisa
Estou curioso, como isso está relacionado à pergunta? O git difftool não compara as mudanças locais com o mestre? No entanto, o OP deseja entre as alterações locais e o mestre remoto.
Infoclogged
De longe, a solução mais fácil
Chris Johnson