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.