Git에서 되돌린 병합 다시 수행
여기서 약간의 문제가 발생했습니다.된 지점을 있었습니다.28s
Git서, 내일반로병합한으적가에▁in▁g,▁the▁in▁general병합한.develop
ㅠㅠ. 한 것 했습니다.제가 너무 빨리 한 것으로 드러났기 때문에, 저는 병합을 취소하기 위해 git-revert를 사용했습니다.▁has.28s
안으로develop
그러나 git-merge 명령은 원래 병합을 보고 모든 것이 정상이며 분기가 이미 병합되었음을 기쁘게 알립니다.이제 어떻게 해야 합니까? "develop" '을 .반환 "28s -> develop" 커밋을생성습까니겠시하?까?좋은 방법인 것 같지는 않지만, 현재로서는 다른 방법을 상상할 수 없습니다.
트리 구조의 모양:
"반전"을 해야 합니다.원래의 모습이 어떻게 되돌아갔느냐에 따라 말처럼 쉽지 않을 수도 있습니다.이 주제에 대한 공식 문서를 보세요.
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
허용 범위:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
하지만 모든 것이 효과가 있을까요?물론 그렇습니다.병합을 되돌릴 수 있으며, 순수하게 기술적인 관점에서 Git은 매우 자연스럽게 수행했으며 실제 문제가 없었습니다.
단지 "합병 전 상태"에서 "합병 후 상태"로 변경된 것으로 간주했을 뿐입니다.
복잡하거나, 이상하거나, 정말 위험한 것은 없습니다.Git은 그것에 대해 생각하지도 않고 그것을 할 것입니다.따라서 기술적 관점에서 병합을 되돌리는 것은 문제가 없지만 워크플로우 관점에서는 일반적으로 피해야 합니다.
예를 들어, 기본 트리에 병합된 문제를 발견한 경우 병합을 되돌리는 대신 가능한 한 다음 작업을 수행합니다.
- 문제를 병합한 분기로 양분하여 해결하십시오.
- 또는 원인이 된 개별 커밋을 되돌리려고 시도합니다.
네, 더 복잡합니다. 아니요, 항상 작동하는 것은 아닙니다. 때때로 대답은 "아이고, 아직 준비되지 않았기 때문에 병합하지 말았어야 했습니다. 그리고 모든 병합을 취소해야 합니다."입니다.그런 다음 병합을 되돌려야 하지만 병합을 다시 수행하려면 다시 되돌려야 합니다.
그런 경력이 있다고 가정해 보겠습니다.
---o---o---o---M---W---x-------x-------*
/
---A---B
여기서 A, B는 커밋에 실패하고 W는 M을 되돌립니다.
그래서 문제를 해결하기 전에 지점에 W를 체리 픽으로 커밋합니다.
git cherry-pick -x W
그런 다음 분기에서 W 커밋을 되돌립니다.
git revert W
내가 계속 고칠 수 있게 된 후에.
최종 기록은 다음과 같습니다.
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
PR을 보내면 PR이 되돌리기를 취소하고 몇 가지 새로운 커밋을 추가한다는 것이 명확하게 표시됩니다.
워크플로우를 너무 망치지 않고 되돌리려면:
- 개발의 로컬 휴지통 복사본 만들기
- 개발의 로컬 복사본에서 되돌리기 커밋 되돌리기
- 해당 복사본을 피쳐 분기에 병합하고 피쳐 분기를 Git 서버에 푸시합니다.
이제 기능 분기를 정상적으로 병합할 수 있습니다.여기서 유일한 단점은 기록에 몇 가지 추가 병합/반환 커밋이 있다는 것입니다.
GIT에서 되돌리기:
git revert <commit-hash-of-previous-revert>
사하는대를 사용하는 에.git-revert
당신은 이 명령을 사용할 수 있었습니다.devel
잘못된 병합 커밋을 버리는(그냥 되돌리는 것이 아니라) 분기입니다.
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
작업 디렉토리의 내용도 그에 따라 조정됩니다.주의:
- 변경 사항도 다음에 의해 지워지므로 변경 사항을 개발 분기에 저장합니다(잘못된 병합 이후).
git-reset
한 에 모든 커밋을 합니다.git reset
논쟁은 사라질 것입니다! - 또한 재설정하면 기록이 다시 작성되므로 다른 리포지토리에서 변경 내용을 이미 가져온 경우에는 이 작업을 수행하지 마십시오.
는 나는공는것추다니합천을하부▁the다를 공부하는 것을 추천합니다.git-reset
이것을 시도하기 전에 조심스럽게 man-page.
에는 이재설후변내다수있적다니습용할시용을경제정에서 변경한 할 수 .devel
그리고 나서 하라.
git checkout devel
git merge 28s
이 작업은 에서 실제 병합됩니다.28s
안으로devel
(이제 깃의 기록에서 지워진) 초기 것처럼.
SHA1과 같이 다음 단계를 수행하여 복구를 되돌릴 것을 제안합니다.
git checkout develop #go to develop branch
git pull #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote
지점 PR을 합니다.users/yourname/revertOfSHA1
- 원래 병합 전 커밋 시 새 분기 생성 - '개발 기반'이라고 부릅니다.
- 'develop-base' 위에 'develop'의 대화형 리베이스를 수행합니다(이미 상위에 있음에도 불구하고).대화형 기본 재배치 중에 병합 커밋과 병합을 되돌린 커밋을 모두 제거할 수 있습니다. 즉, git 내역에서 두 이벤트를 모두 제거할 수 있습니다.
이 시점에서 정기적으로 기능 브라흐를 병합할 수 있는 깨끗한 '개발' 분기가 생성됩니다.
저는 같은 문제에 직면했을 때 이 게시물을 발견했습니다.위의 방법은 하드 리셋 등을 하는 것이 무섭다는 것을 알게 되었습니다.원하지 않는 항목을 삭제하고 다시 가져올 수 없습니다.
대신 지점이 다시 이전하기를 원하는 커밋을 확인했습니다. git checkout 123466t7632723
그런 다음 분기로 변환됩니다.git checkout my-new-branch
그런 다음 더 이상 원하지 않는 지점을 삭제했습니다.물론 이것은 당신이 망친 나뭇가지를 버릴 수 있는 경우에만 효과가 있을 것입니다.
필요한 경우 새 분기를 만들고 되돌린 풀 요청에서 커밋(커밋 SH를 공백으로 구분하여 하나의 명령이 되도록 함)을 선택하면 파일/변경 사항을 잃지 않고 다시 병합할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1078146/re-doing-a-reverted-merge-in-git
'programing' 카테고리의 다른 글
데이터 주석이 있는 DateTime 형식을 할당하시겠습니까? (0) | 2023.05.24 |
---|---|
Angular에서 컨트롤이 생성된 후 FormControl에 Validator를 추가하는 방법은 무엇입니까? (0) | 2023.05.24 |
Postgres/Postgre의 디스크 크기를 어떻게 찾습니까?SQL 테이블 및 해당 인덱스 (0) | 2023.05.24 |
Xcode 12.3 iOS 14.3 시뮬레이터 옐로우 독 / 옐로우 반투명 이슈 (0) | 2023.05.24 |
Excel: SQL 쿼리에 대한 매개 변수로 셀 값 사용 (0) | 2023.05.24 |