중간 커밋 없이 두 커밋 간의 변화를 확인하는 방법은 무엇입니까?
떻떻은 만들어요?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
브랜치명 또는 커밋을 지정할 수 있습니다.
예:
- 브랜치 비교
gs/add-explicit-paths-to-js-files
와 함께gs/add-history-helper
- https://github.com/twbs/bootstrap/compare/gs/add-explicit-paths-to-js-files . gs / add - history - displays - 비교 커밋
75e09b1c0f5ae5f51078c7a25fe36d892c5cfcfe
와 함께585146a6a7aa70faf25442d7d28636ce57e29588
- https://github.com/twbs/bootstrap/compare/75e09b1c0f5ae5f51078c7a25fe36d892c5cfcfe..585146a6a7a70faf25442d7d28636ce57e29588
커밋 비교에서 자세히 알아보기
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/바보 인증 방식을 소개합니다.
- 레포의 다른 복사본을 새 폴더에 복제합니다(예:
myRepo_temp
- 원래의 리포에서 커밋과 비교하는 커밋/브런치를 체크 아웃 합니다(
myRepo_original
). - 이 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
'programing' 카테고리의 다른 글
보기가 표시되기 전에 iPhone에서 UITableView의 맨 아래까지 스크롤하는 방법 (0) | 2023.04.14 |
---|---|
종속 속성에서 속성 변경 이벤트를 발생시키는 방법 (0) | 2023.04.14 |
거북이SVN 아이콘이 Windows 7에 표시되지 않음 (0) | 2023.04.14 |
엔티티 프레임워크에 가장 빠르게 삽입하는 방법 (0) | 2023.04.14 |
WPF/XAML의 오픈 소스 대체 방법에는 어떤 것이 있습니까? (0) | 2023.04.14 |