공개 리포지토리에서 이전 Git 커밋으로 롤백


802

git 에서 특정 커밋으로 롤백하는 방법은 무엇입니까?

누군가 나에게 줄 수있는 가장 좋은 대답 git revert은 원하는 커밋에 도달 할 때까지 X 번 을 사용하는 것이 었습니다 .

그래서 20 커밋 된 커밋으로 되돌리려면 20 번 실행해야한다고 가정 해 봅시다.

더 쉬운 방법이 있습니까?

이 저장소가 공개되어 있기 때문에 재설정을 사용할 수 없습니다.


1
git revert <commit>이 작동하지 않습니까?
miku

8
내 질문에 명시된 바와 같이, 이것은 내가 20 커밋 전에 무언가로 되돌리려는 경우 실제로 도움이되지 않습니다.
David

7
이 질문에 대한 답변이이 문서에서 상당히 잘되었습니다. stackoverflow.com/questions/4114095/…
user7610

4
"롤백"의 의미가 명확하지 않습니다. 작업 복사본을 특정 버전으로 일시적으로 전환하고 싶습니까? 또는 저장소의 히스토리를 특정 개정으로 영구적으로 되돌리려 고합니까?

1
답변을 수락하고 원하는 다른 답변에 투표하십시오.
Nabil Kadimi

답변:


1193

이 시도:

git checkout [revision] .

[revision]커밋 해시는 어디에 있습니까 (예 :) 12345678901234567890123456789012345678ab.

.끝 부분을 잊지 말고 매우 중요합니다. 전체 트리에 변경 사항이 적용됩니다. git project root에서이 명령을 실행해야합니다. 서브 디렉토리에 있으면이 명령은 현재 디렉토리의 파일 만 변경합니다. 그런 다음 커밋하고 잘해야합니다.

이 방법으로 취소 할 수 있습니다

git reset --hard 

작업 디렉토리 및 준비 영역에서 모든 수정 사항이 삭제됩니다.


7
@AlexReisner 현재 디렉토리의 종말점에있는 기간, 반드시 전체 자식 프로젝트는 아닌가? 전체 프로젝트에 변경 사항을 적용하려면 현재 git 프로젝트 루트에 있지 않은 경우 'git add : /'에서와 같이 ': /'를 대신 사용 하시겠습니까?
MSpreij

10
참고 : 그 이후로 새 파일을 프로젝트에 추가 한 경우 삭제되지 않습니다. 따라서 (플랫폼에 따라) 빌드하려고 할 때 여전히 오류가 발생할 수 있습니다. 새 파일을 삭제하면 좋습니다.
TheWestIsThe ...

6
@MSpreij git 프로젝트 루트에서이 명령을 실행해야합니다. 서브 디렉토리에 있으면이 명령은 현재 디렉토리의 파일 만 변경합니다.
volatilevar

3
다른 디렉토리에서 프로젝트를 복제하고 git checkout [revision]을 사용할 때 좋습니다. 특정 개정으로 돌아가서 다른 디렉토리의 동일한 프로젝트와 비교합니다. 많은 시간을 절약합니다.
Donato

4
젠장, 나는 "." 내 저장소에 어떤 손상을 가했습니까?
Owl

196

특정 커밋으로 롤백하려면

git reset --hard commit_sha

10 개의 커밋을 롤백하려면 :

git reset --hard HEAD~10

기록을 다시 쓰지 않으려면 다음 게시물과 같이 "git revert"를 사용할 수 있습니다

Git 리포지토리를 이전 커밋으로 되 돌리는 방법은 무엇입니까?


4
이 접근법과 "git checkout [revision]"의 차이점 만. 후자는 개정을 유지한다는 것입니다.
deeshank

53
OP가 구체적으로 "이 레포가 공개되어 있기 때문에 재설정을 사용할 수 없습니다"라고 표시되어 있기 때문에이 답변은 잘못되었습니다.
Yarin

4
repo가 ​​공개 인 경우 강제 푸시 (git push -f)를 사용하지 않고 공개 저장소에서 커밋을 롤백 할 수있는 방법이 없다고 생각합니다. 롤백 전에 변경 사항을 가져온 사람들에게 영향을 미치기 때문입니다. 따라서 공개 리포지토리의 로컬 샌드 박스에서도 재설정을 사용할 수 있습니다.
나가 키란

4
분리 된 HEAD를 피하는 것이 좋습니다! 내가 찾던 것.
사이버 스님

1
내 경우에는 이것이 효과가 있었으며 회귀 테스트 등을 테스트 한 후 'git pull'을 사용하여 머리 앞으로 빨리 감습니다.
Peter Quiring

86

글쎄, 질문은 '롤백'이 무슨 뜻입니까? 당신이 할 수없는 경우 reset는 공공 그리고 당신은 그대로 역사를 커밋 유지하려는 때문에, 당신은 당신이 당신의 작업 복사본이 특정 커밋 반영하려는 의미합니까? git checkout커밋 해시를 사용하십시오 .

편집 : 의견에서 지적했듯이 git checkout분기를 지정하지 않고 사용 하면 "분기 없음"상태가됩니다. 사용 git checkout <commit> -b <branchname>지점에, 또는 체크 아웃에 git checkout <commit> .현재의 지점에 체크 아웃.


이로 인해 이상한 '현재 지점에 없음'상태가되지 않습니까? 롤백을 완료하기 위해 변경 사항을 어떻게 커밋합니까?
Alex Reisner

글쎄, 나는 단지 사용을 제안하고 있습니다 git checkout-그는 그가 원하는 모든 지점 (현재 또는 새로운)을 자유롭게 체크 아웃 할 수 있습니다. 모호하지 않도록 답변을 업데이트하겠습니다.
Ben

2
나는 이것을 시도했지만 이것이 파일을 정체시키는 원인이되는 올바른 방법이라고 생각하지 않습니다. 마지막 커밋에없는 파일은 삭제되지 않습니다.
David

3
작업 디렉토리에 있고 마스터 상태를 유지 git reset하는 경우 원하지 않는 파일을 삭제 해야 합니다. 별도의 브랜치로 시도하십시오. git checkout <commit> -b <branchname>, 해당 브랜치에 정체 파일이 없습니다 .
Ben

2
사용의 문제점 checkout은 이전 커밋에 추가 된 파일을 삭제하지 않는다는 것입니다.

42

원래 포스터는 다음과 같이 말합니다.

누군가 나에게 줄 수있는 가장 좋은 대답 git revert은 원하는 커밋에 도달 할 때까지 X 번 을 사용하는 것이 었습니다 .

그래서 20 커밋 된 커밋으로 되돌리려면 20 번 실행해야한다고 가정 해 봅시다.

더 쉬운 방법이 있습니까?

이 저장소가 공개되어 있기 때문에 재설정을 사용할 수 없습니다.

git revertX 번 을 사용할 필요는 없습니다 . git revert커밋 범위를 인수로 받아 들일 수 있으므로 한 번만 사용하여 커밋 범위를 되돌릴 수 있습니다. 예를 들어, 마지막 20 개의 커밋을 되돌리려면 다음을 수행하십시오.

git revert --no-edit HEAD~20..

커밋 범위 HEAD~20..는 짧으며 HEAD~20..HEAD" HEAD 커밋 의 20 번째 부모 에서 시작하여 커밋 범위 를 HEAD까지 되돌립니다"를 의미합니다.

병합 커밋이 없다고 가정하면 지난 20 개의 커밋을 되돌 립니다. 병합 커밋이있는 경우 하나의 명령으로 모두 커밋 할 수 없으므로 다음과 같이 개별 커밋해야합니다

git revert -m 1 <merge-commit>

또한 git revertgit 버전 1.9.0 을 사용하여 범위를 사용하여 테스트했습니다 . 이전 버전의 git을 사용하는 경우 범위를 사용 git revert하거나 작동하지 않을 수 있습니다.

이 경우 git revert보다 선호됩니다 git checkout.

참고는 달리 사용 말합니다이 답변git checkout , git revert 실제로 당신이 복귀하고 있다는 커밋의에서 추가 된 파일을 제거합니다 이에게 개정의 범위를 되돌릴 수있는 올바른 방법을 만드는을.

선적 서류 비치


참고 : 변경 사항을 되돌려 새로운 커밋만듭니다 . OP의 질문에 완벽합니다. 그러나 그것이 원하는 것인지 확인하십시오. ( 위에 연결된 git-revert doc 의 예제 는 훌륭합니다.) 대신 이전 커밋을 조사하려면 (즉, 되돌릴 커밋을 선택하기 전에) 다른 답변에 언급 된 체크 아웃 옵션을 사용하십시오. 다른 사람들의 의견을 명심하십시오. 삭제 된 파일을 만들었습니다.
SherylHohman

@SherylHohman 이전 커밋으로 되 돌리면 새로운 커밋이 생성되지 않습니다. 나는 당신이 여기서 무슨 뜻인지 상상할 수 없습니다.

27

1 단계 : 커밋 목록 가져 오기 :

git log

이 예제와 같이 목록이 표시됩니다.

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

2 단계 : 필요한 커밋 해시를 복사하여 체크 아웃하기 위해 붙여 넣기

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

그게 다야.


11
git read-tree -um @ $commit_to_revert_to

할 것입니다. "git checkout"이지만 HEAD를 업데이트하지 않습니다.

같은 효과를 얻을 수 있습니다

git checkout $commit_to_revert_to
git reset --soft @{1}

편의 명령을 함께 묶는 것을 선호하는 경우.

이것들은 원하는 상태로 작업 트리와 색인을 남기고 git commit마치면됩니다.


이것은 매력처럼 작동하는 유일한 간단한 접근법입니다! 나는 머리에서 체크 아웃 하고이 명령을 실행했으며 우리가 도입 한 모든 파일을 성공적으로 제거하고 모든 변경 사항을 되돌 렸습니다. 우수한.
kamranicus

6

HEAD 분리 모드를 원하십니까?

DETACHED HEAD를 사용하여 X 커밋을 특정 커밋으로 롤백하려면 (아무것도 엉망으로 만들 수 없음을 의미) 반드시 다음을 사용하십시오.

(X를 당신이 돌아가고 싶은 커밋 수로 대체하십시오)

git checkout HEAD~X

한 커밋으로 돌아가는 IE :

git checkout HEAD~1

1
나는 믿기 ​​어려워서 부분을 ​​제거 할 것입니다 ... 개인적으로 보였으며 누군가가 위의 의견에 언급했으며 @ken에서도 그의 대답에 언급했습니다.
meJustAndrew 10

@meJustAndrew 그것은 사람들을 혼란스럽게하는 SO에 대한 많은 답변이므로 상당히 성가시다.
Karl Morrison

간단하고 정직한 답변입니다.
Ammad

2

프로젝트를 수행하고 하루 정도 후에 작업한다고 가정 해 봅시다. 하나의 기능으로 여전히 오류가 발생합니다. 그러나 오류가 발생한 변경 내용을 모릅니다. 따라서 이전 작업 커밋을 피싱해야합니다. 특정 커밋으로 되돌리려면

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

좋아, 그래서 커밋이 당신을 위해 작동합니다. 더 이상 오류가 없습니다. 문제를 정확히 지적했습니다. 이제 최신 커밋으로 돌아갈 수 있습니다.

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

오류가 발생하기 전에 특정 파일을 체크 아웃하십시오 (제 경우에는 Gemfile.lock 예제를 사용합니다).

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

그리고 이것은 나중에까지 오류를 인식하지 않고 커밋에서 만든 오류를 처리하는 한 가지 방법입니다.


2

GitHub / BitBucket / Gitlab의 커밋 섹션에서 각 커밋과 관련된 커밋 ID를 찾을 수 있습니다. 매우 간단합니다. 커밋 ID가 5889575 라고 가정 하고 코드 에서이 부분으로 돌아가려면 간단히 입력하면됩니다.

git checkout 5889575 .

코드의 특정 시점으로 이동합니다.


1

변경된 내용을 잘 모르겠지만 옵션없이 특정 커밋을 체크 아웃 할 수 없습니다 --detach. 나를 위해 일한 전체 명령은 다음과 같습니다. git checkout --detach [commit hash]

분리 된 상태에서 돌아가려면 로컬 지점을 체크 아웃해야했습니다. git checkout master


체크 아웃 은 분리 중이거나 분리 된 상태로 남아 있거나 작동했지만 분리 된 상태로 유지 master되는 문제를 해결합니다.git reset --hardgit checkout -- .
DarkCygnus

0

그 예는 다음과 같습니다.

    cd /yourprojects/project-acme 


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