Como posso ver o que vou empurrar com o git?

588

Existe uma maneira de ver o que seria enviado se eu fizesse um git pushcomando?

O que estou imaginando é algo como a guia "Arquivos alterados" do recurso "solicitação de recebimento" do Github. Quando emito uma solicitação pull, posso ver e ver o que será recebido se eles aceitarem minha solicitação pull:exemplo de mudanças agregadas no github

A linha de comando está OK, mas eu preferiria algum tipo de GUI (como a captura de tela acima).

cmcculloh
fonte
Muitas perguntas / respostas relacionadas; aqui vai outra: stackoverflow.com/questions/2176278/preview-a-git-push/...
michael

Respostas:

665

Para obter uma lista de arquivos a serem enviados, execute:

git diff --stat --cached [remote/branch]

exemplo:

git diff --stat --cached origin/master

Para o diff de código dos arquivos a serem enviados, execute:

git diff [remote repo/branch]

Para ver os caminhos completos dos arquivos que serão alterados, execute:

git diff --numstat [remote repo/branch]

Se você quiser ver essas diferenças em uma GUI, precisará configurar o git para isso. Consulte Como visualizo a saída 'git diff' com um programa visual diff? .

Ionuț G. Stan
fonte
8
Ambas as variações do git diff --cached sem um commit dado apenas exibirão as diferenças em relação ao HEAD. Eu acho que você quis dizer git diff [--stat] --cached origin / master, assumindo ramo principal da origem é o mestre
mfontani
52
Não é exatamente isso que você deseja. Você deve diferir HEAD, não o índice, da origem ( git diff origin/master HEAD). A difusão do índice fornecerá os mesmos resultados se e somente se você não tiver alterações preparadas para confirmação. Se você tiver alterações preparadas, elas serão incluídas no diff, mas claramente não serão enviadas, pois ainda não foram confirmadas.
Cascabel
5
Esta resposta precisa ser editada para incluir as informações no comentário de @Jefromi git diff --stat origin/master HEADé a resposta correta.
Tony Topper
2
@mfontani tem a resposta certa para mim. Quero verificar o que será enviado do que já comprometi, e não o que será comprometido se eu confirmar tudo o que mudei. git diff --cached [remote/branch]faz o truque :) #
31413 poshaughnessy
2
em vez de digitar origem / mestre, você pode usar @ {u}, por exemplo, git diff @ {u} ou git diff HEAD @ {u} Observe que isso só funciona se você já tiver um ramo de rastreamento upstream criado e vinculado. Acho isso útil quando tenho muitos ramos e muitos controles remotos para não precisar pensar no que está vinculado.
Damien Sawyer
192

Sempre há um funcionamento a seco:

git push --dry-run

Ele fará tudo, exceto o envio real dos dados.

Se você deseja uma visualização mais gráfica, tem várias opções.

O Tig e o script gitk que acompanham o git exibem a ramificação atual da sua cópia local e a ramificação do controle remoto ou origem.

texto alternativo

Portanto, quaisquer confirmações feitas após a origem são confirmadas por push.

Abra o gitk a partir do shell enquanto estiver na ramificação que você deseja enviar, digitando gitk&; em seguida, para ver a diferença entre o que está no controle remoto e o que você está prestes a enviar para o controle remoto, selecione seu commit não pressionado local e clique com o botão direito do mouse no controle remoto e escolha "Diff this -> selected": texto alternativo

Brian Gianforcaro
fonte
18
O git push --dry-run não me mostra nada do que espero ver. O gitk está mais próximo, mas não me mostra o total agregado de todas as alterações que serão enviadas. Portanto, se estou enviando 6 confirmações para remoto, quero ver a soma total do que será enviado. Não me importo com o que cada commit possui individualmente, porque um commit pode ser completamente negado pelo próximo.
Cmculloh 03/09/10
1
Se você precisar de um diff do que será enviado, faça git diff --stat HEAD origin/masterou git diff HEAD origin/master. Importante é a CABEÇA , caso contrário você incluir mudanças uncommited em seu diff
Daniel Alder
Existe alguma razão para o git não executar automaticamente um teste a seco antes de tentar enviar dados para um controle remoto? Se você estiver enviando uma grande quantidade de dados, ele fará o upload de todos os dados e exibirá erros depois. Você acabou de perder tempo e largura de banda para enviar dados que agora precisam ser carregados novamente. Parece um comportamento estranho.
precisa saber é
1
O problema git push --dry-runé que ele ainda requer permissão de gravação no controle remoto. Portanto, se você tiver um clone sem permissão para enviar a montante, mas gostaria de ver quais são as alterações não pressionadas, --dry-runnão o fará.
Ed Avis
Essa é uma boa solução, mas deve-se notar que requer conexão com o controle remoto (incluindo a inserção da chave SSH, se aplicável). Se você apenas quiser ver a diferença entre branche origin/branch, eu seguiria a resposta de Ionuț G. Stan, já que na verdade não é necessário conectar-se ao repositório remoto. Isso pode ser bom ou ruim, dependendo do que você precisa.
Sean the Bean
169

Para simplesmente listar os commits aguardando envio: ( este é o que você lembrará )

git cherry -v

Mostre os assuntos de confirmação ao lado dos SHA1s.

Alex Nolasco
fonte
5
Uma coisa interessante é que você pode especificar um controle remoto para comparar: git cherry -v heroku/remotecaso você mantenha seu código em mais de um controle remoto.
fagiani 30/03
Qual é o melhor comando complementar que nos permite realmente correlacionar as diferenças contidas nesses commits?
Hassan Baig
Esse comando é legal, mas eu gostaria de mais detalhes, como os nomes dos arquivos a serem alterados durante o envio.
LS
21

Você provavelmente quer correr git difftool origin/master.... isso deve mostrar o diff unificado do que está em sua ramificação atual que ainda não está na ramificação de origem / mestre e exibi-lo na ferramenta de diff gráfica de sua escolha. Para estar mais atualizado, execute git fetchprimeiro.

Scott Chacon
fonte
2
git difftool -d origin/master, Eu tenho meu difftool configurado para fundir, para que funcione perfeitamente, thx!
Aquarius Power
git difftool -dé muito melhor, graças ao Aquarius Power. O único problema é que ele não detecta arquivos movidos e os mostra como excluídos e adicionados.
EM0 19/08/19
8

Uma maneira de comparar sua versão local antes de enviá-la no repositório remoto (tipo de envio a seco):

Use o TortoiseGit:
Clique com o botão direito do mouse no projeto da pasta raiz> TortoiseGit> Diff com a versão anterior>
para a Versão 2, escolharefs/remotes/origin/master

user1921207
fonte
8

Tente git diff origin/master..master(supondo que origin/masterseja o seu upstream). Ao contrário git push --dry-run, isso ainda funciona, mesmo se você não tiver permissão de gravação para o upstream.

Ed Avis
fonte
5

Use git gui, você pode ver uma lista do que mudou no seu commit real. Você também pode usar o gitkque fornece uma interface fácil para reflogs. Basta comparar entre remotes/...emaster ver o que será empurrado. Ele fornece uma interface semelhante à sua captura de tela.

Ambos os programas estão incluídos no git.

difuso
fonte
1
Não vejo nenhum lugar no git gui que mostre tudo o que foi confirmado, mas não forçado.
Cmculloh 03/09/10
No git gui, você pode ver o que é modificado, mas não confirmado. Em GIK (Via gitk --allde obter uma lista completa de todos os comentários Agora você pode comparar o estado real do seu dev-ramo com seu controle remoto para empurrar..
fuz
4

Para ver quais arquivos foram alterados e visualizar as alterações reais do código em comparação com a masterramificação, você pode usar:

git diff --stat --patch origin master

NOTA : Se você usar algum dos IDEs Intellij, poderá clicar com o botão direito do mouse no seu projeto de nível superior, selecione Git > Comparar com filial > e escolha a origem desejada, por exemplo origin/master. Na árvore de arquivos que aparecerá, você pode clicar duas vezes nos arquivos para ver uma diferença visual. Diferente da opção de linha de comando acima, você pode editar suas versões locais na janela de diferenças.

ccpizza
fonte
3

Você pode listar os commits por:

git cherry -v

E compare com o seguinte comando, onde o número de ^ é igual ao número de confirmações (no exemplo, suas 2 confirmações):

git diff HEAD^^
DavidS
fonte
É simplesmente bom ver a lista das confirmações mais recentes. Isso não fornecerá o nome do (s) arquivo (s). Portanto, como alguém respondeu usando as opções de execução a seco e as opções de patch, é melhor. git diff --stat --patch mestre de origem git push --dry-run
Sree Rama
2

Se você estiver usando o Mac OS X, eu recomendo que você adquira o Tower, é um programa maravilhoso que tornou agradável lidar com o Git. Agora eu tenho mais que lembrar dos comandos do terminal e ele oferece uma ótima interface gráfica para visualizar, rastrear e resolver diferenças nos arquivos.

E não, eu não sou afiliado a eles, apenas uso o software deles e gosto muito dele.

http://www.git-tower.com/

kakubei
fonte
2
Eu uso o Tower, mas como você pode ver os arquivos que foram confirmados, mas não enviados por push?
Michael Irey
Isso não responde à pergunta.
Reinierpost
1

Apenas para adicionar meus dois centavos ... Eu queria implementar isso ao executar tarefas em um pipeline do gitlab em um runner do gitlab. A melhor maneira de fazer isso era usar este script:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Também no meu caso, eu queria filtrar arquivos por extensão, para isso, usei:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Depois disso, você pode, por exemplo, encaminhar esta lista em outro lugar, talvez um linter;)

Espero que isso ajude alguém.

Michal Mikolajczyk
fonte
1
  1. Se você tiver permissões de gravação no controle remoto
git push --dry-run
  1. Se você não tiver permissões de gravação no controle remoto
git diff --stat HEAD remote/branch
vkg
fonte
0

Depois git commit -m "{your commit message}", você receberá um hash de confirmação antes do envio. Assim, você pode ver com o que está prestes a gitexecutar executando o seguinte comando:

git diff origin/{your_branch_name} commit hash

por exemplo: git diff origin/master c0e06d2

Chandra
fonte
Obrigado por responder, mas acho que esse esforço não foi necessário, pois a pergunta é bastante antiga e muito votada. É melhor gastar esforços em questões diferentes.
Pbd 24/04