2014년 2월 4일 화요일

GIT 유용합 팁

1. 취소하기

작업하다보면 수정한 사항에 대해서 취소하고 싶은 경우가 생기는데, 아래 방법이 유용하다.

1.1 git add 를 통해 index 에 반영한 내용 즉, add 취소 git reset 을 통해 index의 내용을 HEAD로 되돌리고, working directory는 그대로 유지한다. $ git reset 대표적인 사용 예가 잘못 해서 git add -u 로 모든 tracked files를 add 했을 때 특정 파일만 add 취소할 때 좋다. $ git reset <path> i.e) $ git reset ./a.txt 다시 얘기하지만 add에 대한 취소는 reset이다. rm 이 아니다. rm을 이용하면 git tracking에서 제외하는 엄청난 결과를 초래할 수 있다. 1.2 git commit 을 통해 local repo 에 반영한 내용 즉, commit 취소 여러 가지 경우가 있을 수 있는데, 우선 수정할 경우을 알아보면 commit --amend가 있다. 직전 commit에 대한 Log를 잘못 작성해서 Log만 수정하거나, commit 이후에 같은 내용의 변경에 대해서 새 commit을 만들지 않고 직전 commit에 합칠 경우 유용하다. 아래와 같이 git --amend 를 통해 이전 commit과 합칠 수 있다. $ git commit --amend $ git commit --amend -C HEAD 그밖에 직전 commit을 취소할 경우 git reset 을 통해 직전 commit을 local repo.에서 삭제할 수 있다. 이때 HEAD가 직전 commit을 가리키므로 HEAD^로 reset 하면 된다. $ git reset --hard HEAD^ 이때 주의할 것은 --hard 옵션은 working directory 의 내용에서도 직전 commit을 삭제하고, 복구할 수 없다는 것이다. 만약 local repo에서의 commit만 삭제하고 working directory는 유지하고자 한다면, --hard 대신 --soft 혹은 --mixed 를 사용해야 한다. --soft와 --mixed의 차이는 index에도 삭제 여부이며, --soft는 index에 유지한다.

2. 이전 상태로 복구(roll back)하기

여러 commit을 하다보면 이전 commit 상태로 돌아가고 싶은 때가 있다. 이런 개념을 소위 check out 이라고 하는데, 이전 commit 에 대해서 check out 하면 그때 상태로 working directory가 복구된다. git를 이용할 때는 복구하고자 하는 상태 이후에 변경한 사항을 유지할 것인가에 따라  checkout  혹은 reset 를 잘 사용해야 한다.

2.1 변경 사항을 유지할 경우 checkout을 이용한다.

git checkout 에 특정 commit을 주어 해당 commit으로 working direcotory를 변경할 수 있다. $ git checkout <commit> 단, 이때는 임시 branch 상태이므로 잠시 이용할 사항이 아니라 이 상태에서 추가적으로 commit을 하려면 임시 branch가 아니라 새 branch를 생성해야 한다. $ git checkout -b <new branch name> 애초에 checkout 이후에 commit 할 생각이면 특정 commit 에서 새 branch를 만드는 것이 좋다. $ git checkout -b <new branch name> <commit> 위의 경우 복구 후에 다시 변경 사항을 그대로 유지한 branch로 checkout 할 수 있다.

2.2 변경 사항을 유지 하지 않을 경우 reset 한다.

git reset 에는 --soft, --hard, --mixed 등 옵션이 많은데, working directory까지 해당 commit으로 복구하려면, --hard를 사용하면 되는데 해당 commit 이후의 commit은 복구할 수 없으니 주의해야 한다. $ git reset --hard <commit>

2.3 특정 파일만 이전 상태로 변경할 경우에도 checkout 을 한다.

git checkout 에 file을 명시하지 않고 commit을 주면 전체 commit을 반영하지만, file까지 추가하면 해당 file만 반영한다. 이때는 임시 branch를 만들지 않고 해당 file만 변경하며 필요시 git commit 하면 된다. $ git checkout <commit> <file>

3. rebase 이용하기

rebase을 이용하면 기존 commit 에 대해서 합치고, 나누고, 순서를 바꾸는 등의 다양한 기능을 할 수 있다. 거시적으로 다른 branch와의 rebase와 현재 branch에 대한 rebase로 구분할 수 있다.

3.1 다른 branch에 대한 rebase 만약 기존의 branch에서 분리하여 새 branch에서 작업하고 있었는데, 기존 branch의 추가 commit을 새 branch에 반영하고 싶다면 merge 혹은 rebase를 해야 한다.

최종 결과의 working directory를 보면 차이가 없을 수도 있지만, gitk 와 같은 GUI로 보면 merge 와 rebase의 차이를 확연히 볼 수 있는데, rebase는 우선적으로 기존 branch의 commit을 모두 적용한 이후에 새 branch의 commit을 적용하는 차이가 있다. 물론 rebase도 변경 사항에 따라 merge error가 발생할 수 있다. $ git rebase <other branch>

3.2 현재 branch에 대한 rebase 현재 branch에서의 commit 에 대해서 합치고, 나누고, 순서를 바꿀 수 있다.

이때는 -i, interactive 옵션이 필요하며, 아래와 같이 변경할 범위를 지정한 후에 변경할 수 있다. $ git rebase -i <commit> i.e) git rebase -i HEAD~5 위 명령을 입력하면 commit 목록이 보이며, 위에서부터 commit 을 다시 적용하게 되는데 이 순서를 변경할 수 있고, 필요에 따라 edit, reword, fixup, squash 등으로 합치거나 log를 변경할 수 있다.

댓글 없음:

댓글 쓰기