Git을 사용하다가, 커밋을 되돌려야 하는 상황이 생길 수 있습니다. Working tree가 꼬여 모든 파일이 제거되는 커밋을 작성했거나, 단순히 변경 사항이 필요없는 경우 등이 있을 수 있습니다. 그러나 이력을 되돌려야 하는 상황 중 대부분은 당황스럽고 급박한 상황인 경우가 많아, 커밋을 되돌리는 방법에 대해 제대로 알지 못하고 있으면 이력을 되돌리는 일조차 제대로 하지 못할 수 있습니다.

Git에서 이력을 되돌리는 방법은 여러가지가 있으나, 대표적으로 resetrevert를 사용할 수 있습니다. reset은 과거로 돌아가고, revert는 되돌릴 커밋의 코드만 복원시킵니다.

Reset

Reset은 과거의 이력으로 돌아간다고 생각하면 됩니다. 돌아가려는 커밋으로 저장소가 재설정되고, 해당 커밋 이후의 이력은 사라집니다.

  • 000004 : Update some.txt
  • 000003 : Update some.txt
  • 000002 : Add some.txt
  • 000001 : 초기화

000001번에 해당하는 첫 커밋부터, 000004번에 해당하는 네 번째 커밋까지 진행되어 있다고 칩시다. some.txt를 만들고 나서 열심히 수정했는데, 이 파일을 포함한 모든 변경 이력이 필요가 없어져서 some.txt를 만들기 전(000001)으로 이력을 되돌리기로 결정했다고 합시다. 다음과 같이 사용할 수 있습니다.

$ git reset 000001

위처럼 커밋 해쉬를 통해서 되돌아가려는 커밋을 직접 지정할 수도 있고, HEAD를 이용할 수도 있습니다. 예를 들어 현재를 기준으로 3개 전의 이력으로 되돌아가려면 아래처럼 사용할 수 있습니다.

$ git reset HEAD~3

옵션은 hard, mixed, soft가 있습니다.

--hard

$ git reset --hard 000001

돌아가려는 이력(여기서는 000001) 이후의 모든 내용을 지웁니다.

--soft

$ git reset --soft 000001

000001번 커밋으로 되돌아 가긴 하지만, 해당 내용은 지워지지 않고 Index(Staging Area)에 그대로 남아 있습니다. 다시 커밋할 수 있는 상태로 남아있는 것입니다.

--mixed

$ git reset --soft 000001

여기서도 000001번으로 이력은 되돌아가지만, 인덱스가 초기화되며 해당 변경 이력에 해당하는 파일들은 Modified 상태가 됩니다.

Revert

Revert는 특정 커밋의 변경 사항을 되돌리는 역할을 합니다. 사실 결과물 자체는 reset과 다를 바 없지만, 이력은 같지 않습니다.

$ git revert 000004

이렇게 되면, 커밋이 사라지지 않고 000004번 커밋을 되돌린 커밋이 새로 생성됩니다.

  • 000005 : Revert "Update some.txt"
  • 000004 : Update some.txt
  • 000003 : Update some.txt
  • 000002 : Add some.txt
  • 000001 : 초기화

되돌릴 커밋을 여러 개 설정할 수도 있습니다.

$ git revert 000004..000002

Reset vs. Revert

Reset은 이력을 단순하게 만들어 줍니다. 그러나 reset은 해당 커밋 이후의 이력을 모두 제거하므로 신중하게 사용해야 하며, 커밋을 되돌린 이력도 한 가지의 이력으로 남겨 두는 것이 좋기 때문에 되도록이면 revert를 사용하는 것이 좋습니다.

'Git 레거시 글' 카테고리의 다른 글

[Git] Cherry-pick  (0) 2018.05.30
[Git] 커밋 히스토리 수정하기  (0) 2018.05.29
[Git] 다시 커밋하기  (0) 2018.05.27
[Git] 파일 상태 Lifecycle 관리하기  (0) 2018.05.26
[Git] 브랜칭 기법  (0) 2018.05.25

+ Recent posts