1 커밋을 롤백하려면 어떻게해야합니까?


127

내가 밀지 않은 커밋이 2 개 있습니다.

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

첫 번째 것 (가장 오래된 것)을 어떻게 롤백 할 수 있습니까?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

여기에서:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

그냥해야합니까 :

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

그건?


3
이 질문은 프로그래밍 도구에 관한 것이므로 주제가 아닌 것 같습니다. 스택 오버플로에 속합니다.
Peter Mortensen

@PeterMortensen 합의. 이것은 수퍼 유저를위한 것입니다
Kolob Canyon

답변:


95

가장 안전하고 깨끗한 방법은 대화식으로 리베이스하는 것입니다.

git rebase -i HEAD^^

또는,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

여기에서 커밋을 스쿼시 할 수 있으며, 이로 인해 하나 이상의 커밋이 이전 커밋에 합쳐집니다. 히스토리에서 커밋을 완전히 삭제하려면 목록에서 행을 삭제하십시오.

커밋을 되돌릴 수는 git revert있지만 커밋 메시지를 기록에 추가하면 바람직하지 않을 수 있습니다. -n매개 변수를 사용하여 Git에게 되돌리기를 즉시 커밋하지 말라고 지시하십시오. 대화식으로 리베이스하고 이전 커밋까지 스쿼시하여 물건을 깨끗하게 유지할 수 있습니다.

여기서 작업중인 두 커밋이 동일한 파일에 영향을 미치는 경우 병합 충돌이 발생할 수 있습니다.

리포지토리 재설정은 git reset --hard취소 할 수 없으므로주의해서 수행해야합니다.

기록을 다시 작성하는 것은주의해서 수행해야합니다.


'git rebase'중에 커밋을 어떻게 삭제합니까? pick, edit, squash의 3 가지 명령 만 있습니다. 삭제 AFAIK가 없습니다.
n179911

8
목록에서 행을 완전히 삭제하면 커밋이 삭제됩니다.
jtimberman

변경 사항을 되돌리고 싶을 때 나는 그 흔적을 남기고 싶지 않았습니다. 당신이 또한 당신의 되돌리기의 흔적을 남기고 싶지 않다면 이것이 최선의 방법입니다.
Phillip Whelan

"가장 안전하고 가장 깨끗한 방법은 대화식으로 리베이스하는 것"vim을 사용하지 않는 경우는 없을 것입니다. 나는 운이 좋았고 그 혼란에서 벗어날 길을 알아 냈다. 내가 vim을 배워야하기 때문에 여전히
투표

rebase가능한 한 적게 사용 하는 것이 좋습니다 . 당신이 다른 사람들과 함께 일한다면 그냥 만드십시오 revert.
boldnik

52

이것은 http://nakkaya.com/2009/09/24/git-delete-last-commit/ 에서 온 경우 나를 위해 일한 경우

힘내 삭제 마지막 커밋

커피가 떨어졌을 때 밤 늦게 한 번, 나는 가지고 있지 않은 것들을 커밋합니다. 그런 다음 10 ~ 15 분 동안 인터넷에서 내가 마지막으로 저지른 커밋을 제거하는 방법을 사용합니다. 세 번째 시간이 지나서 나중에 참조 할 수 있도록 기록하고 싶었습니다.

정크를 커밋했지만 푸시하지 않은 경우

git reset --hard HEAD~1

HEAD ~ 1은 커밋 이전의 약칭입니다. 또는 재설정하려는 해시의 SHA-1을 참조 할 수 있습니다. --hard를 사용할 때 커밋 전 헤드 이후 손실 된 작업 트리에서 추적 된 파일에 대한 변경 사항이 있습니다.

수행 한 작업을 --soft지우지 않으려면 커밋을 삭제하는 옵션을 사용할 수 있지만 git 상태에 따라 변경된 모든 파일을 "커밋 할 변경 사항"으로 남겨 둡니다.

이제 당신이 이미 밀고 누군가가 내 경우 인 경우, git reset을 사용할 수 없습니다. 그러나 git revert를 할 수는 있지만

git revert HEAD

이것은 실수로 커밋 된 모든 것을 되 돌리는 새로운 커밋을 만듭니다.


2
--soft 옵션을 사용하면 파일 이름을 바꾸고 실수로 "git add"를 사용하는 대신 실수로 "git commit -a"하는 위치에 적합합니다.
Aaron Harun

8

아니. git-reset --hard는 역사로 돌아올 것입니다. 당신이 찾고있는 것은 커밋을 취소하는 git revert입니다.


4
글쎄, 이것은 작동하지만 커밋 로그를 오염시킵니다. 이러한 커밋이 아직 푸시 / 풀링되지 않은 경우 대화식 리베이스로 정리하는 것이 좋습니다. 히스토리 변경 기능은 다른 버전 제어 시스템에 비해 git의 주요 장점 중 하나입니다.
knweiss

6

방금이 작업을 수행했습니다.

git rebase -i HEAD^^

내가 망쳐 서 했어

git rebase --abort

그런 다음 다시했습니다. 그런 다음 다음과 같이 밀어야했습니다.

git push origin master -f

그리고 그것은 내가 롤백 한 커밋보다 새로운 커밋을 파괴했습니다. 잘 했어.


4

아니오, 커밋 git reset --hard baf8d5e을 삭제 3368e1c하고 HEAD가 baf8d5e나중에 있습니다.

3368e1c커밋 을 유지하고 커밋을 삭제하려면 bad8d5e가장 쉬운 해결책은 " git rebase -i HEAD~2"(즉, 마지막 두 커밋의 대화식 리베이스)를 수행하는 것입니다. 이 명령은 커밋 메시지 편집기를 시작하고 마지막 두 커밋 각각에 대해 한 줄을 표시합니다. bad8d5e커밋 라인을 삭제 하고 저장하십시오. git은 당신의 역사를 다시 쓰고 2 번째 커밋은 사라질 것입니다.

당신이 좋아하는 커밋 메시지 편집기에서 사용할 수있는 다른 유용한 명령이 있습니다 squash, edit등 대화 형 REBASE이 매우 강력가!

누군가 이미 이러한 커밋을 본 경우 (저장소에서 푸시 또는 풀)이 작업을 수행하지 마십시오!



1
git reset --hard {ref}

리포지토리에 다른 커밋이 하나 뿐인 경우 (예 : 초기 커밋 및 1 개 이상) 커밋을 실행 취소하는 유일한 방법입니다. 나머지 방법 (revert, rebase)은 적어도 git 1.7.5.1에서 작동하지 않습니다.

당신을 따르는 경우에 git reset로모그래퍼 git gc실제로 삭제됩니다 후 자식 기존 완전히 REPO에서 데이터를 커밋합니다.


1
git checkout <treeish> -- /path/to/dir

그러면 / path / to / dir에 대해 지정된 "트리"에서 디렉토리가 다시 나타납니다.


0

저장소 폴더 내의 HEAD 파일에서 마지막 커밋의 해시 코드를 수동으로 편집 하여이 작업을 수행했습니다.

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

그 전에는 로컬에서 수행 한 UNMERGE 작업을 시작하도록 강요 할 수 없었습니다. 그것은 중앙 저장소에 "일부 심판을 푸시하지 못했습니다"라고 계속 말하고 있습니다.

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