Eles não são meus funcionários, são meus colegas e não são eles em particular, mas as pessoas em geral. Mas sim, relendo este post, parece um pouco agro. :)
Raif
3
Você pode usar o github ou bitbucket, gitlab? Existem ferramentas para gerenciar exatamente essa situação. O desenvolvedor faz uma solicitação de recebimento. Você recebe a solicitação e terá acesso a uma interface muito boa que mostra uma diferença de todas as alterações feitas em cada arquivo. Você pode até comentar, solicitar alterações, etc. Quando as alterações forem boas, você poderá aceitar a solicitação que mesclará as alterações na ramificação solicitada (normalmente desenvolvida). Essa é a melhor maneira de lidar com essa situação.
Scott Wright
Respostas:
168
Uma alternativa à resposta de @Marco Ponti e evitando o checkout:
ah! isso é bem divertido, agora que tal se eu quiser dizer <notMainDev> como o ramo atual em que estou? isso não é preciso especificá-lo?
Raif
29
git diff --name-only <some-other-branch>mostrará quais arquivos são diferentes entre sua ramificação atual e <some-other-branch>. Portanto, é essencialmente o mesmo comando, mas nota que você pode usar isso para encontrar os arquivos que são diferentes entre quaisquer dois ramos, mesmo se eles não estão remotamente relacionados. Se essa comparação é útil ou não, depende da topologia de suas ramificações ... Além disso, observe que <some-other-branch>realmente pode haver algum commit, ou qualquer coisa que resolva um (tags, etc.).
Twalberg 17/05
hmmm, bem, acho que o que quero dizer é que eu gostaria de fazer o git diff --name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) onde MY_CURRENT_CO_BRANCH seria, naturalmente, minha ramificação atual
Raif
Você pode fazer isso também. Isso encontrará o ponto em que, <notMainDev>e <MY_CURRENT_CO_BRANCH>mais recentemente, teve um ancestral comum e será comparado <notMainDev>a esse ancestral. Você precisará fornecer seu nome de filial atual, como git merge-baseespera dois argumentos - não há um atalho, pelo menos na versão atual.
Twalberg 17/05
1
Está bem! Deixa comigo. Cortesia do meu colega como é o nome dele. git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' que obterá o commit da ramificação entre <notMainDev> e minha ramificação atual. Eu posso então fazer git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
uau rápido e também o ponto. obrigado. btw eu amo git. é sempre rápido e
direto
23
Acredito que isso também mostrará coisas que mudaram <mainDev>desde que os ramos divergiram. Em git diff --name-only <sha-of-branch-point>vez disso, você pode usar ou ver a resposta alternativa que eu postei que evita o checkout.
Twalberg 17/05
Sim, isso é verdade @twalberg, mostraria essas alterações se os ramos fossem divergentes. Eu estava assumindo que o notMainDevseria mantido atualizado com os commits mainDev ... Eu geralmente acho útil ver essas diferenças também.
Marco Ponti
você não pode simplesmente especificar - right-only para mostrar apenas os arquivos que foram alterados no lado direito?
TheZenker
você obtém o <sha-of-branch-point>comgit rev-parse <branch-name>
fc9.30 01/02/19
69
espantado, isso não foi dito até agora!
git diff master...branch
Portanto, veja as alterações apenas em branch
Para verificar a filial atual, use
git diff master...
Graças a jqr
Esta é uma mão curta para
git diff $(git merge-base master branch) branch
portanto, a base de mesclagem (a confirmação comum mais recente entre as ramificações) e a dica da ramificação
Também usar origem / mestre em vez de apenas mestre ajudará caso seu mestre local seja datado
Enquanto isso mostra o que mudou, ele mostra a todas as mudanças, ao invés de um resumo dos arquivos alterados ... que é o que me levam a esta página em primeiro lugar :)
Chris Rutledge
1
adicione o sinalizador --name-only a isso. ou --short-stat
exussum
2
git diff --name-only master..se você quiser apenas os nomes dos arquivos diferentes entre os dois ramos.
7309 Adam
1
Isso não funcionará corretamente se o seu mestre tiver confirmado depois que você criou seu ramo secundário.
simplylizz
2
@simplylizz sim, sim. isso é exatamente o que este está resolvendo
exussum
45
Não acredito que existem muitas maneiras de fazer isso. Eu uso o que mudou como alguém postado antes, apenas com os seguintes argumentos:
Essa parece ser a resposta mais fácil aqui, pois não requer informações adicionais. A saída parece correta e é muito mais fácil lembrar do que a resposta aceita!
RickMeasham
1
Obrigado, isso é interessante, mais prolixo. Ele fornece saída para cada confirmação, na ordem inversa. git-whatchanged - Mostrar registra com diferença cada commit introduz git-scm.com/docs/git-whatchanged
nealmcb
A partir de documentos do git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S
21
Eu realmente gostei da resposta de @ twalberg, mas não queria digitar o nome do ramo atual o tempo todo. Então, eu estou usando isso:
Sua solução funciona para mim e eu recebo a lista de arquivos que espero ver. Sou iniciante no Git e já usei git diff master... --name-onlyquando executado no ramo de destino e obtive o mesmo resultado. Você poderia ter a gentileza de fornecer algum feedback sobre o que é bom ou ruim entre sua resposta e o comando que forneci?
Hungerstar 12/12
Seu comando funcionará exatamente da mesma forma, se o mestre não tiver nenhum novo commit desde que sua ramificação foi criada. Eu acho que meu comando será equivalente a git diff master.. --name-only(note que existem apenas 2 pontos em vez de 3). Para entender o que os pontos significam, consulte esta resposta
Yep_It's_Me
Impressionante! Obrigado pela resposta rápida e insight. Muito apreciado.
A partir de documentos do git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Essa variação compara o HEAD do mestre a um ramo atual. A resposta aceita compara o estado do mestre no ponto que você bifurcou . Pode ter a resposta que você está procurando, dependendo do que você deseja saber.
Mark Stosberg
8
E se pudesse ser tão fácil assim?
git changed
Se você deseja assumir que o ramo principal é chamado de "mestre" e que você cria seus outros ramos a partir do mestre, você pode adicionar esse alias ao seu ~/.gitconfigarquivo para facilitar:
No entanto, isso mostrará todos os arquivos que foram afetados na ramificação. Se você quiser ver apenas arquivos modificados explicitamente , poderá usar --diff-filter:
Era exatamente isso que eu precisava para aprender arquivos alterados, excluindo os que foram excluídos. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel
1
A resposta aceita - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- é muito próxima, mas notei que o status estava errado para exclusões. Adicionei um arquivo em uma ramificação e, no entanto, este comando (usando --name-status) deu ao arquivo que excluí o status "A" e ao arquivo que adicionei o status "D".
O seguinte arquivo em lotes é baseado na resposta do twalberg, mas funcionará no Windows:
@ECHO OFF
C: :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE
O item acima pressupõe que o ramo principal seja origem / mestre e que o git bash foi incluído quando o Git foi instalado (e sua localização é no ambiente do caminho). Na verdade, eu precisava mostrar as diferenças reais usando uma ferramenta diff configurada (kdiff3) para substituir o seguinte comando bash acima:
Respostas:
Uma alternativa à resposta de @Marco Ponti e evitando o checkout:
Se seu shell em particular não entender a construção $ (), use back-ticks.
fonte
git diff --name-only <some-other-branch>
mostrará quais arquivos são diferentes entre sua ramificação atual e<some-other-branch>
. Portanto, é essencialmente o mesmo comando, mas nota que você pode usar isso para encontrar os arquivos que são diferentes entre quaisquer dois ramos, mesmo se eles não estão remotamente relacionados. Se essa comparação é útil ou não, depende da topologia de suas ramificações ... Além disso, observe que<some-other-branch>
realmente pode haver algum commit, ou qualquer coisa que resolva um (tags, etc.).<notMainDev>
e<MY_CURRENT_CO_BRANCH>
mais recentemente, teve um ancestral comum e será comparado<notMainDev>
a esse ancestral. Você precisará fornecer seu nome de filial atual, comogit merge-base
espera dois argumentos - não há um atalho, pelo menos na versão atual.git branch | grep '\*' | awk '{print $2}'
que obterá o commit da ramificação entre <notMainDev> e minha ramificação atual. Eu posso então fazer git diff --name-only <notMainDev> $ (git merge-base <notMainDev>git branch | grep '\*' | awk '{print $2}'
)Tudo o que você precisa fazer é o seguinte:
Isso mostrará apenas os nomes de arquivos diferentes entre os dois ramos.
fonte
<mainDev>
desde que os ramos divergiram. Emgit diff --name-only <sha-of-branch-point>
vez disso, você pode usar ou ver a resposta alternativa que eu postei que evita o checkout.notMainDev
seria mantido atualizado com os commits mainDev ... Eu geralmente acho útil ver essas diferenças também.<sha-of-branch-point>
comgit rev-parse <branch-name>
espantado, isso não foi dito até agora!
Portanto, veja as alterações apenas em
branch
Para verificar a filial atual, use
Graças a jqr
Esta é uma mão curta para
portanto, a base de mesclagem (a confirmação comum mais recente entre as ramificações) e a dica da ramificação
Também usar origem / mestre em vez de apenas mestre ajudará caso seu mestre local seja datado
fonte
git diff --name-only master..
se você quiser apenas os nomes dos arquivos diferentes entre os dois ramos.Não acredito que existem muitas maneiras de fazer isso. Eu uso o que mudou como alguém postado antes, apenas com os seguintes argumentos:
Isso apenas lista os nomes de arquivos e apenas os que foram alterados na ramificação atual.
fonte
New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Eu realmente gostei da resposta de @ twalberg, mas não queria digitar o nome do ramo atual o tempo todo. Então, eu estou usando isso:
fonte
git diff master... --name-only
quando executado no ramo de destino e obtive o mesmo resultado. Você poderia ter a gentileza de fornecer algum feedback sobre o que é bom ou ruim entre sua resposta e o comando que forneci?git diff master.. --name-only
(note que existem apenas 2 pontos em vez de 3). Para entender o que os pontos significam, consulte esta respostagit whatchanged
parece ser uma boa alternativa.fonte
New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
com o qual queremos comparar.
fonte
E se pudesse ser tão fácil assim?
Se você deseja assumir que o ramo principal é chamado de "mestre" e que você cria seus outros ramos a partir do mestre, você pode adicionar esse alias ao seu
~/.gitconfig
arquivo para facilitar:Essas suposições funcionarão para a maioria das pessoas na maioria das situações, mas você deve estar ciente de que as está fazendo.
Além disso, você deve usar um shell que suporte
$()
. É muito provável que seu shell suporte isso .fonte
Isso fornecerá uma lista dos arquivos que foram adicionados ou modificados nesta ramificação.
fonte
Por alguma razão, ninguém mencionou
git-tree
. Consulte https://stackoverflow.com/a/424142/1657819git-tree
é preferido porque é um comando de encanamento ; deve ser programático (e, presumivelmente, mais rápido)(assumindo que o ramo base seja
master
)No entanto, isso mostrará todos os arquivos que foram afetados na ramificação. Se você quiser ver apenas arquivos modificados explicitamente , poderá usar
--diff-filter
:Também é possível usar, em
--name-status
vez de,--name-only
para ver o status dos arquivos (A
/M
/D
e assim por diante)fonte
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
A resposta aceita -
git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
- é muito próxima, mas notei que o status estava errado para exclusões. Adicionei um arquivo em uma ramificação e, no entanto, este comando (usando--name-status
) deu ao arquivo que excluí o status "A" e ao arquivo que adicionei o status "D".Eu tive que usar este comando:
fonte
Expandindo o que @twalberg e @iconoclast tinham, se você estiver usando o cmd por qualquer motivo, poderá usar:
fonte
O seguinte arquivo em lotes é baseado na resposta do twalberg, mas funcionará no Windows:
O item acima pressupõe que o ramo principal seja origem / mestre e que o git bash foi incluído quando o Git foi instalado (e sua localização é no ambiente do caminho). Na verdade, eu precisava mostrar as diferenças reais usando uma ferramenta diff configurada (kdiff3) para substituir o seguinte comando bash acima:
fonte
Eu uso grep, então só recebo as linhas com diff --git, que é o caminho dos arquivos:
fonte