작업 디렉토리에 커밋되지 않은 변경 사항이 있다고 가정합니다. 커밋을 만들지 않고 어떻게 패치를 만들 수 있습니까?
작업 디렉토리에 커밋되지 않은 변경 사항이 있다고 가정합니다. 커밋을 만들지 않고 어떻게 패치를 만들 수 있습니까?
답변:
git diff
비 단계적 변경. git diff --cached
단계별 변경
git format-patch
이진 diff 및 일부 메타 정보도 포함합니다. 실제로 이것은 패치를 만드는 데 가장 좋은 방법이지만 소스 / 변경 사항에 대해서만 작동합니다.
git diff --relative
아직 변경 사항을 커밋하지 않은 경우 :
git diff > mypatch.patch
그러나 때로는 수행중인 작업의 일부가 추적되지 않고 git diff
출력에 포함 되지 않는 새 파일이 발생 합니다. 따라서 패치를 수행하는 한 가지 방법은 새 커밋 ( git add
각 파일 또는 그냥 git add .
)에 대한 모든 것을 준비 하지만 커밋을 수행하지 않는 것입니다.
git diff --cached > mypatch.patch
패치에 바이너리 파일 (예 : mp3 파일)을 추가하려면 'binary'옵션을 추가하십시오.
git diff --cached --binary > mypatch.patch
나중에 패치를 적용 할 수 있습니다.
git apply mypatch.patch
참고 : --staged
의 동의어로 사용할 수도 있습니다 --cached
.
git diff --no-color
. 그렇지 않으면 인코딩 문제처럼 보입니다.
git diff
및 git apply
텍스트 파일을 작동하지만 바이너리 파일에 대해 작동하지 않습니다.
전체 바이너리 패치를 쉽게 만들 수 있지만 임시 커밋을 만들어야합니다. 임시 커밋을 만든 후에는 다음을 사용하여 패치를 만들 수 있습니다.
git format-patch <options...>
패치를 작성한 후 다음 명령을 실행하십시오.
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
임시 커밋이 롤백됩니다. 최종 결과는 원래 의도 한 것과 동일한 변경 사항으로 작업 복사본을 의도적으로 더럽게 만듭니다.
수신 측에서 동일한 트릭을 사용하여 커밋 히스토리없이 작업 사본에 변경 사항을 적용 할 수 있습니다. 패치를 적용하기 만하면됩니다 git reset --mixed <SHA of commit *before* the patches>
.
이 전체 옵션이 작동하려면 동기화가 잘되어 있어야합니다. 패치를 작성한 사람이 내가 한 것처럼 많은 변경 사항을 풀지 않았을 때 패치를 적용 할 때 약간의 오류가 발생했습니다. 그것을 작동시키는 방법이 있을지 모르지만, 나는 그것을 자세히 보지 않았습니다.
Tortoise Git에서 동일한 패치를 만드는 방법은 다음과 같습니다 (해당 도구를 사용하지 않는 것이 좋습니다).
Tortoise Git
->를 클릭하십시오.Create Patch Serial
Since
: FETCH_HEAD
동기화가 잘되면 작동합니다)Tortise Git
->를 클릭하십시오.Show Log
reset "<branch>" to this...
Mixed
옵션을 선택하십시오그리고 그것들을 적용하는 방법 :
Tortoise Git
->를 클릭하십시오.Apply Patch Serial
Tortise Git
->를 클릭하십시오.Show Log
reset "<branch>" to this...
Mixed
옵션을 선택하십시오수정 된 파일과 새 파일 (스테이지)을 모두 사용하여 패치를 만들려면 다음을 실행하십시오.
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
하지 않습니다.
file_name.patch
으로 사용할 수 patch
있습니까? 그들은 서로 호환됩니까?
나는 좋아한다 :
git format-patch HEAD~<N>
여기서 <N>
패치로 저장할 마지막 커밋 수입니다.
명령 사용법에 대한 자세한 내용은 DOC에 있습니다.
UPD
여기서 적용하는 방법을 찾을 수 있습니다.
UPDformat-patch
별칭 추가에 대한 아이디어를 얻지 못한 사람들을 위해 :
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
그런 다음 프로젝트 저장소의 디렉토리에서 다음을 실행하십시오.
git make-patch
이 명령은 0001-uncommited.patch
현재 디렉토리에 작성 됩니다. 패치에는 다음 명령에서 볼 수있는 모든 변경 사항과 추적되지 않은 파일이 포함됩니다.
git status .