'git format-patch'와 'git diff'의 차이점은 무엇입니까?


92

'git format-patch'와 'git diff'의 출력 사이에 차이가 없습니다. 그리고 'git diff'를 사용하여 패치를 생성 한 다음 git apply를 사용하여 적용 할 수 없습니까?

내 문제는 인덱스에 변경 사항이 추가되었지만 분명히 git format-patch는 커밋 만 허용하므로 diff의 출력을 사용할 수 있다면이 명령을 사용하여 인덱스의 변경 사항에 대한 패치를 생성 할 수 있습니다.

git diff --cached > index.patch

답변:


129

로 생성 된 패치 git format-patch에는 커밋에 대한 메타 정보 (커미터, 날짜, 커밋 메시지 등)도 포함되며 이진 데이터의 차이가 포함됩니다. 모든 것이 메일 형식으로 지정되어 쉽게 보낼 수 있습니다. 이를 수신 한 사람은 해당 커밋을 다시 만들 수 git am있으며 모든 메타 데이터는 그대로 유지됩니다. git apply간단한 diff의 수퍼 세트이므로 함께 적용 할 수도 있습니다 .

으로 생성 된 패치 git diff는 컨텍스트 (생각 diff -u) 와 함께 간단한 차이가 될 것 입니다. 와 함께 적용 할 수도 git apply있지만 메타 데이터는 다시 생성되지 않습니다 (존재하지 않기 때문에).

요약 git format-patch하면는 커밋을 전송하는 git diff데 유용하고 두 트리 간의 차이를 얻는 데 유용합니다.


12

매뉴얼에서 git-format-patch 는 이메일 제출에 적합한 패치를 준비하고 git-diff 는 변경 사항을 보여줍니다.

그것들은 서로 다른 두 가지이며 다른 목적을 가지고 있습니다. 그들은 단지 패치 형식을 출력합니다. 그러나 git-format-patch커밋에 대한 데이터 (날짜, 작성자, 커밋 메시지)를 추가하고이를 Unix 메일 메시지로 보내기에 적합한 형식으로 번들로 묶습니다 (파일 일 뿐이므로 다른 방법으로 전송하고 git-am).

또한 git-format-patch지정한 범위의 각 커밋에 대한 패치 파일을 생성합니다. 이러한 변경 사항은 git-am.

git-diff요청한 두 상태 간의 차이를 보여주고 패치 파일을 만드는 데 사용할 수 있습니다. 그러나 이것은 일반적인 패치 파일이며 패치를 적용하면 작업 디렉토리의 상태가 변경됩니다.

그리고 예, 그런 식으로 인덱스에 대한 패치를 만들 수 있습니다.


감사. UNIX 메일에 대한 특별한 점은 무엇입니까? 그에 따라 패치를 설계했습니다.
Rafid 2011 년

7
정말 특별한 것은 없습니다. 이것은 git이 Linux 커널에 통합되기 전에 유효성 검사를 위해 이메일로 패치를 보내고받는 작업이 포함 된 Linus Torvalds가 설계 한 것입니다.
Sylvain Defresne 2011 년

Git은 Linux 커널을 유지하기 위해 Linus Torvalds의해 설계되었습니다 . Unix 메일은 일반적인 형식이었습니다.
Abizern 2011 년

1

패치 파일은 git diff명령 으로 생성 할 수 있지만 명령으로 생성 된 패치와 비교할 git format-patch때 주요 차이점은 다음과 같습니다.

  1. 커밋에 대한 메타 데이터가 없습니다 (예 : 날짜, 작성자, 커밋 메시지 등).
  2. diff에 대한 통계가 없습니다 (diffstat, 예 : x 파일 변경, y 삽입 (+), z 삭제 (-));
  3. 바이너리 차이는없고 텍스트 차이 만 있습니다.

여기에 이미지 설명 입력

변경된 모든 파일 (인덱스 또는 작업 디렉토리)에 대한 패치 파일을 생성하려면 다음을 수행하십시오.

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

생성 된 패치 파일을 적용하려면 :

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.