sourcetip

한 분기에 있는 커밋이 다른 분기에 없는 것을 확인하는 방법은 무엇입니까?

fileupload 2023. 7. 7. 21:01
반응형

한 분기에 있는 커밋이 다른 분기에 없는 것을 확인하는 방법은 무엇입니까?

나는 두 개의 가지가 있습니다.devel그리고.next실제로 저는 상당한 양의 커밋을 보유하고 있습니다.일부 커밋은 선택된 것으로 간주됩니다.next또한 다음에 병합되는 몇 가지 커밋을 추가했습니다.devel.

이제 무엇이 부족한지 보고 싶습니다.next그래서 나는 그것들을 가져오기 전에 그것들을 자세히 테스트할 수 있습니다.next이 제질문이확수있까습니인어할떻중게인실행지밋이커어은제에 있는지 어떻게 알 수 요?devel하지만 다음엔 안 되나요?

되지 않는 명령어 의거사않명령어는git cherry()로 아직 체리 제거되지 않은 커밋을 보여줍니다.

간단히 말해서:

git cherry <feature-branch> [base-branch]
# Checkout the base branch
git checkout main

# Diff against the target branch
git cherry -v next

# Diff against the target branch, without switching
git cherry -v next main

출력 예:

+ 492508acab7b454eee8b805f8ba906056eede0ff feat: make bazzable
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949 hotfix: off-by-one
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b feat: add bar
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9 feat: add foo

+커밋은 에만 있고 에는 없음을 의미합니다.
-커밋이 두 분기에 모두 있음을 의미합니다.

를 합니다.-v제목 줄 없이 커밋을 수행하려면 다음과 같이 하십시오.

+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9

또한 이 기능을 사용하여 분기 간에 공유되지 않은 실제 서로 다른 커밋 목록을 얻을 수 있습니다.

git log --left-right --graph --cherry-pick --oneline main...next

출력 예:

> 492508ac (HEAD -> next) feat: make bazzable
> 5ceb5a90 hotfix: off-by-one
> b4459544 feat: add bar
> b6ce3b78 (origin/add-foo, add-foo) feat: add foo

가장 중요한 단어입니다.

--cherry-pick

커밋 집합이 대칭 차이로 제한된 경우 "다른 쪽"의 다른 커밋과 동일한 변경 사항이 발생하는 커밋은 생략합니다.예를 들어, 두 개의 분기(A 및 B)가 있는 경우, 해당 옵션에 대한 설명의 위의 예와 같이 한 쪽의 모든 커밋만 나열하는 일반적인 방법은 --left-right입니다.그러나 다른 분기에서 체리로 선택된 커밋이 표시됩니다(예: "3rd on b"는 분기 A에서 체리로 선택될 수 있음).이 옵션을 사용하면 이러한 커밋 쌍이 출력에서 제외됩니다.

업데이트 댓글에 언급된 것처럼 최근 버전의 git가 추가되었습니다.--cherry-mark:

--cherry-mark

예를 들어 --commit-pick(아래 참조)과 같으나 =로 같은 커밋을 생략하지 않고 +로 같은 커밋을 사용하여 같은 커밋을 표시합니다.

git log 하위 집합을 수행해 볼 수도 있습니다.

git log --oneline devel ^next

어때.

git log next..devel

결과는 Byran의 답변(커밋 순서가 다름)과 유사하지만, 두 답변 모두 분기 간에 서로 다른 커밋을 생성합니다. 한 분기에만 있는 것이 아니라 다른 분기에는 없는 것을 보여줍니다.

릴리스 분기(다음)에 통합되지 않은 커밋 목록을 가져오려면 다음을 사용할 수 있습니다.

git rev-list --reverse --pretty="TO_TEST %h (<%ae>) %s" --cherry-pick --right-only origin/release_branch...origin/development_branch | grep "^TO_TEST " > NotIntegratedYet.txt

자세한 내용은 git-rev-list를 확인하십시오.

@마크 롱에어는 여기서 그의 대답에서 그것을 못박았습니다. 하지만 저는 몇 가지 추가적인 통찰력을 추가하고 싶습니다.

관련, 특히 feature_branch에 하나 이상의 마스터 병합으로 인해 커밋을 스퀴즈하는 것이 비현실적인 경우 대규모 풀 요청(PR)을 해체하는 방법에 대한 질문에 답변합니다.

의 상황 상황내:
나는 크게 벌었습니다.feature_branch Request 30개의 GitHub로 했습니다.master.분점master내 밑에서 1톤을 바꾸고, 200개의 커밋을 받았습니다.feature_branch없었습니다.내가 한 충돌을 해결하기 위해.git checkout feature_branch그리고.git merge master합병하기 위해master가 나의 의변가나것으로로 바뀝니다feature_branch하기로 했습니다.mergerebase충돌을 30번(각 커밋마다 한 번씩)이 아닌 한 번만 해결할 수 있도록 최신 마스터로 이동합니다.는 제 의 커밋을 30개의 커밋을 로 되돌리고 master그것은 홍보에서 GitHub 리뷰 댓글 내역을 지워버릴 수 있기 때문입니다.그래서 마스터를 기능 분기에 병합하여 한 번에 충돌을 해결했습니다.만사가 순조롭습니다.하지만 제 홍보는 동료들이 검토하기에는 너무 컸습니다.나는 그것을 나눠야 했습니다.나는 30개의 커밋을 진압하러 갔는데, 오 안돼! 그들은 어디에 있습니까?그들은 모두 함께 뒤섞여 있습니다.master의 커밋은 제가 내가합건의커최밋 200을 master의 내속로에.feature_branch어떻게 해야 하나요?

git cherry당신이 시도하고 싶은 경우의 사용.git cherry-pick개별 커밋:

git cherry구조를 위하여!

에 있는 모든 커밋을 보려면 다음과 같이 하십시오.feature_branch하지만 그렇지 않은 경우master할 수 있습니다.

git checkout feature_branch
git cherry master

I'm OUT 으로 지점할 수 .feature_branch먼저 하는 것으로git cherry [upstream_branch] [feature_branch] 것처럼이럼.다시 한 번, 이것은 어떤 커밋이 다음에 있는지 확인합니다.feature_branch 그것은 없습다니만에 있지 .upstream_branch(master 예:

git cherry master feature_branch

추가하기-v또한 커밋 메시지 제목 줄도 표시합니다.

git cherry -v master

"" "- "-줄" "-줄")에 wc -l수를 합니다.

git cherry master | wc -l

하여 이 카 GithHub PR 시 번 비 와 여 하 교 정 나 를 있 다 니 습 수 을 얻 보 은 호 더 밋 운 에 트 된 커 를 표 ▁about ▁better ▁you ▁against▁knowing 니 다 ▁shown 습 ▁number 있 ▁feel 이 ▁compare ▁in ▁your ▁count 수 ▁can ▁this ▁commit ▁g ith 운 ▁the 카 ▁to h 을 트 얻git cherry정말 효과가 있습니다.또한 Githash를 하나씩 비교하여 일치하는 것을 확인할 수 있습니다.git cherry참고. 참고에 유의하십시오.git cherry병합한 병합 커밋 수를 계산하지 않습니다.master안으로feature_branch하지만 깃허브는 그럴 것입니다. 만약, 에서 "단어를 당신은GitHub 에 나타나지 을 알 수 입니다.git cherry예: "feature_branch에 branch 'master'를 병합"이라는 제목의 커밋은 GitHub PR에 표시되지만 실행할 때는 표시되지 않습니다.git cherry master feature_branch이것은 괜찮고 예상되는 것입니다.

이제 새로운 기능 분기를 선택하여 이 차이점을 분할할 수 있는 방법을 찾을 수 있습니다.사용할 수 있습니다git cherry master feature_branch지역적으로 또는 GitHub PR의 커밋을 확인하십시오.

우리가 찌그러뜨리기만 한다면 찌그러뜨리는 것이 얼마나 도움이 될 수 있을까요?

하지만 다른 방법으로는 30개의 커밋을 모두 하나로 분할하여 새 기능 분기에 패치하고 패치 커밋을 소프트 재설정한 다음 파일별, 청크별 또는 라인별로 조각을 추가하는 방법이 있습니다.하위 기능을 하나 얻으면 큰 기능이 여러 하위 기능으로 분할될 때까지 추가한 내용을 커밋한 다음 새 분기를 체크아웃하고, 추가한 항목을 추가하고, 커밋하고, 새 분기를 체크아웃할 수 있습니다.문제는 30개의 커밋이 내 커밋으로 인해 다른 사람들의 다른 200개 커밋과 뒤섞여 있다는 것입니다. 따라서 리베이스는 비현실적입니다. 왜냐하면 제가 30개 커밋을 재주문하고 분쇄하기 위해서는 230개 커밋을 걸러내야 하기 때문입니다.

패치 파일을 훨씬 쉽게 스퀴즈할 수 있는 대체물로 사용하는 방법:

해결 방법은 30개 커밋의 "스쿼시 등가물"이 포함된 패치 파일을 가져와 새 포크에 패치하는 입니다.master 피쳐-서 다음과

git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master 
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch

이제 30개의 커밋 패치를 모두 로컬로 적용했습니다. 단, 스테이징되지 않고 커밋되지 않았습니다.

지금사를 사용합니다.git gui큰 또는 "diff", "/diff", "PR" 및 "diff"를 구분하려면:

만약 당신이 그것을 가지고 있지 않다면 참고하세요.git gui와 함께 Ubuntu에서 할 수 .sudo apt install git-gui.

나는 이제 달릴 수 있습니다.git gui에서 마우스 을 클릭하여 및 줄을 에서 설명한 커밋을 합니다.그런 다음 새 피쳐 분기를 포킹하고 모든 변경 사항이 하위 피쳐 분기에 추가되고 30 커밋 피쳐가 3개 또는 4개의 하위 피쳐로 성공적으로 분할될 때까지 이 주기를 반복합니다.이제 이러한 각 하위 기능에 대해 별도의 PR을 열 수 있으므로 팀에서 검토하기가 더 쉬울 것입니다.

참조:

  1. git 저장소에서 패치 또는 diff 파일을 생성하여 다른 git 저장소에 적용

언급URL : https://stackoverflow.com/questions/7566416/how-to-see-which-commits-in-one-branch-arent-in-the-other

반응형