command line에서 위와 같은 로그를 보기 위해서는 git log --graph 명령을 사용한다. 또는 한 줄로 된 간략한 내용을 보려면 git log --oneline --decorate --all --graph 명령을 사용한다.
❯ git log --oneline --decorate --all --graph
* a96c357 (HEAD -> master) third
* 77221f4 second
* 7b5aa3f first
* e90bab6 first commit
* a4c5cce init
작업 되돌리기 1 - revert
작업을 하다보면 특정 버전으로 되돌아가야 할 필요가 발생한다. 새롭게 추가한 작업이 아예 망한 경우라고 볼 수 있다. 이때는 reset과 revert를 사용할 수 있다.
먼저 revert는 Git의 특정 커밋을 취소하고 그 취소 내역을 새로운 커밋으로 기록하는 명령어이다. 이를 통해 이전 커밋의 변경사항을 롤백 시켜서 이전의 상태로 되돌릴 수 있다.
예를 들어 현재 "third"를 추가 후 commit 했던 내용이 잘못됨을 발견하고 롤백 시키려면 third commit을 revert 시키면 된다. 이 내용은 자동으로 rollback의 결과를 새로운 commit으로 만들어주고 코드는 first와 second만 남아 있을 것이다.
public class Test {
public static void main(String[] args) {
String first = "first";
String second = "second";
}
}
다시 second commit을 revert 시키면 결과는 다음과 같다.
public class Test {
public static void main(String[] args) {
String first = "first";
}
}
위 보기와 같이 revert를 하면 매번 새로운 commit이 생성되서 되돌리기 이력이 유지된다.
command line에서 revert를 위해서는 git revert <commit_id>를 사용한다.
git revert 7b5aa3f
Revert "first"
This reverts commit 7b5aa3fe320170a042b16e0f1a88bb740d606cd4.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
# modified: src/gittest/Test.java
작업 되돌리기 2 - reset
reset은 revert와 마찬가지로 작업을 되돌리는 역할을 한다. 차이점은 특정 commit을 롤백시키는 것이 아니라 특정 버전으로 만들어버린다.
reset은 hard, mixed, soft 3단계로 모드를 지정할 수 있다.
mode
Working Tree
Staging Area
Repository
hard
되돌림
되돌림
되돌림
mixed(default)
유지
되돌림(unstaged로 변경)
되돌림
soft
유지
유지
되돌림
third에 해당하는 commit을 오른클릭 해서 hard 모드로 reset 해보자.
작업의 결과 third 이후의 작업들은 모두 없어진 것을 확인할 수 있다.
hard 모드이므로 Test.java는 third에서 commit 했던 내용을 가지고 있다.
package gittest;
public class Test {
String first = "first";
String second = "second";
String third = "third";
}
작업 결과 트리를 살펴보면 revert가 작업의 이력을 유지하는 반면 reset은 작업 내역을 완전히 삭제해 버린다. 결과로 history가 깔끔하게 관리되지만 git이 작업의 이력 관리가 목적이라는 점에서 고민이 필요하다.