달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

git 알면 편한 기능

Tool/git 2010. 11. 13. 08:29
사내 세미나로 열심히 PPT 만들었는데, 역시 가지고 나올 수 없네요.. ㅎㅎ

git 사용할 때 알면 편한 옵션 몇 개를 소개하고자 합니다.
자세한 것은 git manual이나 기타 자료를 참고하시고요 대충 어떤 용도로 쓰면 좋은지 기능 위주로 설명하고자 합니다.
퍼 가실 때는 작성자 좀 남겨주세요~ ^^; (neodelicious - 김재원)

우선 소스 파일들을 working directory, add를 통한 commit 파일 설정한 것을 index, commit 한 후에 반영된 정보를 local repo로 부르도록 하니, 참고하세요.

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를 변경할 수 있다.

'Tool > git' 카테고리의 다른 글

git commit 복구하기  (3) 2010.12.08
git reference  (0) 2010.07.05
git staic build  (0) 2010.04.27
git init --bare 이용  (1) 2010.04.23
git init --bare 발단  (0) 2010.04.23
Posted by neodelicious
|