git diff entre o repositório remoto clonado e o original

170

Clonei um repositório do github e não fiz alterações localmente. O repositório do Github avançou com confirmações no mesmo ramo.

  1. Como encontro uma diferença entre meu repositório local e o repositório original do github?
  2. Como encontro uma diferença entre minha cópia de trabalho e o repositório original do github?
  3. Como encontro uma diferença entre meu repositório local e outro repositório do github do mesmo projeto?
Oleg Proudnikov
fonte
1
possível duplicado de comparar o ramo local do git com o ramo remoto?
Ciro Santilli publicou 30/08/14
1
@CiroSantilli 法轮功 改造 中心 六四 事件: Eu acho que é suficientemente diferente: a outra pergunta é sobre qualquer ramificação remota genérica, enquanto isso se refere ao GitHub, além de três pontos de partida diferentes. Eles são definitivamente semelhantes, portanto seu link é certamente útil.
jvriesem

Respostas:

161

1) Adicione todos os repositórios remotos que você deseja comparar:

git remote add foobar git://github.com/user/foobar.git

2) Atualize sua cópia local de um controle remoto:

git fetch foobar

A busca não altera sua cópia de trabalho.

3) Compare qualquer ramificação do repositório local com qualquer controle remoto que você adicionou:

git diff master foobar/master
dbyrne
fonte
Vou precisar do git fetch antes do diff? Eu acho que não há como diferir sem ele.
21411 Oleg Proudnikov
Na verdade, esta é uma resposta apenas à pergunta 3 (diferente de outro repositório do github).
Ruslan Kabalin 02/03
5
Nada distingue o "repositório original do github" de qualquer outro repositório remoto. Ou estou entendendo mal alguma coisa?
dbyrne
Quando eu tentei com o git 2.7.4, o "git diff master foobar / master" não mostrou diferenças. Parece-me que ele compara minha cópia local ("mestre") com o repositório fornecido como 1º argumento ("mestre") e lá só difere o "caminho / arquivo" "foobar / master". Mas o comando "diff foobar / master" funcionou para mim, comparando meu mestre local com foobar / master.
user2081279
Em vez de fetch(nº 2) como alternativa: git remote update- ele atualiza todos os seus ramos configurados para rastrear os remotos, mas não mescla nenhuma alteração; ougit pull
Timo
49

Outra resposta às suas perguntas (supondo que você esteja no master e já tenha "git fetch origin" para informá-lo sobre alterações remotas):

1) Confirma na filial remota desde quando a filial local foi criada:

git diff HEAD...origin/master

2) Suponho que por "cópia de trabalho" você quer dizer sua filial local com algumas confirmações locais que ainda não estão no controle remoto. Para ver as diferenças do que você possui na filial local, mas que não existe na filial remota, execute:

git diff origin/master...HEAD

3) Veja a resposta por dbyrne.

Ruslan Kabalin
fonte
Obrigado pela HEAD..origin/mastersintaxe! Temos recebido erros com origem / HEAD inexistentes, e isso foi resolvido.
precisa
@ruslan: o que significa quando git diff HEAD...origin/masternada retorna se eu tiver clonado um diretório remoto ao qual estou autorizado a fazer alterações?
Mona Jalal
Ocorreu um erro quando eu estava clonando usando a GUI do Windows, portanto, me pergunto se o clone passou completamente. Vejo que as pastas estão aqui no meu diretório, mas quero ter certeza de que é o mesmo que remoto. No entanto, no git shell, o git diff não retorna nada. Estou confuso se meu clone foi bem-sucedido ou não?
Mona Jalal
@MonaJalal significa que não há alterações a montante desde que você a clonou.
Ruslan Kabalin 06/07/19
21

Este exemplo pode ajudar alguém:

Nota " origin" é meu apelido para remoto "O que há no Github"
Nota " mybranch" é meu apelido para minha ramificação "o que é local" que estou sincronizando com o github
- seu nome de ramificação é 'master' se você não criou 1. No entanto, estou usando o nome diferente mybranchpara mostrar onde o parâmetro do nome do ramo é usado.


Quais são exatamente meus repositórios remotos no github?

$ git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)

Adicione o "outro repositório github do mesmo código" - chamamos isso de fork:

$ git remote add someOtherRepo https://github.com/otherUser/Playground.git

$git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (fetch)

verifique se nosso repo local está atualizado:

$ git fetch

Mude algumas coisas localmente. digamos arquivo ./foo/bar.py

$ git status
# On branch mybranch
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   foo/bar.py

Revise minhas alterações não confirmadas

$ git diff mybranch
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index b4fb1be..516323b 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

Confirme localmente.

$ git commit foo/bar.py -m"I changed stuff"
[myfork 9f31ff7] I changed stuff
1 files changed, 2 insertions(+), 1 deletions(-)

Agora, sou diferente do meu controle remoto (no github)

$ git status
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 1 commit.
#
nothing to commit (working directory clean)

Difere isso com o controle remoto - seu garfo: (isso geralmente é feito com git diff master origin)

$ git diff mybranch origin
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index 516323b..b4fb1be 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

(git push para aplicá-los ao controle remoto)

Como minha ramificação remota difere da ramificação mestre remota?

$ git diff origin/mybranch origin/master

Como meu material local difere do ramo mestre remoto?

$ git diff origin/master

Como minhas coisas diferem do garfo de outra pessoa, ramo principal do mesmo repositório?

$git diff mybranch someOtherRepo/master
FlipMcF
fonte
5
Antes de fazermos um 'git diff', acho que é necessário fazer um 'git fetch' para garantir que nossa cópia local do controle remoto esteja atualizada.
Don
1
Eu li talvez 20 posts sobre como comparar locais e remotos. Eu mesmo descobri isso: o git fetch é NECESSÁRIO primeiro. git é verdadeiramente o código de montagem do RCS. Jesus. Obrigado por confirmar, Don!
Terence Parr
acabou de adicionar git fetcha esta resposta.
FlipMcF 15/09/2014
1
Hummm ... Não gosto de como usei 'myfork' como o nome da minha filial. Isso pode confundir alguém (como eu, que só voltou para esta resposta)
FlipMcF
Editado - clareza e resposta à pergunta 'fork diferença' # 3
FlipMcF 1/16