카테고리 없음

git revert git reset 차이점

behonestar 2017. 10. 17. 14:22

git revert


소스코드를 한단계 이전의 commit 내용으로 롤백하기 위해 아래와 같이 입력한다.


git revert HEAD~


소스코드만 보면 한단계 이전으로 돌아간 것처럼 보이지만, 내부적으로는 새로운 commit이 발행된다.


Rollback한 이력이 모두 기록되기 때문에 안전한 방법이다.







git reset


소스코드를 한단계 이전의 commit 내용으로 롤백하기 위해 아래와 같이 입력한다.


(hard 옵션을 주면 최근의 커밋을 완전히-작업트리까지- 버리고 이전의 상태로 되돌린다.)


git reset --hard HEAD~


git revert와 달리 local/master의 HEAD가 한단계 뒤로 돌아가며 이후의 commit은 삭제된다.








공용 브랜치(origin/...)에서는 git reset 사용하지 말 것!


git reset 후 push를 하면 origin/master의 HEAD도 3번째 commit을 가리키며, 이후의 commit은 삭제된다.


하지만 다른 작업자의 local/master의 HEAD는 여전히 4번째 commit을 가리킨다.


git pull을 실행해도 origin/master의 commit으로 되돌아가지 않는다.


# git pull

From https://github.com/myproject/project

 + 2fdd108...0143329 master     -> origin/master  (forced update)

Already up-to-date.


origin/master 보다 새로운 commit을 갖고 있는 것으로 인식해버리기 때문이다.


# git status


On branch master

Your branch is ahead of 'origin/master' by 1 commits.

  (use "git push" to publish your local commits)


이 경우 다른 개발자도 local/master의 HEAD를 origin/master의 HEAD와 맞춰줘야 한다.


git reset --hard origin/master





git reset 후, 나의 local/master는 아래쪽의 작업트리를 타지만, 다른 개발자의 local/master는 여전히 윗쪽의 작업트리를 탄다. 


즉, `git reset --hard` 이후에 서로 다른 작업트리를 타기 때문에 공용 브랜치에서는 사용하지 말아야 한다.



출처

https://www.atlassian.com/git/tutorials/undoing-changes