programing

다른 분기의 모든 변경 사항을 단일 커밋으로 병합(스쿼시 포함)

closeapi 2023. 5. 26. 20:57
반응형

다른 분기의 모든 변경 사항을 단일 커밋으로 병합(스쿼시 포함)

Git에서 한 분기에서 다른 분기로 모든 변경 사항을 병합하는 동시에 단일 커밋으로 스쿼시하는 방법이 있습니까?

저는 종종 별도의 지점에서 새로운 기능을 작업하며, 주로 백업 또는 작업 중인 내용을 다른 시스템으로 전송하기 위해 정기적으로 커밋/푸시합니다.이러한 커밋은 대부분 "기능 xxx WIP" 또는 중복된 것으로 표시됩니다.

작업이 완료되고 WIP 브랜치를 마스터로 다시 병합하고 싶습니다. 중간 커밋을 모두 삭제하고 한 번만 정리하면 됩니다.

이것을 하는 쉬운 방법이 있습니까?

또는 분기된 시점부터 분기에 대한 모든 커밋을 지우는 명령어는 어떻습니까?

다른 은 또다옵은입니다.git merge --squash <feature branch>그리고 나서 마지막으로.git commit.

원본 Git 병합

--squash

--no-squash

발생한.HEAD record 기음없록$GIT_DIR/MERGE_HEAD의 원인이 되는git commit병합 커밋을 만드는 명령입니다.이렇게 하면 현재 분기 위에 다른 분기를 병합하는 것과 같은 효과(문어의 경우 그 이상)를 가진 단일 커밋을 만들 수 있습니다.

찾았어요!병합 명령에 다음이 있습니다.--squash

git checkout master
git merge --squash WIP

이 시점에서 모든 것이 병합되고 충돌할 수 있지만 커밋되지는 않습니다.이제 할 수 있습니다.

git add .
# git add -u  # might be preferable, see below
git commit -m "Merged WIP"

ㅠㅠgit rebase -i master기능 분기에 있습니다.그런 다음 하나의 '선택'을 제외한 모든 항목을 '소거'로 변경하여 커밋을 결합할 수 있습니다.기본 재배치를 사용하여 커밋 지우기 참조

마지막으로 마스터 분기에서 병합을 수행할 수 있습니다.

용사를 합니다.git merge --squash <feature branch>수락된 답변에서 알 수 있듯이 트릭은 트릭을 수행하지만 병합된 분기는 실제로 병합된 분기로 표시되지 않습니다.

따라서 훨씬 더 나은 솔루션은 다음과 같습니다.

  • 최신 마스터에서 새 분기를 만들고 기능 분기가 시작된 마스터 분기에서 커밋합니다.
  • »<feature branch>을이하 상사항에기여용을 사용하여 .git merge --squash
  • 새로 만든 분기를 마스터로 병합합니다.이렇게 하면 피쳐 분기에 커밋이 하나만 포함되고 병합은 짧고 깔끔한 그림으로 표시됩니다.

Wiki는 절차를 자세히 설명합니다.

다음 예에서 왼쪽 스크린샷은 다음과 같은 결과입니다.qgit오른쪽 스크린샷은 다음과 같은 결과입니다.

git log --graph --decorate --pretty=oneline --abbrev-commit

스크린샷 모두 동일한 저장소에 있는 동일한 범위의 커밋을 보여줍니다.그럼에도 불구하고, 오른쪽 것은 덕분에 더 컴팩트합니다.--squash.

  • 시간이 지남에 따라,master에서 가지db.
  • 때.db되었습니다, "feature"라는 새로운 .라고 하는 새 분기tag▁same▁of▁의 같은 커밋에서 되었습니다.master 그거db뿌리가 있습니다.
  • tag a git merge --squash db수행된 다음 모든 변경 사항을 스테이징하고 단일 커밋으로 커밋했습니다.
  • master,tag 병됨:git merge tag.
  • 점지search관련이 없으며 어떤 방식으로든 병합되지 않습니다.

여기에 이미지 설명 입력

2020년 업데이트됨

--squash플래그 관계가 없는 두 개의 평행한 분기처럼 보입니다.

여기에 이미지 설명 입력

날짜와 관련된 커밋 정렬은 다음과 같습니다.

여기에 이미지 설명 입력

개인적으로, 저는 --squash 옵션을 좋아하지 않습니다. 이 트릭을 시도해 보세요. 아마도 그것이 여러분의 필요에 맞을 것입니다. 저는 작은 프로젝트에 사용합니다.

  1. 잽싸게
  2. git checkout -b dev
  3. 개발 중인 여러 커밋
  4. dev에서 몇 가지 훌륭한 커밋을 수행한 후(아직 마스터에 병합되지는 않았지만) 모든 커밋을 마스터 분기에 복사하지 않으려면 마스터에서 의도적으로 무언가를 변경하고 (README 파일에 빈 행을 추가하고 마스터에서 커밋),
  5. git merge dev 충돌(README의 빈 행)을 병합하고, 이를 해결하고, 원하는 새 메시지와 커밋하면 완료됩니다.이것이 시각적으로 표현된 것입니다.

의도적으로 병합 충돌에 대한 null 커밋, 원하는 이름 지정

의도적으로 병합 충돌에 대한 null 커밋

저는 정확히 이것을 하기 위해 저만의 깃 별칭을 만들었습니다.나는 그것을 부를게요git freebase이 명령은 기존의 지저분하고 기본값을 바꿀 수 없는 피쳐 분기를 가져와 다시 작성하여 커밋이 하나의 커밋으로 압축된 후 지정한 분기(기본적으로 마스터)를 기반으로 하여 동일한 이름의 새 분기가 되도록 합니다.마지막에는 새로 "자유 기반" 지점에 대해 원하는 커밋 메시지를 사용할 수 있습니다.

.gitconfig에 다음 별칭을 넣어 설치합니다.

[alias]
  freebase = "!f() { \
    TOPIC="$(git branch | grep '\\*' | cut -d ' ' -f2)"; \
    NEWBASE="${1:-master}"; \
    PREVSHA1="$(git rev-parse HEAD)"; \
    echo "Freebaseing $TOPIC onto $NEWBASE, previous sha1 was $PREVSHA1"; \
    echo "---"; \
    git reset --hard "$NEWBASE"; \
    git merge --squash "$PREVSHA1"; \
    git commit; \
  }; f"

에서 다음을합니다.git freebase <new-base>

테스트를 몇 번밖에 안 해봤으니 먼저 읽고 실행해보시길 바랍니다.약간의 안전 조치로 시작 sha1을 인쇄하므로 잘못된 부분이 있으면 이전 지점을 복원할 수 있습니다.

https://github.com/stevecrozz/dotfiles/blob/master/ .gitconfig는 제 dotfiles repoon github에서 관리할 것입니다.

마스터 분기와 피쳐 분기가 있습니다.피쳐 분기에 커밋이 많습니다.피쳐 분기의 모든 커밋을 마스터의 커밋 기록에 표시하지 않을 수 있습니다.다음 단계를 수행합니다.

  1. 최신 마스터 코드에서 새 분기를 만들고 해당 분기에 있는 경우
git checkout -b latest_MCode
  1. 이제 기능 분기를 latest_Mcode 분기에 병합합니다.
git merge --squash feature
  1. m 매개 변수 없이 커밋 수행

git -m 없이 커밋 #

편집기는 모든 커밋 로그와 기능 분기에서 변경된 파일이 있는 팝업이어야 합니다.모든 피쳐 분기 커밋을 여기에서 볼 수 있습니다.원하는 경우 모든 내용을 삭제하고 마스터에 병합한 후 표시할 커밋 메시지를 한 줄만 작성할 수 있습니다.i를 누른 다음 메시지를 쓴 다음 Esc->:wq->Enter를 눌러 저장하고 편집기를 종료합니다. 4.새로 만든 분기를 마스터로 병합

git checkout master
git merge latest_Mcode
git push

당신은 해냈어요!원본 답변은 GithubLink에서 확인할 수 있습니다.

git merge --squash <feature branch>좋은 선택입니다."git commit"은 모든 피쳐 분기 커밋 메시지를 유지하기 위해 선택한 메시지와 함께 알려줍니다.

커밋 병합을 줄이려면 다음과 같이 하십시오.

git merge dox times --git reset HEAD^ -- 소프트한 다음 git commit.

위험 - 삭제된 파일이 다시 나타날 수 있습니다.

기본 재배치 명령을 사용하여 이 작업을 수행할 수 있습니다.분기를 "메인" 및 "기능"이라고 부릅니다.

git checkout feature
git rebase main

rebase 명령은 "기능"에 대한 모든 커밋을 부모가 "메인"인 하나의 커밋으로 재생합니다.

당신은 도망치는 것이 좋을 것입니다.git merge main전에git rebase main기능이 생성된 이후(또는 가장 최근에 병합된 이후) "메인"이 변경된 경우.그러면 병합 충돌이 발생할 경우를 대비하여 전체 기록을 유지할 수 있습니다.

기본 재배치 후에는 분기를 main으로 병합할 수 있으며, 이 경우 빠른 전달 병합이 발생합니다.

git checkout main
git merge feature

좋은 개요는 Git 개념 이해의 기본 페이지를 참조하십시오.

언급URL : https://stackoverflow.com/questions/3697178/merge-with-squash-all-changes-from-another-branch-as-a-single-commit

반응형