[Git] 종합선물세트 : rebase -i, cherry-pick, commit –amend, tag, describe

1 minute read

Learn Git Branching

git bash를 사용안하다보니 자꾸 까먹게된다. 좋은 사이트가 재미있게 다시 접근!

Learn Git Branching

로컬에 쌓인 커밋들

잘 띄지 않는 버그를 찾아서 해결하려고, 디버그용 코드와 화면에 정보를 프린트하는 코드를 작성한다. 따라서 디버깅용 코드나 프린트 명령은 그 브랜치에 들어있다. 문제를 해결 후 간단히 master브랜치를 최신 커밋으로 이동시킨다면(fast-forward) 그 불필요한 디버그용 코드들도 함께 들어가 버리는 문제가 발생한다.

$ git rebase -i

대화형 (-i 옵션) 리베이스(rebase)로는 어떤 커밋을 취하거나 버릴지를 선택할 수 있다. 또 커밋의 순서를 바꿀 수도 있다. 이 커맨드로 어떤 작업의 일부만 골라내기에 유용하다.

$ git cherry-pick

commit –amend 커밋 내용 정정

newImage와 caption 브랜치에 각각의 변경내역이 있고 서로 약간 관련이 있어서, 저장소에 차례로 쌓여있는 상황이다.

때로는 이전 커밋의 내용을 살짝 바꿔야하는 골치아픈 상황에 빠지게 된다. 이번에는 디자인 쪽에서 우리의 작업이력(history)에서는 이미 한참 전의 커밋 내용에 있는 newImage의 크기를 살짝 바꿔달라는 요청이 들어왔다.

  1. git rebase -i 명령으로 우리가 바꿀 커밋을 가장 최근 순서로 바꾼다.
  2. commit –amend 명령으로 커밋 내용을 정정한다.
  3. 다시 git rebase -i 명령으로 이 전의 커밋 순서대로 되돌려 놓는다.
  4. 마지막으로, master를 지금 트리가 변경된 부분으로 이동한다.

Git 태그

이전 강의에서 배웠듯이, 브랜치는 이동하기 쉽다. 작업의 완료, 진행에따라 이리저리 이동하면서 서로다른 커밋을 참조하게 된다. 브랜치는 쉽게 변하며 임시적인 것이다.

이런 상황에서, 중요한 지점들에 영구적으로 표시를 할 방법은 Git 태그 사용하는 것이다. – Git 태그는 특정 커밋들을 브랜치로 참조하듯이 영구적인 milestone(이정표)으로 표시한다.

중요한 점은, Git 태그는 커밋들이 추가적으로 생성되어도 절대 움직이지 않는다는 것이다.

$ git tag v1 c1

c1 위치에 v1의 이름을 갖는 tag를 붙인다.

Git Describe

커밋 트리에서 태그가 훌륭한 역할을 하기 때문에, git에는 여러분이 가장 가까운 태그에 비해 상대적으로 어디에 위치해있는지 describe(묘사)해주는 명령어가 있다. 이 명령어는 git describe 이다.

Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 준다. 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는 경우가 있다.

$ git describe <ref>

ref에는 commit을 의미하는 그 어떤것이던 쓸 수 있다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된 곳을 사용한다. (HEAD).

<tag>_<numCommits>_g<hash>
  • tag는 가장 가까운 부모 태그를 나타낸다.
  • numCommits은 그 태그가 몇 커밋에서 얼마나 멀리있는지 나타낸다.
  • 는 묘사하고있는 커밋의 해시를 나타낸다.

$ git describe master
-> 출력 : v1_2_gC2
$ git describe side
-> 출력 : v2_1_gC4

Tags:

Categories:

Updated: