programing

부분적으로 깃과 약속을 선택하는 것.

telebox 2023. 5. 22. 20:56
반응형

부분적으로 깃과 약속을 선택하는 것.

저는 출시와 개발이라는 개의 다른 부서에서 일하고 있습니다.

릴리스 분기에 커밋된 일부 변경 사항을 개발 분기에 다시 통합해야 한다는 것을 알게 되었습니다.

문제는 모든 커밋이 필요한 것이 아니라 특정 파일의 일부 펑크만 필요하기 때문에 단순합니다.

git cherry-pick bc66559

속임수를 쓰지 않습니다.

내가 할 때

git show bc66559

차이는 알 수 있지만 현재 작업 트리에 부분적으로 적용할 수 있는 좋은 방법을 잘 모르겠습니다.

여기서 당신이 원하는 핵심은git add -p(-p의 동의어입니다.--patch이렇게 하면 대화식으로 콘텐츠를 추가할 수 있으며, 각 헝크가 들어갈지 여부를 결정할 수 있으며, 필요한 경우 패치를 수동으로 편집할 수도 있습니다.

체리 픽과 함께 사용하기

git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset                   # unstage the changes from the cherry-picked commit
git add -p                  # make all your choices (add the changes you do want)
git commit                  # make the commit!

(팀 헤니건 덕분에)git-cherry-pick을 가지고 있습니다.--no-commit선택권, 그리고 당신이 필요하다고 지적해준 펠릭스 라베에게 감사합니다.git reset커밋에서 몇 가지만 제외하고 싶다면 다음을 사용할 수 있습니다.git reset <path>...이러한 파일의 스테이징을 해제합니다.)

특정 경로를 제공할 수 있습니다.add -p필요하면.패치로 시작하는 경우 다음을 대체할 수 있습니다.cherry-pick와 함께apply.


당신이 정말 원한다면,git cherry-pick -p <commit>(해당 옵션이 존재하지 않음), 사용할 수 있습니다.

git checkout -p <commit>

지정한 커밋에 대해 현재 커밋을 다르게 설정하고 해당 커밋에서 개별적으로 헝크를 적용할 수 있습니다.이 옵션은 끌어 들이는 커밋에서 관심 없는 커밋의 일부가 병합 충돌하는 경우에 더 유용할 수 있습니다.checkout다르다cherry-pick:checkout적용하려고 합니다.<commit>의 내용은 전적으로, 반면에.cherry-pick지정한 커밋과 상위 커밋의 차이를 적용합니다.즉,checkout해당 커밋 이상을 적용할 수 있으며, 원하는 것 이상일 수 있습니다.)

오래된 질문에 답하고 있다는 것은 알지만 대화형 체크아웃을 통해 이를 수행할 수 있는 새로운 방법이 있는 것 같습니다.

git checkout -p bc66559

크레딧: 다른 커밋에서 쌍방향으로 펑크를 선택할 수 있습니까?

원하는 변경사항이 변경할 지점의 선두에 있다고 가정하고 git checkout을 사용합니다.

단일 파일의 경우:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

여러 파일의 경우 데이지 체인만:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb

Mike Monkiewicz 답변을 기반으로 제공된 sha1/branch에서 체크아웃할 단일 파일을 지정할 수도 있습니다.

git checkout -p bc66559 -- path/to/file.java 

이렇게 하면 현재 버전의 파일에 적용할 변경 사항을 대화형으로 선택할 수 있습니다.

명령줄에 파일 목록을 지정하고 단일 원자 명령으로 모든 작업을 수행하려면 다음을 수행합니다.

git apply --3way <(git show -- list-of-files)

--3way적용되지 가 실행할 수 .git mergetool 생략--3way깨끗하게 적용되지 않는 패치를 포기하도록 Git를 만들 것입니다.

사용하다git format-patch 당이관있심부분잘그고라리고내을는신▁to그리고▁of▁slice▁the▁part고▁out.git am 지점에 ▁to해.

git format-patch <sha> -- path/to/file
git checkout other-branch
git am *.patch

" 피킹이 "에서, 사항은 하고 다른 변경 사항은 것 " 분적으가따체를파기", "일부변사사폐기은변항다경른선택항부경하고서은로다의미니있습하수수경식는으방는할로행오가져을음다이는우리에내일▁"▁in,▁if▁▁picking,▁means▁files"▁by"ing부를▁otherspart▁"ly▁cherry▁it▁done▁bewithin▁choosing▁can다있▁but니습수▁some▁"할수행가으식로분적으▁changes방▁discard는파git stash:

  1. 체리픽 풀로 해주세요.
  2. git reset HEAD^전체 체리 소스 커밋을 단계별 작업 변경으로 전환합니다.
  3. 지금이다git stash save --patch저장할 원하지 않는 재료를 대화식으로 선택합니다.
  4. Git는 작업 복사본에서 저장된 변경사항을 롤백합니다.
  5. git commit
  6. 원하지 않는 변경사항의 저장을 폐기합니다.git stash drop.

않는 팁: 원: 치않는변내저지경우이름:git stash save --patch junk그런 다음 지금 (6)하는 것을 잊으면 나중에 그것이 무엇인지에 대한 저장소를 인식할 수 있습니다.

사실, 이 질문에 대한 가장 좋은 해결책은 다음과 같습니다.checkout표창을 수여하다

git checkout <branch> <path1>,<path2> ..

예를 들어 마스터에 있다고 가정하면 dev1에서 변경된 내용을project1/Controller/WebController1.java그리고.project1/Service/WebService1.java다음을 사용할 수 있습니다.

git checkout dev1 project1/Controller/WebController1.java project1/Service/WebService1.java

즉, 마스터 분기는 이러한 두 경로의 dev1에서만 업데이트됩니다.

언급URL : https://stackoverflow.com/questions/1526044/partly-cherry-picking-a-commit-with-git

반응형