etc./StackOverFlow

여러 커밋을 다른 분기에 단일 스쿼시 커밋으로 병합하려면 어떻게 해야 합니까?

청렴결백한 만능 재주꾼 2022. 3. 7. 11:53
반응형

질문자 :SunnyShah


원격 Git 서버가 있습니다. 수행하려는 시나리오는 다음과 같습니다.

  • 각 버그/기능에 대해 다른 Git 분기를 만듭니다.

  • 비공식 Git 메시지와 함께 해당 Git 분기에서 내 코드를 계속 커밋합니다.

  • 최상위 저장소에서 공식 Git 메시지와 함께 하나의 버그에 대해 하나의 커밋을 수행해야 합니다.

그렇다면 모든 체크인에 대해 하나의 커밋만 가져오도록 내 브랜치를 원격 브랜치에 병합하려면 어떻게 해야 할까요?



버그 수정 분기를 bugfix master 에 병합하려고 한다고 가정해 보겠습니다.

 git checkout master git merge --squash bugfix git commit

bugfix 브랜치에서 모든 커밋을 가져와 하나의 커밋으로 master 브랜치와 병합합니다.


설명 :

 git checkout master

master 브랜치로 전환합니다.

 git merge --squash bugfix

bugfix 브랜치에서 모든 커밋을 가져와 현재 브랜치와 1 커밋으로 그룹화합니다.
(병합 커밋이 나타나지 않음, 커밋을 수행하기 전에 수동으로 충돌을 해결할 수 있음)

 git commit

병합된 변경 사항에서 단일 커밋을 만듭니다.

-m 매개변수를 생략하면 커밋을 완료하기 전에 스쿼시된 커밋의 모든 메시지가 포함된 초안 커밋 메시지를 수정할 수 있습니다.


abyx

마침내 나를 위해 이것을 정리한 것은 다음을 보여주는 주석이었습니다.

 git checkout main git merge --squash feature

다음을 수행하는 것과 동일합니다.

 git checkout feature git diff main > feature.patch git checkout main patch -p1 < feature.patch git add .

기능 브랜치를 105(!!) 커밋으로 병합하고 모두 하나로 묶고 싶을 때 중간 커밋에 대한 병합 충돌을 별도로 해결해야 하기 때문에 git rebase -i origin/master (또는 적어도 git이 스스로 알아낼 수 없는 것들). git merge --squash 사용하면 전체 기능 분기를 병합하기 위한 단일 커밋의 원하는 결과를 얻을 수 있습니다. 그리고 수동 충돌 해결은 최대 한 번만 수행하면 됩니다.


Dan Kohn

스쿼시 옵션과 병합하고 싶습니다. 한 번에 한 분기씩 수행하려는 경우입니다.

 git merge --squash feature1

단일 커밋으로 동시에 모든 분기를 병합하려면 먼저 대화식으로 리베이스하고 각 기능을 스쿼시한 다음 문어를 병합합니다.

 git checkout feature1 git rebase -i master

하나의 커밋으로 스쿼시한 다음 다른 기능에 대해 반복합니다.

 git checkout master git merge feature1 feature2 feature3 ...

마지막 병합은 한 번에 많은 가지를 병합하기 때문에 "문어 병합"입니다.

도움이 되었기를 바랍니다


Adam Dymitruk

maingit merge bugfix 가 있는 경우 다음을 사용하여 병합 커밋을 하나로 스쿼시할 수 있습니다.

 git reset --soft HEAD^1 git commit

qwertzguy

사용자 지정 커밋을 사용하여 newFeature 분기를 master 병합합니다.

 git merge --squash newFeature && git commit -m 'Your custom commit message';

대신에, 당신은

git merge --squash newFeature && git commit

newFeature 분기 커밋을 포함하는 커밋 메시지를 받게 됩니다.

여기에서 자세히 설명합니다: https://youtu.be/FQNAIacelT4


Vagelis Prokopiou

이 질문이 특별히 Github에 관한 것이 아니라는 것을 알고 있지만 Github이 너무 널리 사용되며 이것이 제가 찾던 답변이기 때문에 여기에 공유하겠습니다.

Github에는 저장소에 대해 활성화된 병합 옵션에 따라 스쿼시 병합을 수행할 수 있는 기능이 있습니다.

스쿼시 병합이 활성화된 경우 "병합" 버튼 아래의 드롭다운에 "스쿼시 및 병합" 옵션이 나타나야 합니다.

"스쿼시 및 병합" Github 기능의 스크린샷


Aaron

여러 커밋으로 feature/task1에서 작업했다고 가정합니다.

  1. 프로젝트 분기(project/my_project)로 이동합니다.

     git checkout project/my_project
  2. 새 분기 만들기(feature/task1_bugfix)

     git checkout -b feature/task1_bugfix
  3. --squash 옵션으로 병합

     git merge --squash feature/task1
  4. 단일 커밋 만들기

     git commit -am "add single comments"
  5. 당신의 지점을 밀어

     git push --set-upstream origin feature/task1_bugfix

Farid Haq

푸시하기 전에 로컬 브랜치를 스쿼시하려면:

  1. 아직 체크 아웃되지 않은 경우 작업할 해당 분기를 체크아웃하십시오.

  2. 유지하려는 가장 오래된 커밋의 샤를 찾으십시오.

  3. 해당 커밋에서 새 분기(tmp1)를 생성/체크아웃합니다.

    git checkout -b tmp1 <sha1-of-commit>

  4. 원래 가지를 스쿼싱하는 새 가지에 병합합니다.

    git merge --squash <original branch>

  5. 요약 커밋 메시지와 함께 병합에 의해 생성된 변경 사항을 커밋합니다.

    git commit -m <msg>

  6. 스쿼시하려는 원래 가지를 확인하십시오.

    git checkout <branch>

  7. 유지하려는 원래 커밋 샤로 재설정합니다.

    git reset --soft <sha1>

  8. 새 tmp1 분기를 기반으로 이 분기를 리베이스합니다.

    git rebase tmp1

  9. 그게 다야 - 이제 모든 것이 정상이라고 확신하면 임시 tmp1 분기를 삭제하십시오.


Jool

힘내의 경우

새 기능 만들기

터미널/쉘을 통해:

 git checkout origin/feature/<featurename> git merge --squash origin/feature/<featurename>

커밋하지 않고 먼저 검토할 수 있습니다.

그런 다음 이 새 분기에서 기능을 커밋하고 완료하고 이전 분기(개발한 것)를 삭제/무시합니다.


Demian Berisford-Maynard

git checkout YOUR_RELEASE_BRANCH git pull git checkout -b A_NEW_BRANCH git merge --squash YOUR_BRANCH_WITH_MULTIPLE_COMMITS git commit -am "squashing all commits into one" git push --set-upstream origin A_NEW_BRANCH

izy

오류가 발생하는 경우: 병합되지 않은 파일이 있으므로 커밋할 수 없습니다.

 git checkout master git merge --squash bugfix git add . git commit -m "Message"

모든 충돌 파일을 수정했습니다.

 git add .

당신은 또한 사용할 수 있습니다

 git add [filename]

ResUta

기능 브랜치가 완료되었으며 단 한 번의 커밋으로 마스터, 개발 또는 기타 대상 브랜치에 커밋할 준비가 되었습니다.

  • 병합 브랜치로 이동 : git checkout master && git pull
  • 깨끗한 로컬 마스터에서 작업 분기를 만듭니다. git checkout -b work
  • 작업에서 기능 분기를 스쿼시 병합: git merge --squash your_feature_branch.
  • 기본 또는 새 메시지로 커밋: git commit (특정 또는 기본 메시지 사용)
  • 기능 분기로 돌아가기: git checkout your_feature_branch
  • 기능 분기를 작업 디렉토리로 지정하십시오. git reset --hard work
  • 확인했지만 푸시할 준비가 되었습니다. git push -f
  • 그런 다음 필요한 경우 작업 분기를 정리하십시오.

마스터를 대상 브랜치로 교체: 개발 등

  • 마스터에서 기능 브랜치로 커밋하는 횟수를 지정할 필요가 없습니다. 힘내요*

Breton F.

여러 커밋을 수행한 분기의 이름이 bugfix/123이고 이러한 커밋을 스쿼시하려고 한다고 가정합니다.
먼저, 개발(또는 저장소 이름이 무엇이든)에서 새 분기를 만듭니다. 새 분기의 이름이 bugfix/123_up이라고 가정합니다. git bash에서 이 분기를 확인하십시오.

  • 자식 가져오기
  • 자식 체크아웃 bugfix/123_up
  • 자식 병합 bugfix/123 --squash
  • git commit -m "당신의 메시지"
  • 자식 푸시 오리진 bugfix/123_up

이제 이 분기에는 모든 변경 사항이 포함된 커밋이 하나만 있습니다.


Pavan kumar D

이 프로세스를 더 쉽게 만들기 위해 내가 만든 도구를 사용할 수 있습니다: git-squash . 예를 들어 마스터 분기에서 분기된 기능 분기에 대한 모든 커밋을 스쿼시하려면 다음을 작성하세요.

 git squash master git push --force

sheerun

사용하다

 git status

무슨 일이 일어나고 있는지 확인하기 위해.

그 다음에

 git checkout master git merge --squash bugfix git add (add which files you want or use wildcard command like ".")

그 다음에

 git commit -m "message"

그리고 이제 마지막이지만 가장 중요한 것은

 git push -u origin master

여기서 origin 은 원하는 다른 리모컨이 될 수 있습니다.


Let's L.C.E

출처 : http:www.stackoverflow.com/questions/5308816/how-can-i-merge-multiple-commits-onto-another-branch-as-a-single-squashed-commit

반응형