programing

중간 커밋 없이 두 커밋 간의 변화를 확인하는 방법은 무엇입니까?

stoneblock 2023. 4. 14. 21:06

중간 커밋 없이 두 커밋 간의 변화를 확인하는 방법은 무엇입니까?

떻떻은 만들어요?git diff다른 커밋은 제외하고 두 커밋의 차이만 표시합니까?

다음과 같이 2개의 커밋을 git diff에 전달하기만 하면 됩니다.

-> git diff 0da94be  59ff30c > my.patch
-> git apply my.patch

커밋을 포함하지 않고 /between/두 커밋의 차이를 묻는 것은 의미가 없습니다.커밋은 저장소의 내용에 대한 스냅샷일 뿐입니다.커밋은 반드시 2개의 내용을 포함합니다.그래서 질문은, 정말로 무엇을 찾고 있느냐는 것입니다.

윌리엄이 제안했듯이 체리피킹은 다른 것에 기반한 단일 커밋의 델타감을 줄 수 있습니다.즉, 다음과 같습니다.

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached

이 경우 커밋 'abcdef'를 사용하여 직계 상위 항목과 비교한 다음 '012345' 위에 그 차이를 적용합니다.이 새로운 차이가 표시됩니다.유일한 변경사항은 컨텍스트가 'abcdef'의 직계 상위 항목이 아닌 '012345'에서 온 것입니다.물론 충돌 등이 발생할 수 있기 때문에 대부분의 경우 그다지 도움이 되지 않습니다.

abcdef 자체에 관심이 있다면 다음을 수행할 수 있습니다.

$ git log -u -1 abcdef

이것은 abcdef를 직계 조상과 비교하며, 일반적으로 원하는 대로입니다.

그리고 물론.

$ git diff 012345..abcdef

두 커밋의 모든 차이를 보여줍니다.

달성하려는 것이 무엇인지 더 잘 이해하는 데 도움이 될 것입니다. 앞서 언급했듯이, 중간이 없는 두 가지 약속의 차이를 요구하는 것은 실제로 말이 되지 않습니다.

패치로서 2개의 git 커밋 12345와 abcdef를 비교하려면 diff 명령어를 다음과 같이 사용할 수 있습니다.

diff <(git show 123456) <(git show abcdef)
git diff <a-commit> <another-commit> path

예:

git diff commit1 commit2 config/routes.rb

이러한 커밋 간의 파일상의 차이를 나타냅니다.

변경 내용을 확인하려면:

  git diff <commit_Id_1> <commit_Id_2>

변경/추가/삭제된 파일만 확인하는 경우:

  git diff <commit_Id_1> <commit_Id_2> --name-only

메모: commit을 사용하지 않고 diff를 체크하는 경우 commit ID를 입력할 필요가 없습니다.

이게 있다고 칩시다.

A
|
B    A0
|    |
C    D
\   /
  |
 ...

, 「이러다」가, 「이러다」가 되어 있는 해 주세요.A is is is is is와 A0

이렇게 하면 효과가 있습니다.

$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff

Git 2.19 이후는, 다음의 조작을 간단하게 실시할 수 있습니다.

git range-diff rev1...rev2- 두트리를 - -- 、 통 - 、 - - 、 - - 、 - -,, 。

★★★★★★★★★★★★★★★★★」git range-diff rev1~..rev1 rev2~..rev2 커밋에 - 2개의 커밋에 의해 도입된 변경 비교 - 2개의 커밋을 사용합니다.

커밋 012345와 abcdef의 차이를 확인한다고 가정합니다.다음은 사용자가 원하는 작업을 수행합니다.

$git 체크아웃 012345$git 체리픽 -n abcdef$git diff --개요

이건 어때?

git diff abcdef 123456 | less

여러 가지 차이를 즉시 비교하고 싶다면 더 적게 파이프로 연결하면 편리합니다.

GitHub에서 직접 차이를 확인하려면 다음을 수행할 수 있습니다.https://github.com/<username>/<reponame>/compare/<commit1>..<commit2>

commit1그리고.commit2브랜치명 또는 커밋을 지정할 수 있습니다.

예:

커밋 비교에서 자세히 알아보기

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)

나의alias설정~/.bashrc을 신청하다.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

나의alias설정~/.zshrc을 신청하다.git diff:

alias gdf='git diff HEAD{'^',}' # diff between your recent tow commits

고마워 @진묘오뤄


git diff HEAD~2 HEAD

최신 두 번째 커밋과 현재 커밋 사이의 완전한 변경.

HEAD편리하다

$140 로그

commit-1(new/latest/recent commit)
commit-2
commit-3
commit-4
*
*
commit-n(first commit)

$140 diff commit-2 commit-1

commit-2에서 commit-1까지의 모든 변경(commit-1만 해당)git diff HEAD~1 HEAD)

마찬가지로 $diff diff commit-4 commit-1

commit-4에서 commit-1(commit-1, commit-2 및 commit-3의 조합)까지의 모든 변경을 표시합니다.등가git diff HEAD~3 HEAD)

$140 diff commit-1 commit-2

주문 커밋 ID를 변경하면 ("$git diff commit-1 commit-2 > revert_patch_of_commit-1.diff")를 얻을 수 있습니다.

이러한 상황에서 사용할 수 있는 간단한 GUI/바보 인증 방식을 소개합니다.

  1. 레포의 다른 복사본을 새 폴더에 복제합니다(예:myRepo_temp
  2. 원래의 리포에서 커밋과 비교하는 커밋/브런치를 체크 아웃 합니다(myRepo_original).
  3. 이 2개의 폴더(Beyond Compare 등)에서 diff 툴을 사용할 수 있게 되었습니다.myRepo_temp그리고.myRepo_original)

예를 들어 한 폴더에서 다른 폴더로 항목을 복사할 수 있으므로 일부 변경 사항을 부분적으로 되돌리려는 경우 유용합니다.

언급URL : https://stackoverflow.com/questions/1191282/how-to-see-the-changes-between-two-commits-without-commits-in-between