2012-10-12 2 views
10

최근에 git show <hash>을 사용하여 diff를 만들었습니다. 나중에 git diff <hash>~ <hash>보다 입력하기가 쉽고 커밋 정보 (타임 스탬프, 사용자, 해시, 주석)가 표시됩니다.). 그런 다음 git apply <filename>을 사용하여 패치를 적용 할 수 있습니다.`git show`를 사용하여 다중 커밋에 패치 적용 및 적용

git show -3은 동일한 추가 정보와 함께 마지막 세 가지 커밋을 표시합니다. 그러나 git apply은이 파일을 모두 unstaged 변경 사항으로 작업 디렉토리에 스쿼시하고 모든 커밋 정보를 손실합니다.

git에는 모든 정보가 적용될 수 있습니까? 패치를 세 파일로 나누어서 개별적으로 적용하고 새로운 커밋을 만드는 것보다 플래그를 전달하는 것이 훨씬 더 간단합니다.

답변

5

git format-patch을 사용하여 메타 데이터 (메시지, 작성자 등)를 포함하여 커밋을 나타내는 MIME 전자 메일을 생성 할 수 있습니다. 그런 다음 git am으로 다시 적용 할 수 있습니다.

그래서 git format-patch HEAD~3은 마지막 3 개의 커밋에 대해 3 개의 패치를 생성하므로이 모든 것을 git am에 파이프 할 수 있습니다. 좀 더 단순하게하고 싶다면 git format-patch --stdout HEAD~3은 MIME 메시지를 stdout에 보낼 것이므로 3 개의 개별 파일을 다루는 대신 원하는 곳을 파이프 할 수 있습니다.

물론 커밋을 나중에 참조하도록 저장하려는 경우 태그를 지정하는 것이 가장 좋은 이유는 무엇입니까? 그런 다음 git cherry-pick을 사용하여 커밋을 다시 적용 할 수 있습니다.

+0

이 작동처럼 내가해야하지만, 그것은 보인다 가서'git show'를 사용하여 이미 만든 패치를 다시 실행하십시오. 앞으로는 format-patch를 사용하기 시작할 것입니다. 'git cherry-pick'을 사용하지 않는 이유는 새로운 dev 서버로 옮겨 가고 있으며 근본적으로 git에서 읽기 전용 액세스 만 가능하기 때문입니다. 모든 코드 디렉토리를 scp 처리하는 대신 복사 할 패치를 만들고 있습니다. – redbmk

1

히스토리의 특정 부분을 보내려면 git bundle을 시도하십시오.

3

리눅스에서 파이프 할 수 있습니다 귀하의 델타 발생기 git-apply 명령을 예를 들어 --- git-show 또는 git-diff, ---.

  • 이 ABCDEF 에서 만든 특정 파일에 대한 편집을 적용

    > git show <sha1> [<path>] | git apply -3 
    > git diff <sha1-a> <sha1-b> [<path>] | git apply -3 
    

    예 (이 제품은 또한 가능한 안전 항상 -3 옵션을 병합 3 방향을 활성화) :

> git show abcdef dir/file.c | git apply -3 

> git diff abcdef 123456 foo.h | git apply -3

참조 ABCDEF 두 개의 서로 다른 커밋 의 파일에 차이를 적용하고 : https://stackoverflow.com/a/12320940/1329340

관련 문제