pull 요청에서 커밋을 제거하는 방법


105

풀 리퀘스트를했지만 그 후 로컬에서 풀 리퀘스트를 오염시킨 프로젝트에 약간의 커밋을 한 후 제거하려고했지만 운이 없었습니다.

StackOverflow에서 비슷한 질문을 찾았지만 거기에있는 내용을 적용 할 수 없습니다. GitHub에 대한 첫 번째 pull 요청이므로이 모든 것이 어떻게 작동하는지 이상합니다.

강조 표시된 커밋은 다른 모든 항목을 유지하고 제거해야하는 커밋입니다. 병합 작업을하기 때문에 역사상 네 번째 커밋이됩니다.

여기에 이미지 설명 입력

내 자식 로그 여기에 이미지 설명 입력

누군가가 무슨 일이 일어나고 있으며이 문제를 해결하는 방법을 설명해 주시겠습니까?


2
당신은 필요 REBASE , 단지 "선택"은 "GitHub의에서 추가"(다른 모든 커밋의 라인에서 즉 코멘트를) 커밋
로비 에버 릴

1
어떤 분기에 어떤 분기를 rebase 할 수 있습니까 더 많은 설명을 추가하십시오.
humazed 2010 년

what branch= 작업중인 지점 onto what branch= 당신이있는 거 풀에 요청하는 지점
로비 에버 릴

@Robbie Averill이 내 대답에서 암시 한 내용을 설명했습니다. 지금까지 아무도 이것을 설명하는 답을 쓰지 않았다는 것이 이상합니다.
ferit

답변:


108

이를 수행하는 몇 가지 기술이 있습니다.

이 게시물-되돌리기에 대한 부분을 읽으면 우리가 원하는 작업과 수행 방법에 대해 자세히 설명합니다.

문제에 대한 가장 간단한 해결책은 다음과 같습니다.

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

revert 명령은 원래 커밋 의 실행 취소 로 새 커밋을 만듭니다 .


2
다른 사람에게서 프로젝트를 포크하고 풀 리퀘스트에서 일부 댓글을 제거하고 싶은 경우에도 작동합니까?
Dr.jacky

107

사람들은 잘못된 커밋의 변경 사항을 취소하기 위해 잘못된 커밋 및 되돌리기 커밋을보고 싶어하지 않습니다. 이것은 커밋 기록을 오염시킵니다.

다음은 커밋 되돌리기로 변경 사항을 취소하는 대신 잘못된 커밋을 제거하는 간단한 방법입니다.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n// 여기서는 n대화 형 리베이스에 포함하려는 마지막 커밋의 수입니다.

  3. 교체 pickdrop당신은 폐기하려는 커밋합니다.
  4. 저장하고 종료.
  5. git push --force

8
이것은 나를 위해 매력처럼 작동했습니다. 나는 PR에 있으면 안되는 커밋을 많이 가지고있었습니다. 난 그냥 대화는, 그것을으로 업데이트하는 커밋을 떨어 뜨 다시 밀어
FullStackEngineer

1
어쨌든 홍보를 시작하기 전에 원격 마스터와 동기화해야합니다.
ferit

5
밀어 붙이려면 다음을 수행해야 git push origin HEAD:myBranch --force했습니다.. 그러나 그렇지 않으면 위대하고 도움이됩니다.
ScottyBlades

@ScottyBlades 범위를 벗어 났기 때문에 의도적으로 해당 부분을 생략했습니다. 추적 분기를 설정하지 않은 경우이를 설정하거나 사용자가 한 것처럼 명시 적으로 푸시해야합니다.
ferit

4
당신은 GitHub의에서 열린 PR을 수정하려는 경우에도 유용합니다, 당신은 단지 강제 푸시 할 수 있어야합니다
블라디미르 히달고

6

커밋을 제거하고 변경 사항을 유지하고 싶지 않은 경우 @ferit에 좋은 솔루션이 있습니다.

해당 커밋을 현재 브랜치에 추가하고 싶지만 현재 홍보의 일부가되는 것이 의미가없는 경우 대신 다음을 수행 할 수 있습니다.

  1. 사용하다 git rebase -i HEAD~n
  2. 제거하려는 커밋을 맨 아래 (가장 최근) 위치로 바꿉니다.
  3. 저장하고 종료
  4. 사용 git reset HEAD^ --soft변경 사항을 uncommit하고이 상태를 무대에 다시 얻을.
  5. git push --force제거 된 커밋없이 원격 분기를 업데이트하는 데 사용 합니다.

이제 리모컨에서 커밋을 제거했지만 변경 사항은 로컬로 유지됩니다.


2

따라서 다음을 수행하십시오.

브랜치 이름이 my_branch이고 추가 커밋이 있다고 가정 해 보겠습니다.

  1. git checkout -b my_branch_with_extra_commits (이 브랜치를 다른 이름으로 저장)
  2. gitk (git 콘솔을 엽니 다)
  3. 유지하려는 커밋을 찾으십시오. 해당 커밋의 SHA를 메모장에 복사합니다.
  4. git checkout my_branch
  5. gitk (이렇게하면 git 콘솔이 열립니다.)
  6. 되돌리려는 커밋 (변경 전 상태)을 마우스 오른쪽 버튼으로 클릭하고 " reset branch to here"를 클릭합니다 .
  7. git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

이제 로컬 브랜치 커밋 기록을보고 모든 것이 잘 보이는지 확인하십시오.


0

이것이 나를 도왔습니다.

  1. 기존 분기로 새 분기를 만듭니다. 기존의 branch_old것과 새로운 것을 branch_new.

  2. branch_new문제가 전혀 없었을 때 안정적인 상태로 재설정 하십시오. 예를 들어, 로컬 마스터 레벨에 배치하려면 다음을 수행하십시오.

    git reset —hard master git push —force origin

  3. cherry-pick의 커밋 branch_oldbranch_new

  4. git push
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.