programing

merge-commit이 중간에 있는 커밋을 지우는 방법은 무엇입니까?

powerit 2023. 8. 16. 22:41
반응형

merge-commit이 중간에 있는 커밋을 지우는 방법은 무엇입니까?

저는 피처 브랜치에서 일하고 있습니다.

  1. 여러 번 커밋했습니다.조작된 커밋.
  2. 변경 사항을 원격 분기에 푸시했습니다.갈등이 있습니다.
  3. 마스터의 변경 사항을 병합하여 피쳐 분기에서 충돌을 해결했습니다.
    • git fetch origin master
    • git merge FETCH_HEAD
    • 충돌을 수동으로 해결했습니다.
    • git commit
    • git push
  4. 저는 한 번 더 다짐했습니다.

현재 커밋 기록은 다음과 같습니다.현재에서 이전으로:

  1. 커밋 3
  2. 커밋 Myyy(Merged)
  3. 2를 범함

기능 분기를 마스터에 병합하기 전에 3개 이상의 커밋을 1개로 압축하려면 어떻게 해야 합니까?

를 피쳐분호출가고정다니합다라고 가정합니다.feature 본점 그리고주지점요지점▁and▁main.main:

에서 임시 main:

git checkout -b temp main

스퀴시feature 지점:

git merge --squash feature

변경 내용을 커밋합니다(커밋 메시지에 모든 스퀴즈된 커밋 메시지가 포함됨).

git commit

다음으로 이동합니다.feature가지를 치고 그것을 가리킵니다.temp분기:

git checkout feature
git reset --hard temp

임시 분기를 삭제합니다.

git branch -d temp

넌 할 수 있다.rebase -i로시여하로 commit 2 의부즉에 , 약속모master당신이 갈라놓은 것.병합 커밋에 도달하면 충돌을 다시 해결해야 할 수 있습니다.

그래서 만약 당신의 이력이

  * D commit 3 (HEAD)
  * M merge
 /|
| * C commit 2
* | B commit on master
|/
* A (master)

시작:git rebase -i A두 가지 커밋을 모두 포함한 커밋 목록이 표시됩니다.master그리고.your_branch하지만 병합 커밋은 아닙니다.pick 번째것 (첫째번것 ▁(것째번▁the첫B또는C) 및 타밍에및라) squash

이 작업을 위해 특별히 만든 도구를 사용할 수 있습니다.

https://github.com/sheerun/git-squash

마스터 분기를 병합한 다음 squashing 명령만 실행하면 됩니다.

git merge master
git squash master

충돌을 다시 해결하지 않는 유일한 방법은 다음과 같습니다.

분기 기본 및 분기 작업이 지정된 경우 다음 단계를 수행합니다.

git checkout -b work-squashed `git merge-base main work`

작업 분기에 병합한 마지막 기본 커밋에서 새 분기를 만듭니다.

git diff work-squashed...work | patch -p1

이렇게 하면 작업에 병합된 마지막 커밋 메인과 작업 분기 팁 사이의 모든 변경 사항이 작업 디렉터리에 적용됩니다.다시 말해, 해결된 갈등을 포함한 모든 작업이 충돌합니다.

이 시점에서 패치가 git이 아니기 때문에 작업 분기에 추가/제거된 파일을 처리해야 합니다.Git에 의해 추적되는 파일이 무엇인지 알 수 없습니다.따라서 모든 파일이 처리될 때까지 add/gitm을 지정해야 합니다.그런 다음 변경 사항을 단일 커밋으로 커밋하기만 하면 됩니다.

저의 경우 여러 개의 커밋이 있는 분기와 함께 작업을 시작한 다음 주/소스 분기와 병합한 다음 더 많은 커밋을 수행하여 모든 커밋을 중지하고 싶었지만 병합 커밋 때문에 계속 오류가 발생했습니다.

오류: 커밋이 병합되었지만 no -m 옵션이 제공되었습니다.

->C1->C2->M(소스 브랜치와 병합)->C3->C4

아마도 더 나은 방법이 있을 것입니다(그리고 저는 배우기를 기대합니다). 하지만 많은 읽기와 시행착오 끝에 결국 제가 하게 된 것은 참조를 위한 복사 분기를 만든 다음 현재 분기를 C1로 되돌리는 것이었습니다.

reset --hard(C1 해시)

체리를 따다가 C2, C3, C4를 따다가 찌그러뜨리고 다시 베이스를...결과:

M->C

(소스를 기반으로 한 커밋 하나만!)

나는 이것이 같은 문제를 가진 다른 사람에게 도움이 되기를 바랍니다.

enter image description here

  1. PR을 로컬로 가져옵니다.
gh pr checkout 1938
  1. 더하다upstream어디서 변화를 얻을 것인지 알 수 있습니다
git remote add upstream git@github.com:minio/console.git
  1. fetch부터upstream모든 새로운 변화를 얻기 위해
git fetch upstream
  1. rebase특별한 방법으로, 보세요:
git rebase -i upstream/master

보게 될 것입니다

pick 18eea859 add csr under tenant details

# Rebase 3bfdbb5e..01964c30 onto 3bfdbb5e (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified); use -c <commit> to reword the commit message
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
  1. 변경하지 마십시오.pick그대로 둬, 만약 당신이 선택한다면.squash또는reword이 특정한 경우에는, 그것은 작동하지 않을 것입니다.당신이 정말로 원하는 것은 당신의 변경사항의 기본을 바꾸고 당신의 PR에서 병합 커밋을 제거하는 것입니다. 따라서 파일을 그대로 저장하고 아래를 참조하십시오.
$ git rebase -i upstream/master
Successfully rebased and updated refs/heads/add-csr-under-tenant-details.
  1. 이제 다음을 수행할 수 있습니다.
git push -f
  1. 다음 사이에 병합되거나 실제로 재배치된 커밋이 더 이상 없습니다.

enter image description here

Github UI를 사용하여 코드 변경을 커밋한 다음 로컬 복제본을 업데이트하지 않고 로컬에서 변경을 커밋한 다음 로컬 커밋을 오리진으로 푸시하려고 할 때 이 문제가 발생했습니다.결과적으로 병합 커밋이 생성되었습니다.

master
       \ 
         remote-branch --- commit #1 ---------------MergeCommit
                                                    ^
             |                                      |    
           local-branch -------------- commit #2 --- 

동일한 오리진 분기에서 새 분기를 체크아웃하고 병합-커밋을 제외한 모든 커밋을 선택한 다음 분기를 푸시합니다.

master
       \ 
         new-branch --------------------------------------- Squash-commits
                                   ^                     ^
             |                     |   < Cherry-pick >   |                      
         previous-branch -----commit #1 --------- commit #2 

우리가 분기하는 원점-분기는 동일하다는 것을 참조하십시오.master.

체리 따기 과정은 IntelliJ 사용자들에게 간단합니다.결과적으로 새 분기에는 병합 커밋이 없습니다.

언급URL : https://stackoverflow.com/questions/30136558/how-to-squash-commits-which-have-merge-commit-in-between

반응형