커밋 사이에 차이점 표시


236

Ubuntu 10.04 (Lucid Lynx) 에서 Git을 사용하고 있습니다.

나는 나의 주인에게 약정을했다.

그러나 이러한 커밋 간의 차이점을 원합니다. 그들 모두는 내 마스터 지점에 있습니다.

예를 들면 다음과 같습니다.

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

k73ud와 dj374의 차이점을 원합니다. 그러나 다음을 수행했을 때의 변경 사항을 볼 수 없었습니다 k73ud.

git diff k73ud..dj374 > master.patch

답변:


275

시험

git diff k73ud^..dj374

k73ud결과 diff에 모든 변경 사항을 포함시켜야합니다 .

git diff커밋 범위 대신 두 개의 엔드 포인트를 비교합니다 . OP는에 의해 도입 된 변경 사항을보고 싶어하기 때문에 첫 번째 부모 커밋 : (또는 또는 ) k73ud사이의 차이가 필요합니다 .k73udk73ud^k73ud^1k73ud~

그 방법은 diff결과 변경이 포함됩니다 이후 k73ud (변경 사항을 포함하여 의미를 부모 k73ud대신 도입 변경 자체가) 부터 k73ud (최대를 dj374).

또한 시도해 볼 수 있습니다 :

git diff oldCommit..newCommit
git diff k73ud..dj374 

(1 칸 이상) :

git diff oldCommit newCommit
git diff k73ud dj374

그리고 파일 이름 만 가져와야하는 경우 (예 : 핫픽스를 수동으로 복사) :

git diff k73ud dj374 --name-only

그리고 다른 지점에 적용된 변경 사항을 얻을 수 있습니다.

git diff k73ud dj374 > my.patch
git apply my.patch

5
확실합니까? 자식은 275e8922ab4e995f47a753b88b75c3027444a54c..a8d9d944c32e945cbb9f60b3f724ecc580da86ae 작품은 diff하지만, 자식은 diff 275e8922ab4e995f47a753b88b75c3027444a54c ^ .. a8d9d944c32e945cbb9f60b3f724ecc580da86ae 가져 오기 오류 메시지 - "하지 작업 트리에서 알 수없는 개정이나 경로"
데마

@demas : 내 컴퓨터에서 작동합니다.) git diff 275e8^ a8d9d9' ..' 와 동일하므로 사용할 수도 있습니다 .
VonC

4
@VonC 내 컴퓨터에서 ^ 사용할 필요가 없다
xi.lin

5
@VonC 우분투 14.04. 만 git diff k73ud..dj374OK입니다
xi.lin

1
@BradyDowling 합의. PR diff를 보려면 새 ghCLI를 사용하여 명령 줄에서 확인할 수 있습니다 . stackoverflow.com/a/62031065/6309
VonC

126

차이점을 보려면

작업 사본 및 준비 영역 :

% git diff

준비 영역 및 최신 커밋 :

% git diff --staged

작업 사본 및 커밋 4ac0a6733 :

% git diff 4ac0a6733

4ac0a6733 및 최신 커밋을 커밋하십시오.

% git diff 4ac0a6733 HEAD

4ac0a6733을 커밋하고 커밋 826793951

% git diff 4ac0a6733 826793951

자세한 설명은 공식 문서를 참조하십시오 .


7
또한, 당신은 정말 그냥 그 커밋에 하나 개의 파일의 차이점을보고 싶어 하고 주어진 그 예 중 하나입니다. 겹치는 부분이 있으므로를 참조하십시오 . git diff {x} {y} -- filename{x}{y}git log -p
마이클

54

각 커밋에 도입 된 변경 사항을 보려면 "git log -p"


13
  1. gitk --all
  2. 첫 커밋을 선택하십시오
  3. 다른 하나를 마우스 오른쪽 버튼으로 클릭 한 다음 다른 것을 선택하십시오 →

실제 커밋과 다른 커미터 작성자를 표시하므로 gitk를 조금 덜 신뢰하기 시작합니다.
Ciasto piekarz

10

gitk차이점을 확인하는 데 사용 합니다.

gitk k73ud..dj374

검토하기 쉽도록 GUI 모드가 있습니다.


7

서로 다른 두 커밋의 차이점을 보려면 (와를 호출 a하고 b)

git diff a..b
  • 차이 유의 a하고 b에서 대향 b하고 a.

마지막 커밋과 아직 커밋되지 않은 변경 사항의 차이점을 보려면

git diff

나중에 차이로 되돌아 가려면 파일에 저장할 수 있습니다.

git diff a..b > ../project.diff

5

풀 후 마지막 2 커밋의 변경 사항을 확인하는 가장 간단한 방법은 다음과 같습니다.

git diff HEAD~2 

3

두 커밋 사이의 차이점을 표시하고 우분투에서 잘 작동하는 스크립트를 작성했습니다.

https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc

#!/usr/bin/env python
import sys, subprocess, os

TOOLS = ['bcompare', 'meld']

def execute(command):
    return subprocess.check_output(command)

def getTool():
    for tool in TOOLS:
        try:
            out = execute(['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 = execute(['git', '-C', name, 'log', '--oneline', '--reverse']).splitlines()
        if first_index >= 0:
            commit1 = logs[first_index].split(' ')[0]
        if second_index >= 0:
            commit2 = logs[second_index].split(' ')[0]
    except ValueError:
        if first is not '0':
            commit1 = first
        if second is not '0':
            commit2 = second
    return commit1, commit2

def validateCommitIds(name, commit1, commit2):
    if not commit1 and not commit2:
        print "Nothing to do, exit!"
        return False
    try:
        if commit1:
            execute(['git', '-C', name, 'cat-file', '-t', commit1])
        if commit2:
            execute(['git', '-C', name, 'cat-file', '-t', commit2])
    except subprocess.CalledProcessError:
        return False
    return True

def cleanup(commit1, commit2):
        execute(['rm', '-rf', '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

def checkoutCommit(name, commit):
    if commit:
        execute(['git', 'clone', name, '/tmp/'+commit])
        execute(['git', '-C', '/tmp/'+commit, 'checkout', commit])
    else:
        execute(['mkdir', '/tmp/0'])

def compare(tool, commit1, commit2):
        execute([tool, '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

if __name__=='__main__':
    tool = getTool()
    if not tool:
        print "No GUI diff tools, install bcompare or meld"
        sys.exit(0)
    if len(sys.argv) is not 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 validateCommitIds(name, commit1, commit2) is False:
        sys.exit(0)

    cleanup(commit1, commit2)

    try:
        checkoutCommit(name, commit1)
        checkoutCommit(name, commit2)
        compare(tool, commit1, commit2)
    except KeyboardInterrupt:
        pass
    finally:
        cleanup(commit1, commit2)
    sys.exit(0)

1
재미있는 스크립트. +1
VonC

2

허용되는 답변이 좋습니다.

다시 여기에두면 나중에 이해하기 쉽고 시도하기 쉽습니다.

git diff c1...c2 > mypatch_1.patch  
git diff c1..c2  > mypatch_2.patch  
git diff c1^..c2 > mypatch_3.patch  

위의 모든 명령에 대해 동일한 차이점이 있습니다.

위의 내용은
1에서 커밋 c1과 다른 커밋 c2의
차이점 확인 2. diff를 표시하고 다른 브랜치에 변경 사항을 적용하는 데 사용할 수있는 패치 파일 만들기

차이가 올바르게 표시되지 않으면
c1 및 c2가 잘못 걸릴 수
있으므로 c1에서 c0과 같은 이전 커밋 또는 c2에서 c3과 같은 이전 커밋으로 조정하십시오.

사용 gitk커밋의 SHA의를 볼 수는, 1 일 8 개 문자는 C0, C1, C2 또는 C3로 사용하기에 충분하다. Gitlab> 리포지토리> 커밋 등에서 커밋 ID를 볼 수도 있습니다.

희망이 도움이됩니다.


0

맨 아래에 가장 오래된 커밋이 있다고 가정 해 봅시다.

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

이제 아래를 사용하면 쉽게 서버를 사용할 수 있습니다.

git diff k73ud oldestCommit

-2

commit과 unstaged의 차이점에이 명령을 사용하십시오.

git difftool --dir-diff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.