github 저장소를 특정 커밋으로 롤백하는 방법은 무엇입니까?


431

내 github에 100 개의 커밋이 있습니다. 80을 커밋하려면 리포지토리를 롤백하고 이후의 모든 것을 제거해야합니다.

왜? 이 리포지는 기타 사용자로부터 병합하기위한 것입니다. 과도한 편집으로 인해 많은 병합이 저에게서 커밋되었습니다. 3 명의 개발자가 서로 레이블이 지정된 원격 지점의 레이블이 잘못 되었기 때문입니다. 그 지점으로 다시 설정 한 다음 앞으로 당깁니다.

이 예제에서와 같이 리베이스하고 싶었습니다 . GitHub에서 커밋을 어떻게 제거합니까?

그러나 git은 많은 갈등 관리를 원합니다. 더 간단한 방법이 있습니까?

답변:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

참고 : 아래 의견에 언급 된 것처럼, 공동 작업 환경에서는이를 사용하는 것이 위험합니다. 기록을 다시 작성하는 중입니다.


43
사람들은 git push -f origin branch. 나는 그것을 놓 쳤기 때문에 나쁜 시간을 보냈습니다.
Sumit M Asok

21
이것에주의하십시오! 당신은 모든 커밋을 로컬에서 잃을 것이고, 당신이 밀면 돌아갈 길은 없습니다.
Thomas

8
사실이 아닙니다, git reflog를 사용하여 오래된 커밋을 얻을 수 있습니다
Jan Schaefer

27
git push origin HEAD --force대신 오류가 발생 git push -f origin branch했기 때문에 대신 해야 할 수도 있습니다error: src refspec branch does not match any.
sprocket12

1
그래, 고마워 나는 내가 원하는 것을 할 수 있었다. 롤백하려는 커밋보다 먼저 별도의 브랜치를 만들었습니다. 로컬로 복제했습니다. 그런 다음 그 사본에 대한 귀하의 권장 사항을 적용했습니다. 이런 식으로, 나는 나의 주요 지점을 타협하지 않았습니다 ...
Gauthier Boaglio

21

가장 최근의 커밋을 취소하려면 다음을 수행하십시오.

먼저:

git log

최신 SHA ID를 가져와 실행 취소합니다.

git revert SHA

커밋과 정반대의 새로운 커밋이 만들어집니다. 그런 다음이 새로운 커밋을 푸시하여 앱을 이전 상태로 가져올 수 있으며 git history에 이러한 변경 사항이 표시됩니다.

이것은 방금 커밋 한 것을 즉시 다시 실행하는 데 유용하며, 더 자주 발견됩니다.

Mike가 언급했듯이 다음을 수행 할 수도 있습니다.

git revert HEAD

8
git revert HEAD해시를 찾을 필요없이 마지막 커밋을 되돌립니다.
Mike Baranczak

커밋을 전혀 삭제하지 않으려는 경우 솔루션입니다. 그러나이 경우 모든 가비지 커밋이 그대로 유지되므로 복제기가 재설정하거나 체크 아웃 할 수 있습니다. 이를 방지하려면 강제 푸시해야합니다.
cst1992

19

또 다른 방법:

되돌리려는 지점을 체크 아웃 한 다음 로컬 작업 사본을 원격 서버에서 최신으로 유지하려는 커밋으로 다시 재설정하십시오 (이후에는 계속됩니다). 이를 위해 SourceTree에서 마우스 오른쪽 단추를 클릭하고 "BRANCHNAME을이 커밋으로 재설정"을 선택했습니다.

그런 다음 저장소의 로컬 디렉토리로 이동하여 다음 명령을 실행하십시오.

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

로컬 리포지토리에서 현재 커밋 이후 모든 커밋이 지워지지 만 해당 브랜치에만 해당됩니다.


1
참고로 "REPOSITORY_NAME"은 https : /me@github.com/me/repo_name.git
tim

3
해당 명령을 분류하고 설명하면 더 도움이 될 것입니다.
cst1992

3

대부분의 제안은 지난 20 개의 커밋을 어떻게 든 파괴해야한다고 가정하므로 "역사 기록"을 의미하지만 반드시 그럴 필요는 없습니다.

커밋 # 80에서 새 브랜치를 만들고 그 브랜치에서 계속 작업하십시오. 다른 20 개의 커밋은 오래된 고립 된 브랜치에서 유지됩니다.

새 브랜치에서 동일한 이름을 사용하려면 브랜치가 기본적으로 레이블임을 기억하십시오. 기존 지점의 이름을 다른 것으로 바꾸고 커밋 # 80에서 원하는 이름으로 새 지점을 만드십시오.


나는 이것이 또한 관심있는 지부의 역사에 대한 모든 사람들의 현지 버전을 문제로 엉망으로 추측합니다.
ragerdl

2

마스터에서 분기 업데이트를 수행 할 때 때때로 초과 클릭하여 분기가 마스터로 병합되는 것을 알 수 있습니다. 그것을 취소하는 방법을 찾았습니다.

마지막 커밋이 병합이라면 조금 더 많은 사랑이 필요합니다.

git revert -m 1 헤드


1

github에서 쉬운 방법은 github UI의 분기 탭 아래에서 원격 분기를 삭제하는 것입니다. 분기를 삭제 가능하게하려면 다음 설정을 제거해야합니다.

  1. 기본 브랜치가 아님
  2. 여론 조사 요청이 없습니다.
  3. 지점이 보호되지 않습니다.

이제 이전 커밋 지점을 가리 키도록 로컬 저장소에서 다시 작성하십시오. 다시 원격 저장소에 추가하십시오.

git checkout -b master 734c2b9b   # replace with your commit point

그런 다음 로컬 지점을 원격으로

git push -u origin master

기본 분기 및 분기 보호 등을 다시 추가하십시오.

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