Como você git diff
mostra apenas a diferença entre dois commits, excluindo os outros commits no meio?
Como você git diff
mostra apenas a diferença entre dois commits, excluindo os outros commits no meio?
Respostas:
você pode simplesmente passar os 2 commits para o git diff como:
-> git diff 0da94be 59ff30c > my.patch
-> git apply my.patch
my.patch
em outro ramo?
Pedir a diferença / entre / dois commits sem incluir os commits entre faz pouco sentido. As confirmações são apenas instantâneos do conteúdo do repositório; pedir a diferença entre dois necessariamente os inclui. Então a questão é: o que você realmente está procurando?
Como William sugeriu, a escolha da cereja pode fornecer o delta de um único commit refeito em cima de outro. Isso é:
$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached
Isso leva o commit 'abcdef', o compara ao seu ancestral imediato e aplica essa diferença sobre '012345'. Essa nova diferença é mostrada - a única mudança é que o contexto vem do '012345' e não do ancestral imediato do abcdef. Claro, você pode ter conflitos e etc, portanto, não é um processo muito útil na maioria dos casos.
Se você está interessado apenas no abcdef, pode:
$ git log -u -1 abcdef
Isso compara o abcdef ao seu ancestral imediato, sozinho, e geralmente é o que você deseja.
E claro
$ git diff 012345..abcdef
fornece todas as diferenças entre esses dois commits.
Seria bom ter uma idéia melhor do que você está tentando alcançar - como mencionei, pedir a diferença entre dois commits sem o que está no meio não faz sentido.
origin/featurebranch#HEAD
com local/featurebranch#HEAD
pode ajudar a garantir que você não tenha estragado nada durante a resolução de conflitos.
Para comparar dois commits git 12345 e abcdef como patches, pode-se usar o comando diff como
diff <(git show 123456) <(git show abcdef)
git diff <(git show 123456) <(git show abcdef)
não funciona; diff <(...) <(...)
faz. (Eu apenas tentei).
git diff 123456 abcdef
.
diff
obtendo a saída de dois diff
s. Isso envolve ler e comparar dois fluxos de entrada. diff
(GNU ou Unix diff
) pode fazer isso, enquanto git diff
não pode. Alguns podem se perguntar por que alguém iria querer fazer isso. Estou fazendo isso agora, limpando uma mesclagem que deu errado.
Para verificar alterações completas:
git diff <commit_Id_1> <commit_Id_2>
Para verificar apenas os arquivos alterados / adicionados / excluídos:
git diff <commit_Id_1> <commit_Id_2> --name-only
NOTA : Para verificar o diff sem confirmar no meio, você não precisa colocar os IDs de confirmação.
Digamos que você tenha isso
A
|
B A0
| |
C D
\ /
|
...
E você quer ter certeza de que A
é o mesmo que A0
.
Isto irá fazer o truque:
$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff
Suponha que você queira ver a diferença entre confirmações 012345 e abcdef. A seguir, faça o que você deseja:
$ git checkout 012345 $ git cherry-pick -n abcdef $ git diff --cached
Que tal isso:
git diff abcdef 123456 | less
É útil reduzi-lo a menos se você quiser comparar muitas diferenças diferentes rapidamente.
Desde o Git 2.19, você pode simplesmente usar:
git range-diff rev1...rev2
- compare duas árvores de confirmação, começando pelo ancestral comum
ou
git range-diff rev1~..rev1 rev2~..rev2
- comparar as alterações introduzidas por 2 confirmados
Minhas alias
configurações no ~/.bashrc
arquivo para git diff
:
alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits
Eu escrevi um script que exibe diff entre dois commits, funciona bem no Ubuntu.
https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc
#!/usr/bin/env python
import sys, subprocess, os
TOOLS = ['bcompare', 'meld']
def getTool():
for tool in TOOLS:
try:
out = subprocess.check_output(['which', tool]).strip()
if tool in out:
return tool
except subprocess.CalledProcessError:
pass
return None
def printUsageAndExit():
print 'Usage: python bdiff.py <project> <commit_one> <commit_two>'
print 'Example: python bdiff.py <project> 0 1'
print 'Example: python bdiff.py <project> fhejk7fe d78ewg9we'
print 'Example: python bdiff.py <project> 0 d78ewg9we'
sys.exit(0)
def getCommitIds(name, first, second):
commit1 = None
commit2 = None
try:
first_index = int(first) - 1
second_index = int(second) - 1
if int(first) < 0 or int(second) < 0:
print "Cannot handle negative values: "
sys.exit(0)
logs = subprocess.check_output(['git', '-C', name, 'log', '--oneline', '--reverse']).split('\n')
if first_index >= 0:
commit1 = logs[first_index].split(' ')[0]
if second_index >= 0:
commit2 = logs[second_index].split(' ')[0]
except ValueError:
if first != '0':
commit1 = first
if second != '0':
commit2 = second
return commit1, commit2
def validateCommitIds(name, commit1, commit2):
if commit1 == None and commit2 == None:
print "Nothing to do, exit!"
return False
try:
if commit1 != None:
subprocess.check_output(['git', '-C', name, 'cat-file', '-t', commit1]).strip()
if commit2 != None:
subprocess.check_output(['git', '-C', name, 'cat-file', '-t', commit2]).strip()
except subprocess.CalledProcessError:
return False
return True
def cleanup(commit1, commit2):
subprocess.check_output(['rm', '-rf', '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])
def checkoutCommit(name, commit):
if commit != None:
subprocess.check_output(['git', 'clone', name, '/tmp/'+commit])
subprocess.check_output(['git', '-C', '/tmp/'+commit, 'checkout', commit])
else:
subprocess.check_output(['mkdir', '/tmp/0'])
def compare(tool, commit1, commit2):
subprocess.check_output([tool, '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])
if __name__=='__main__':
tool = getTool()
if tool == None:
print "No GUI diff tools"
sys.exit(0)
if len(sys.argv) != 4:
printUsageAndExit()
name, first, second = None, 0, 0
try:
name, first, second = sys.argv[1], sys.argv[2], sys.argv[3]
except IndexError:
printUsageAndExit()
commit1, commit2 = getCommitIds(name, first, second)
if not validateCommitIds(name, commit1, commit2):
sys.exit(0)
cleanup(commit1, commit2)
checkoutCommit(name, commit1)
checkoutCommit(name, commit2)
try:
compare(tool, commit1, commit2)
except KeyboardInterrupt:
pass
finally:
cleanup(commit1, commit2)
sys.exit(0)