커밋을 브랜치에서 다른 브랜치로 복사하려면 어떻게 해야 합니까?
주인님께 두 가지 분부를 받았습니다.
- v2.1: (버전 2) 몇 달 동안 작업 중
- wss: 마스터에 특정 기능을 추가하기 위해 어제 작성한 것(실가동 중)
어제 커밋을 wss에서 v2.1로 복사할 수 있는 방법이 있습니까?
사용하다
git cherry-pick <commit>
<commit>
현재 지점으로 이동합니다.
도 아마 제가 입니다.gitk
대신 커밋 엔트리에 오른쪽 마크가 붙어 있는 체리픽을 선택합니다.
을 무릅쓰고) ( )를 사용하여 할 수 .git log
함께)--pretty
Jefromi (제프로미)
git log --reverse --since=yesterday --pretty=%H
다 할 때 다 같이 사용한다고 가정하면요.bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
만약 이쪽이 잘못되면(가능성이 많다) 라이브 체크 아웃에서 동작하기 때문에 곤란합니다.수동 체리 픽을 하거나 Jefromi의 제안대로 리베이스로 합니다.
다음 사항을 병합하여 이 모든 작업을 수행할 수 있는 워크플로우가 있어야 합니다.
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
당신이 할 은 오직 '만들면 됩니다.git checkout v2.1
★★★★★★★★★★★★★★★★★」git merge wss
어떤 이유로든 이것을 할 수 없고 git rebase를 사용하여 wss 브런치를 올바른 곳으로 이동할 수 없다면 git chree-pick 명령어는 git cherry-pick입니다.적용할 브런치를 체크하고 실행하기만 하면 됩니다.git cherry-pick <SHA of commit to cherry-pick>
.
기본 재배치 방법 중 몇 가지를 사용하면 절약할 수 있습니다.
이력이 다음과 같은 경우:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (v2-only) - x - x - x (wss)
하면 .git rebase --onto v2 v2-only wss
하려면: v2로 이동합니다.
- x - x - x (v2) - x - x - x (v2.1)
|\
| x - x - x (v2-only)
\
x - x - x (wss)
그럼 병합할 수 있어!만약 당신이 정말로, 정말로 당신이 결합할 수 있는 지점에 도달할 수 없다면, 당신은 여러 개의 체리픽을 한번에 효과적으로 하기 위해 rebase를 사용할 수 있습니다.
# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase
주의: 이 작업을 수행하기 위해 추가 작업이 필요한 이유는 저장소에 중복된 커밋을 생성하기 때문입니다.이것은 그다지 좋은 일이 아닙니다.간단한 분기 및 결합의 목적은 모든 것을 한 곳에서 약속하고 필요한 곳에 결합하는 것입니다.중복 커밋은 이러한 두 분기를 병합하지 않겠다는 의도입니다(나중에 병합하기로 결정하면 충돌이 발생합니다).
git cherry-pick
: 커밋에 」 「 」 「 」
브랜치 A에 (X, Y, Z) 커밋이 있다고 가정합니다.이 커밋을 브랜치B에 추가해야 합니다.이 명령어를 사용합니다.cherry-pick
운용을 실시합니다.
★★★★★★를 사용하는 경우cherry-pick
브랜치 B에 커밋을 추가하는 것은 브랜치A에 커밋이 표시되는 것과 같은 시간순으로 해야 합니다.
체리픽은 다양한 커밋을 지원하지만 그 범위에 머지 커밋이 있는 경우 매우 복잡해집니다.
git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z
워크플로우의 예:
하면 됩니다.cherry-pick
옵션 포함
-e 또는 --edit : 이 옵션을 사용하면 커밋하기 전에 git chree-pick을 사용하여 커밋 메시지를 편집할 수 있습니다.
-n 또는 --no-commit : 보통 명령어는 일련의 커밋을 자동으로 만듭니다.이 플래그는 커밋을 하지 않고 작업 트리와 인덱스에 이름이 붙은 각 커밋을 체리픽하기 위해 필요한 변경을 적용합니다.또한 이 옵션을 사용하는 경우 인덱스가 HEAD 커밋과 일치할 필요가 없습니다.체리픽은 인덱스의 시작 상태를 기준으로 수행됩니다.
여기 에 관한 흥미로운 기사가 있다.cherry-pick
.
마스터 브랜치에 변경을 커밋했다고 가정합니다.ID(「ID」)를 합니다.xyz
를 참조해 주세요를 참조해 주세요.그럼 내가 커밋을 강요해야 할 지점으로 가야 해
ID " " " IDxyz
git checkout branch-name
git cherry-pick xyz
git push origin branch-name
ID > の 커 xyz
abc
qwe
git checkout branch-name
git cherry-pick xyz abc qwe
git push origin branch-name
이미 언급된 답변은 대부분의 내용을 포함하고 있지만, 한 가지 누락된 것은 다음과 같습니다.--no-commit
징 cherry-pick
기능 브랜치에 복수의 커밋이 있어, 모든 커밋을 1개의 커밋으로 「머지」해, 그것들을 메인 브랜치에 배치한다고 합니다.이 경우 필요한 것은 다음과 같습니다.
git checkout <branch-on-which-to-add-features>
git cherry-pick --no-commit <commit-hash>
git cherry-pick --no-commit <commit-hash>
.
.
.
그리고 마지막으로, 일단 당신이cherry-pick
필요한 기능을 모두 갖추어 최종 커밋을 실시할 수 있습니다.
git commit -m "Some message for the merge commit"
이상적으로는 @Cascabel에서 언급했듯이merge
★★★★★★★★★★★★★★★★★」rebase
어쩔 수 ' 수 '는 표현을 쓰면 될 것 같아요cherry-pick
카피하는 커밋으로부터 패치를 작성해, 행선지 브랜치에 적용할 수 있습니다.
아니면 당신이 전도사 편이 아니라면 당신은 내가 사용하는 약간 추한 방법을 사용할 수 있습니다.deploy_template에는 지점 전개로 마스터에 복사하는 커밋이 있습니다.
git branch deploy deploy_template
git checkout deploy
git rebase master
이렇게 하면 deploy_template에 새 분기 배포(기존 배포 분기를 덮어쓰기 위해 -f를 사용)가 생성된 다음 이 새 분기를 마스터로 다시 기본화하고 deploy_template는 변경되지 않습니다.
또 다른 접근법이 있습니다.
git checkout {SOURCE_BRANCH} # switch to Source branch.
git checkout {COMMIT_HASH} # go back to the desired commit.
git checkout -b {temp_branch} # create a new temporary branch from {COMMIT_HASH} snapshot.
git checkout {TARGET_BRANCH} # switch to Target branch.
git merge {temp_branch} # merge code to your Target branch.
git branch -d {temp_branch} # delete the temp branch.
특정 커밋을 선택하기 위해 내장된 git gui를 사용하는 것이 더 안전합니다.
예: 1개의 커밋 복사원dev
로 분기하다.main
브랜치:
git checkout main
gitk --all
원하는 커밋을 오른쪽 클릭하여Cherry-pick this commit
cherry-pick 명령어는 표준 입력에서 커밋 목록을 읽을 수 있습니다.
다음 명령어는 "develope" 브랜치에는 있지만 "release" 브랜치에는 없는 사용자 John에 의해 작성된 것으로, 시간순으로 커밋됩니다.
git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin
브랜치 wss에서v2.1로 마지막 커밋을 복사하는 간단한 경우 커밋 ID(git log --oneline | head -n 1
) 및 다음 작업을 수행합니다.
git checkout v2.1
git merge <commit>
언급URL : https://stackoverflow.com/questions/2474353/how-to-copy-commits-from-one-branch-to-another
'programing' 카테고리의 다른 글
WPF 데이터 바인딩:"부모" 데이터 컨텍스트에 액세스하려면 어떻게 해야 합니까? (0) | 2023.04.23 |
---|---|
SQL Server: MAX(DATE) 행만 선택 (0) | 2023.04.23 |
Azure 서비스 프린서펄이 뭐죠? (0) | 2023.04.23 |
환경변수가 존재하는지 확인하고 그 값을 얻는 방법 (0) | 2023.04.23 |
실행 중인 PowerShell 스크립트의 모든 환경 변수 표시 (0) | 2023.04.23 |