merge-commit이 중간에 있는 커밋을 지우는 방법은 무엇입니까?
저는 피처 브랜치에서 일하고 있습니다.
- 여러 번 커밋했습니다.조작된 커밋.
- 변경 사항을 원격 분기에 푸시했습니다.갈등이 있습니다.
- 마스터의 변경 사항을 병합하여 피쳐 분기에서 충돌을 해결했습니다.
git fetch origin master
git merge FETCH_HEAD
- 충돌을 수동으로 해결했습니다.
git commit
git push
- 저는 한 번 더 다짐했습니다.
현재 커밋 기록은 다음과 같습니다.현재에서 이전으로:
- 커밋 3
- 커밋 Myyy(Merged)
- 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
(소스를 기반으로 한 커밋 하나만!)
나는 이것이 같은 문제를 가진 다른 사람에게 도움이 되기를 바랍니다.
- PR을 로컬로 가져옵니다.
gh pr checkout 1938
- 더하다
upstream
어디서 변화를 얻을 것인지 알 수 있습니다
git remote add upstream git@github.com:minio/console.git
fetch
부터upstream
모든 새로운 변화를 얻기 위해
git fetch upstream
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.
#
- 변경하지 마십시오.
pick
그대로 둬, 만약 당신이 선택한다면.squash
또는reword
이 특정한 경우에는, 그것은 작동하지 않을 것입니다.당신이 정말로 원하는 것은 당신의 변경사항의 기본을 바꾸고 당신의 PR에서 병합 커밋을 제거하는 것입니다. 따라서 파일을 그대로 저장하고 아래를 참조하십시오.
$ git rebase -i upstream/master
Successfully rebased and updated refs/heads/add-csr-under-tenant-details.
- 이제 다음을 수행할 수 있습니다.
git push -f
- 다음 사이에 병합되거나 실제로 재배치된 커밋이 더 이상 없습니다.
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
'programing' 카테고리의 다른 글
jquery-ui-dialog - 대화 상자 닫기 이벤트에 연결하는 방법 (0) | 2023.08.16 |
---|---|
프로그래밍 방식으로 EditText의 입력 유형을 PASSWORD에서 NORMAL로 변경하거나 그 반대로 변경 (0) | 2023.08.16 |
SYS_CONNECT_를 사용하는 경우 Oracle ORA-30004BY_PATH 함수, (0) | 2023.08.16 |
MySQL 타임스탬프 날짜 범위 선택 (0) | 2023.08.16 |
중첩 양식 그룹의 컨트롤을 각도로 가져오는 방법 (0) | 2023.08.16 |