1 커밋을 롤백하려면 어떻게해야합니까? ahead of ‘faves/master’ by

내가 밀지 않은 커밋이 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

그건?



답변

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

git rebase -i HEAD^^

또는,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

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

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

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

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

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


답변

이것은 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

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


답변

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


답변

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

git rebase -i HEAD^^

내가 망쳐 서 했어

git rebase --abort

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

git push origin master -f

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


답변

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

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

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

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


답변

git reset --hard취소 할 수없는 것에 대한 jtimberman의 의견을 참조하면 이는 사실이 아닙니다. 여기를 참조하십시오 : https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1


답변

git reset --hard {ref}

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

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