programing

여러 커밋을 선택하는 방법

showcode 2023. 4. 10. 22:29
반응형

여러 커밋을 선택하는 방법

저는 두 개의 지점이 있습니다.a는 머리이다.b,c,d,e ★★★★★★★★★★★★★★★★★」fac,d,e ★★★★★★★★★★★★★★★★★」fb· : 첫 번째 지점 을 할 수 있습니다c로로 합니다.f두 번째 브런치를 첫 번째 브런치로 재배치합니다. 다 ?c-f령어하??? ??

다음은 시나리오의 시각적 설명입니다(JJD 감사합니다).

여기에 이미지 설명 입력

Git 1.7.2는 다양한 커밋을 선택하는 기능을 도입했습니다.릴리스 노트:

git cherry-pick을 배웠습니다(「커밋의 범위」).cherry-pick A..B ★★★★★★★★★★★★★★★★★」cherry-pick --stdin도 그랬습니다.git revert; 이것들은 보다 좋은 시퀀싱 제어를 지원하지 않습니다.rebase [-i]그래도요.

에서 AB서 (어디서)A보다 많다B를 실행합니다.

git cherry-pick A^..B

A 자체를 무시하려면 다음을 실행합니다.

git cherry-pick A..B

코멘트 메모:

  • A 나이가 많아야 B , 「」A하다
  • 에서는, 「Windows 」, 「 」로 할 필요가 있습니다.A^^..B가 있기 캐럿을 탈출시킬 필요가 있기 때문에, 캐럿을 가 있습니다.그렇지 않으면 캐럿은"A^..B"(미국의)
  • - 아, 아, 아! - 아, 아, 아!zsh, 조개껍데기, 조개껍데기, 조개껍데기.'A^..B'(작은따옴표)는 캐럿이 특수문자이기 때문입니다.
  • 박람회에 대해서는 가브리엘 스테이플러스의 답변을 참고하세요.

(댓글에서 Damian, J. B. Rainsberger, sschaef, Neptilo, Pete 및 TMin에 대한 크레딧)

A, B, C, D, E, F, G, H, I, J에서 A, C, F, J의 리비전을 선택할 경우 다음 명령을 사용합니다.

git cherry-pick A C F J

은 ""를 입니다.onto " " " option to " " option to " )rebase가 에 a mybranch를 입니다.c-f클릭합니다.

# checkout mybranch
git checkout mybranch

# reset it to f (currently includes a)
git reset --hard f

# rebase every commit after b and transplant it onto a
git rebase --onto a b

또는 요청된 원라이너:

git rebase --onto a b f

단일 커밋, 여러 커밋 또는 일련의 커밋을 체리픽하는 방법

...현재 체크아웃된 지점:

1. 하나의 브랜치 또는 커밋을 Cherry로 선택한다.commit

git cherry-pick commit

예:

git cherry-pick my_branch                                 # by branch name
git cherry-pick 1e038f108a130831f108329b1083a8139813fabc  # by full hash
git cherry-pick 1e038f10                                  # by partial hash

2. 복수의 커밋을 체리픽하다

임의의 수의 커밋해시한번에 원하는 순서선택할 수 있습니다.한 번에 한 번씩 지정된 순서대로 적용됩니다.충돌이 발생하면 한 번에 하나씩 해결한 후 다음을 사용해야 합니다.git add my_filegit cherry-pick --continue을 사용하다

git cherry-pick commit1 commit2 commit3 commit4 commit5

3. 일련의 커밋을 체리픽하다

저는 원래 이 스타일의 기본을 여기서 @Eric Darchis가 가장 많이 인용한 답변에서 배웠습니다.

커밋 범위를 체리픽 하려면 시작 및 종료 커밋해시를 지정해야 합니다...그들 사이에.단, 커밋 범위에서는 첫 번째 커밋은 포함되지 않습니다.따라서 커밋을 포함하려면 시작 커밋 전에 커밋을 지정해야 합니다.의 커밋을 지정하는 구문은 다음과 같습니다.~,~1 , 「」^다음 예시와 같이 커밋 직후에 표시됩니다.beginning_commit~ "", "커밋"beginning_commit

# A. INCLUDING the beginning_commit
git cherry-pick beginning_commit~..ending_commit
# OR (same as above)
git cherry-pick beginning_commit~1..ending_commit
# OR (same as above)
git cherry-pick beginning_commit^..ending_commit 

# B. NOT including the beginning_commit
git cherry-pick beginning_commit..ending_commit

commit~,commit~1 , , , , 입니다.commit^모두 '전 하나의 약속'을 의미한다. commitother sayed: " " " " " " " before " " " " ' ' "commit

2개의 커밋을 지정하기 전에commit할 수 있습니다 , 하다, 하다, 하다, 이렇게요.

commit~~
commit~2  # my preferred syntax
commit^^

3개의 커밋을 지정하기 전에commit이치노

commit~~~  
commit~3   # my preferred syntax
commit^^^

이것은 동작하지 않습니다.

commit^3   # INVALID syntax

구문'직접 은 '이전 커밋 구문'을입니다.git log명령어를 입력합니다. : :

git log commit
git log commit~
git log commit~1
git log commit^
git log commit~~
git log commit~5
# etc.

4. 브랜치에 대한 동료의 커밋 범위를 선택한다.

의 지부가브런치가peer_branch는 이전 의 브런치에서 되어 있습니다.my_branch.

간단한 개요

# you cherry-pick all of their extra commits from their `peer_branch` onto 
# your `my_branch` (note: the 3 dots below are very important!)

git fetch origin peer_branch  # get their latest changes from the remote
git checkout my_branch        # ensure you're on your branch
# cherry-pick their range of commits
git cherry-pick my_branch...origin/peer_branch  
git log                       # review the commits you just chery-picked
git push                      # push your changes to the remote

상세 및 워크플로우 워크스루

를 들어,해 보겠습니다.my_branch피어가 기능 변경을 지원하려고 합니다. 밀었네요.my_branch " " " " " 에 합니다.origin그래서 그들은 당신의 리모트브런치를 가져오게 됩니다my_branch합니다.peer_brach후, 「지점」이라고 하는 합니다.peer_branch이렇게 하면 추가되는 모든 항목을 한 번에 선택할 수 있습니다.의 첫 .

# **your peer** does this

# peer fetches your branch named `my_branch` and forks their `peer_branch`
# off of it

# they fetch your latest work from remote `my_branch` into their locally-stored
# remote-tracking "hidden" branch named `origin/my_branch`
# (note: you can see all locally-stored remote-tracking "hidden" branches
# with `git branch -r`)
git fetch origin my_branch
# create `peer_branch` as a fork off of `origin/my_branch`, and check it out
git checkout -b peer_branch origin/my_branch

# Now they can add their changes and commits and `git push` to remote `origin`
# as their own `peer_branch` when done.

을 리모트 .origin그 named named named named named named named named named peer_branch작업 위에 추가한 커밋을 모두 다음과 같이 선택할 수 있습니다.

# **you** do this to cherry-pick your peer's helpful changes they added to 
# your work

# you fetch their latest work from their branch named `peer_branch` on remote
# `origin` into your locally-stored remote-tracking "hidden" branch named 
# `origin/peer_branch` 
# (note: you can see all locally-stored remote-tracking "hidden" branches
# with `git branch -r`)
git fetch origin peer_branch
# ensure you are on `my_branch` (if you aren't already)
git checkout my_branch
# you cherry-pick all of their extra commits from their `peer_branch` onto 
# your `my_branch` (note: the 3 dots here are very important!)
git cherry-pick my_branch...origin/peer_branch

git log                       # review the commits you just chery-picked
git push                      # push your changes to the remote

수 있도록, 그 은요.cherry-pick위의 명령어(도트 3개 포함)는 이 긴 명령어와 정확히 동일합니다.

git cherry-pick $(git merge-base my_branch origin/peer_branch)..origin/peer_branch

git merge-base my_branch origin/peer_branch는 브랜치 파트 .my_branch 브랜치(「」)origin/peer_branch의 목표를 peer_branchmy_branch그리고, 그 시점부터 (그 시점까지)의 커밋의 범위를 체리피킹 합니다...의 최종 은 ( )에 있습니다.origin/peer_branch.

이 3 도트 구문에 대한 자세한 내용은 다음을 참조하십시오.Git diff commit range에서 이중".."과 삼중 점 "..."의 차이점은 무엇입니까?에 대한 도움말git checkout -b new_branch from_branch다른 브랜치에서 git에 브랜치를 작성하는 다양한 방법

더 나아가다

  1. : a 타타 a a : agit rebase한 무더기의 순차적 표현일 뿐인데git cherry-picks. 여기서 나의 다른 답변을 보세요(Git에 따르면 누가 "우리"이고 누가 "그들"인가?). 여기서 나는 무엇보다도 내가 만든 ASCII 도면을 보여줍니다.git rebase동작하고 있습니다.
  2. Git diff 커밋 범위에서 이중 점 ".."과 삼중 점 "..."의 차이점은 무엇입니까?
  3. 다른 브랜치에서 git에 브랜치를 만드는 다양한 방법에 대한 답변

'의 조합'을 할 수 .git rebase ★★★★★★★★★★★★★★★★★」git branch커밋 그룹을 다른 브랜치에 적용합니다.wolfc가 이미 게시한 것처럼 첫 번째 명령어는 커밋을 실제로 복사합니다.단, 그룹의 최상위 커밋에 브랜치 이름을 추가할 때까지는 변경이 표시되지 않습니다.

새 탭에서 그림을 여십시오...

워크플로우

명령어를 텍스트 형식으로 요약하려면:

  1. 다음 명령을 사용하여 독립 프로세스로 gitk를 엽니다.gitk --all &.
  2. 실행합니다.git rebase --onto a b f.
  3. gitk를 누릅니다.아무것도 변하지 않는다.하지만 아니다HEAD마크가 붙어 있습니다.
  4. 실행합니다.git branch selection
  5. gitk를 누릅니다.커밋을 포함한 새로운 브런치가 표시됩니다.

이를 통해 다음과 같은 사항을 명확히 할 수 있습니다.

  • a는 그룹의 새로운 루트 수신처입니다.
  • b는 그룹의 첫 번째 커밋 전의 커밋입니다.
  • f는 그룹의 마지막 커밋입니다(커밋).

후에 ㅇㅇㅇ를 사용할 수 .git checkout feature && git reset --hard bcf feature★★★★★★ 。

이 답변에 덧붙여, 일반적인 사용에 도움이 되는 다른 시나리오의 커맨드를 기술한 블로그 투고를 작성했습니다.

J. B. Rainsberger와 sschaef의 코멘트를 적용해서 질문에 대한 답변을 드리자면...이 예에서 체리픽 범위를 사용하려면 다음 절차를 수행합니다.

git checkout a
git cherry-pick b..f

또는

git checkout a
git cherry-pick c^..f
git rev-list --reverse b..f | xargs -n 1 git cherry-pick

git rev-list b로로 합니다.f hash)각 행(commit hash)이각 git(commit hash)에HEAD 말해아예.git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...

-- @coderachet 코멘트

커밋 ID에서 브랜치 끝까지의 체리픽을 사용하려면 다음 명령을 사용합니다.

git cherry-pick commit_id^..branch_name

가 있는 입니다.n 「커밋」, 「커밋」,~구문은 도움이 됩니다.

git cherry-pick some-branch~4..some-branch

는 마지막 합니다.브런치에서는 4개의 커밋을 합니다.some-branch

체리픽 복수 커밋:

커밋을 선택하고 싶은 지점 체크아웃

다음 명령어를 사용합니다(부분 해시 사용).

git cherry-pick 1e038f10 1e038f11 1e038f12 ...

실제로 가장 간단한 방법은 다음과 같습니다.

  1. 하다: 2 지점 간 Marge-BaseMERGE_BASE=$(git merge-base branch-a branch-b)
  2. 오래된 브런치를 새로운 브런치로 빨리 감기 또는 기본 재배치
  3. 스텝 1의 머지 베이스에서 시작하여 결과 브랜치를 그 자체에 다시 베이스로 하여 불필요한 커밋을 수동으로 삭제합니다.

    git rebase ${SAVED_MERGE_BASE} -i
    

    또는 새로운 커밋이 몇 개밖에 없는 경우 스텝1을 건너뛰고 단순히

    git rebase HEAD^^^^^^^ -i
    

    번째 단계에서는 충분한 방법을 ^머지 베이스로 이동합니다.

인터랙티브 리베이스에는 다음과 같은 것이 표시됩니다.

pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f

그런 다음 b행(및 기타 필요한 행)을 삭제합니다.


우선 순위에서 한 지점에서 다른 지점으로 커밋을 선택해야 하는데, 여기서의 커밋은 이해하기 어려웠습니다.아래에서 간단한 커밋에 도움이 되었으면 합니다.


다음 절차를 수행합니다.

  1. "dev" 브랜치에서 이름("Remove Last Name field")을 사용하여 1개의 커밋을 가져옵니다.
  2. "hotfix1" 브랜치로 커밋

1. "dev" 브랜치에서 커밋 세부 정보를 가져옵니다.

// Go to "dev" branch
git checkout dev

// Get the commit id (1e2e3e4e1 here)
git log --oneline

    > ...
    > ...
    > 1e2e3e4e1     Remove Last Name field
    > ...
    > ...

2. 커밋을 "hotfix1" 브랜치에 푸시합니다.

// Go to "hotfix1" branch
git checkout hotfix1

// Get the commit (1e2e3e4e1) from "dev" branch to "hotfix1" branch
git cherry-pick 1e2e3e4e1

// verify changes are correct
gitk

// push to "hotfix1" branch
git push

한 번에 여러 개, 위의 1개의 변경만 수행하려면 모든 커밋 ID를 순서대로 지정합니다.

git cherry-pick 1e2e3e4e1 1e2e3e4e2 1e2e3e4e3

여기에서는, 체리 픽의 송신원과 타겟 브랜치, 커밋의 수를 스크립트에 통지하는 것만으로, 연속해 복수의 커밋을 선택할 수 있는 스크립트를 나타냅니다.

https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81

브런치에서 체리픽을 선택하여 마스터하려면(현재 브런치를 소스로 사용):

./gcpl.sh -m

6.19.x 브런치에서 마스터하기 위한 최신 5개의 커밋을 선택하려면:

./gcpl.sh -c 5 -s 6.19.x -t master

또는 GitHub 데스크톱 애플리케이션을 사용할 수도 있습니다.

소스 분기의 이력 탭에서 커밋을 여러 개 선택한 다음 마우스 오른쪽 버튼을 클릭하여 "선택한 커밋을 선택" 옵션을 얻을 수 있습니다.

commit-ish 외에 stdin에서 SHA 목록을 파이프로 연결할 수 있습니다.

git rev-list --reverse ..main -- path/ | git cherry-pick --stdin 

rev-list기본적으로 ("사촌"이지만 빠른 사촌")의 배관 명령입니다.git-log 필요한 NB.

단순한 커밋 범위가 아닌 보다 고도의 작업을 수행할 수 있습니다.

git format-patch --full-index --binary --stdout range... | git am -3

언급URL : https://stackoverflow.com/questions/1670970/how-to-cherry-pick-multiple-commits

반응형