Home Git 다시 시작: git 기초 git game
Post
Cancel

Git 다시 시작: git 기초 git game

commit

커밋은 저장소에 있는 모든 파일에 대한 스냅샷을 기록하는 것 디렉토리 전체를 복사하여 붙여넣는 것과 유사하지만 훨씬 유용하다

이전 버전과 다음 버전의 변경내역(delta)를 저장하는 것으로 대부분의 커밋은 부모 커밋을 참조하고 있다

커밋은 매우 가볍고 커밋 사이 전환도 매우 빠르다

1
git commit --amend

–amend 옵션을 주어 커밋을 수정할 수 있지만 기존의 것을 수정하는 것이 아닌 새로운 복사본을 생성하는 것

branch

브랜치는 특정 커밋에 대한 참조이기 떄문에 매우 가볍다 떄문에 걱정 없이 브랜치를 많이 만들어도 된다

작업 단위를 잘게 나누어 많이 만들고 병합 뒤 삭제하는 방식으로 사용하는 편이 좋다

하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역..

merge

브랜치를 병합하는 방법중 하나로 두 개의 부모를 가리키는 특별한 커밋을 만들어 낸다

main 에서 merge 시

1
git merge test

main 브랜치 내에서는 기존 main 과 test 모두를 부모로 둔 자식 commit 이 생성된다

test 에서도 main 을 merge 하여 주면 양 쪽 브랜치 모두 같은 내용의 commit 을 가지게 된다

1
2
git checkout test
git merge main

rebase

브랜치 끼리의 병합 방법중 하나로 기존 커밋을 모아서 복사한 후 다른 곳에 놓는 것으로 커밋 흐름을 보기 좋게 한 줄로 만들 수 있다 병렬적으로 개발된 것을 순서대로 보이도록 할 수 있다

rebase 또한 merge 와 마찬가지로 병합할 양쪽 브랜치에서 모두 실행해줘야 하는데 동작이 조금 다르다

merge 는 두 개의 부모를 갖는 하나의 커밋을 생성하는 것이고 rebase 는 하나의 부모를 갖는 커밋을 생성한다

1
git rebase main <Branch>

기존 test 의 마지막 commit 을 복사해 하나의 길을 가는 commit 생성 main 은 이전 커밋 그대로 위치함 -> main 밑으로 현재 위치한 (혹은 입력한) branch 가 붙는다

1
2
git checkout test
git rebase test

이전 commit 에 위치하고 있던 main 브랜치의 커밋이 test 와 병합된 마지막 commit 을 가리키게 된다

HEAD 는 현재 checkout 된 커밋을 가리킨다 -> 현재 작업중인 커밋 HEAD 는 항상 작업 트리의 최근 커밋을 가리킨다 작업 트리에 변화를 주는 대부분은 HEAD 를 변경하는 것으로 시작한다 일반적으로는 HEAD 가 브랜치 이름을 가리키고 있다

HEAD 분리

HEAD 분리는 HEAD 를 브랜치 대신 커밋에 붙이는 것을 의미한다 HEAD 이동이라는 표현이 더 정확할 것 같다

HEAD -> main -> C1 의 참조 형태를

1
git checkout C1

명령으로 HEAD -> C1 형태로 만들 수 있다

각 커밋은 해당 커밋의 해시 값으로 특정할 수 있다

상대 참조

git 의 해시 값은 굉장히 길다

1
fed2da64c0efc5293610bdd892f82a58e8cbc5d8

git 은 시작부터 6개 정도의 알아볼 수 있을 만큼의 문자열만 입력해도 해당 해시를 찾을 수 있다

상대 참조는 이처럼 해시 값을 사용하는 것이 아니라 기호를 통해 현재 커밋부터의 위치 값으로 커밋을 특정할 수 있다

한 커밋 위

1
^

여러 커밋 위

1
~<num>
1
git checkout main^

위와 같이 사용하여 현재 main 브랜치를 가리키고 있는 HEAD 를
바로 위 커밋으로 이동 가능하다

브랜치 강제로 옮기기

상대 참조를 이용하여 브랜치를 옮길 수 있다 -f 옵션(강제)을 사용하면 브랜치를 특정 커밋에 직접적으로 재지정 할 수 있다

1
git branch -f main HEAD~3

amin 브랜치를 강제로 HEAD 에서 3번 뒤로 옮긴다

작업 되돌리기

reset

1
git reset HEAD^

가장 최근 커밋 하나를 히스토리 까지 삭제한다 local 의 경우 reset 을 사용 가능하지만 히스토리를 고친다는 점에서 remote 에서 사용하긴 어렵다

revert

되돌린 커밋 내용을 다른 사람들과 공유 하기 위해서는 revert 를 사용한다

1
git revert HEAD

revert 를 하면 기존의 것이 삭제되는 것이 아닌 새로운 커밋이 생성된다

가장 최근 커밋을 하기 이전 커밋 상태로 새 커밋 히스토리를 추가하는 것 기존 히스토리를 수정하지 않기 때문에 remote 에 공유하더라도 문제가 되지 않는다

This post is licensed under CC BY 4.0 by the author.