누군가가 가져서는 안되는 풀 요청을 수락했습니다. 이제 깨진 코드가 많이 병합되었습니다. 풀 요청을 어떻게 취소합니까? 병합 직전에 커밋의 변경 사항을 되돌리려 고했지만 커밋이 많이 병합 된 것을 알았습니다. 이제 병합하기 며칠 전부터이 사람의 커밋이 모두 이루어졌습니다. 이 작업을 어떻게 취소합니까?
누군가가 가져서는 안되는 풀 요청을 수락했습니다. 이제 깨진 코드가 많이 병합되었습니다. 풀 요청을 어떻게 취소합니까? 병합 직전에 커밋의 변경 사항을 되돌리려 고했지만 커밋이 많이 병합 된 것을 알았습니다. 이제 병합하기 며칠 전부터이 사람의 커밋이 모두 이루어졌습니다. 이 작업을 어떻게 취소합니까?
답변:
이 문제를 단계별로 세분화 할 수는 있지만이 문제에 대한 더 나은 대답 이 있습니다.
다음과 같이 최신 업스트림 변경 사항을 가져오고 체크 아웃해야합니다. 예 :
git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar
커밋 로그를 살펴보면 다음과 비슷한 것을 찾을 수 있습니다.
commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269 Merge: 9271e6e a507888 Author: Tim Tom <tim@tom.com> Date: Mon Apr 29 06:12:38 2013 -0700 Merge pull request #123 from john/foo_and_bar Add foo and bar commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e Author: John Doe <john@doe.com> Date: Mon Apr 29 12:13:29 2013 +0000 Add bar commit 470ee0f407198057d5cb1d6427bb8371eab6157e Author: John Doe <john@doe.com> Date: Mon Apr 29 10:29:10 2013 +0000 Add foo
이제 나중에 되돌릴 수있는 기능으로 전체 풀 요청을 되돌리려 고합니다. 그렇게하려면 merge commit 의 ID를 가져와야 합니다.
위의 예에서 병합 커밋 은 "Merged pull request # 123 ..." 이라는 최상위 커밋 입니다 .
이렇게하면 두 변경 사항 ( "Add bar" 및 "Add foo" )을 모두 되돌릴 수 있으며, 나중에 되돌릴 수없고 변경 히스토리를 깨끗하게 유지할 수있는 전체 풀 요청을 되돌릴 수 있습니다.
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
git checkout upstream/master -b revert/john/foo_and_bar
? 정확히 무엇을합니까?
커밋 그래프를 확인하십시오 (gitk 또는 유사한 프로그램 사용). 풀 요청에서 커밋을 볼 수 있으며 자신의 커밋과 병합 커밋 (앞으로 빨리 병합되지 않은 경우)이 표시됩니다. 병합하기 전에 마지막 커밋을 찾아 분기를이 커밋으로 다시 설정하면됩니다.
분기의 참조 로그가 있으면 병합 전에 커밋을 찾는 것이 훨씬 쉬워집니다.
(의견에서 더 많은 정보를 얻은 후 편집 :)
마지막 (가장 오른쪽) 커밋은 pull request에 의한 잘못된 병합 이라고 가정 했는데 여기에 표시된 파란색 선이 병합되었습니다. 마지막으로 성공한 커밋은 검은 색 선의 앞에있는 것입니다.
이 커밋으로 재설정하면 괜찮을 것입니다.
즉, 로컬 작업 복사본 에서이 작업을 수행하십시오 (예 : git stash와 같은 커밋되지 않은 항목이 없는지 확인한 후).
git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk
이제 내가 표시 한 커밋에 실제로 있는지 확인하면 조상에서 가져온 항목이 표시되지 않습니다.
git push -f origin master
(github remote origin
의 이름 이 지정된 경우 -그렇지 않으면 이름을 변경하십시오).
이제 모든 것이 github에서도 올바르게 보입니다. 커밋은 여전히 저장소에 있지만 지점에서 도달 할 수 없으므로 해를 끼치 지 않아야합니다. (물론 그들은 여전히 RogerPaladin의 저장소에있을 것입니다.)
(Github 고유의 웹 전용 방식으로 동일한 작업을 수행 할 수 있지만 Github 및 풀 요청 관리 시스템에 익숙하지 않습니다.)
참고 다른 사람이 이미 잘못 사용하여 마스터가 커밋 뽑아 수도 경우, 그들은 당신이 현재 가지고있는 다음 같은 문제가, 정말 다시 기여할 수 없다. 새 마스터 버전으로 재설정하기 전에
이런 일이 발생했거나 단순히 문제를 피하려면, git revert
대신 명령을 사용 git reset
하여 이전 커밋으로 다시 설정하지 않고 새 커밋으로 변경 사항을 되 돌리십시오. (일부 사람들은 게시 된 지점으로 재설정하지 않아야한다고 생각합니다.)이 방법에 대한이 질문에 대한 다른 답변을 참조하십시오.
미래를 위해 :
RogerPaladin 지점의 커밋 중 일부만 원한다면 cherry-pick
대신 대신 사용하십시오 merge
. 또는 RogerPaladin과 통신하여 별도의 지점으로 이동하여 새 당김 요청을 보내십시오.
풀이 그가 한 마지막 일이라면
git reset --hard HEAD~1
git reset --hard HEAD~1
데 사용 git push origin -f
했습니다. 그러나이 작업을 수행하기 전에주의하십시오.
2014 년 6 월 24 일부터 다음을 사용하여 PR을 쉽게 취소 할 수 있습니다 ( " 풀 요청 되돌리기 "참조 ).
되돌리기를 클릭하면 GitHub에서 풀 요청을 쉽게 되돌릴 수 있습니다.
되 돌린 변경 사항으로 새 풀 요청을 작성하라는 메시지가 표시됩니다.
그 되돌리기가 사용되는지 아닌지에 대한 테스트는 남아 있습니다 -m
(병합을 되돌리기 위해)
그러나 Adil H Raza 는 다음과 같이 의견을 추가합니다 (2019 년 12 월).
이것이 예상되는 동작이며 새 분기를 만들었으며이 새 분기에서에 대한 PR을 만들 수 있습니다
master
.
이렇게하면 나중에 필요한 경우 되돌리기를 되돌릴 수 있습니다master
. 가장 안전한 옵션이며 직접을 변경하지 않아도됩니다 .
복귀 후 Git 지점에서 추가 변경을 수행하고 동일한 소스 / 대상 지점에서 새 PR을 작성했다고 가정 해 봅시다.
PR에는 새로운 변경 사항 만 표시되지만 되돌리기 전에는 아무것도 없었습니다 .
Korayem은 " Github : 되돌리기 후 변경 사항 무시 ( git cherry-pick
, git rebase
) "를 참조합니다.
삭제하고 싶지 않은 커밋으로 github pull 요청을 취소하려면 다음을 실행해야합니다.
git reset --hard --merge <commit hash>
풀 요청을 병합하기 전에 커밋 해시가 커밋 우선입니다. 그러면 히스토리 내에서 커밋에 영향을주지 않고 풀 요청에서 모든 커밋이 제거됩니다.
이것을 찾는 좋은 방법은 지금 닫힌 끌어 오기 요청으로 이동하여이 필드를 찾는 것입니다.
을 실행 한 후 다음을 실행하십시오 git reset
.
git push origin --force <branch name>
이것은 풀 요청으로부터의 커밋 사이의 커밋 히스토리에 영향을 미치는 분기의 커밋에 영향을 미치지 않고 풀 요청 전에 브랜치를 되돌려 야합니다.
편집하다:
풀 요청에서 되돌리기 버튼을 클릭하면 분기에 추가 커밋이 생성됩니다. 커밋 해제 또는 병합 해제하지 않습니다. 즉, 되돌리기 버튼을 누르면이 풀 코드를 모두 다시 추가하기 위해 새 풀 요청을 열 수 없습니다.