이 글은 팀프로젝트를 위해 "Learn Git Branching"(https://learngitbranching.js.org/?locale=ko)사이트로 git을 공부하며 정리한 글이다.
resolving deltas : 변경사항 저장
git commit : 저장소 내용을 변경해서 하나의 커밋으로 저장(커밋이 아래로 내려가며 생김)
git branch : 새로운 브랜치 생성
브랜치를 서둘러서, 그리고 자주 만드세요
branch : 하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역
c0,c1,... = commit(이름 : hash)
main, master,... = branch
git checkout [브랜치명] : 새 브랜치로 이동
git merge : 두 개의 부모(parent)를 가리키는 특별한 커밋을 만들어냄 = 한 부모의 모든 작업내역과 나머지 부모의 모든 작업, 그리고 그 두 부모의 모든 부모들의 작업내역을 포함
git merge bugFix : 현재 위치한 브랜치가 새로 합쳐진 커밋으로 이동함. bugFix 브랜치가 가리키는 커밋 사항을 현재 브랜치가 가리키는 커밋과 합친다는 의미. bugFix 브랜치는 계속해서 같은 커밋을 가리킴. 이때 현재 위치한 브랜치가 새로운 커밋을 만들어 그것을 가리키는 것으로 이동.
리베이스는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는 것
git rebase main; : 현재 위치한 브랜치 bugFix를 main 브랜치 밑에도 똑같이 복사하여 커밋함.
git checkout main;
git rebase bugFix; : main 브랜치가 bugFix 브랜치가 있는 위치로 이동
전제 : 아래쪽 커밋은 위쪽 커밋의 내용을 모두 포함한다
HEAD : 현재 checkout된(작업중인) 커밋을 가리키는 브랜치
HEAD는 브랜치의 이름을 가리키고 있음. 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인이 가능함. 항상 최신 상태
git checkout [커밋명] : 숨어있는 HEAD 브랜치를 드러냄. 원래 main 브랜치를 가리키는 HEAD 브랜치를 직접 커밋을 가리키도록 바꿈.
상대참조 : 해시값을 일일이 쓰기 불편해서 나온 개념
git checkout main^ : main 브랜치 뒤에 있던 HEAD 브랜치를 main 브랜치의 커밋의 부모 커밋으로 이동함.
git checkout HEAD^ : HEAD를 checkout으로 꺼낸 상태일 때, 직접 이동시킬 수 있음.
git checkout HEAD~4
git branch -f main HEAD~3 : (강제로) main 브랜치를 HEAD의 위로 세 칸 위치로 옮김.
git branch -f main C6 : main 브랜치를 강제로 C6 커밋으로 이동시킴.
변경한 내용을 되돌리는 방법 :
1) git reset : 예전의 커밋을 가리키도록 이동 - local 브랜치용(개인 프로젝트용)
git reset HEAD~1 : 기존의 커밋에서 현재의 브랜치가 하나 위의 커밋으로 이동함. 그러면 기존의 커밋이 아예 없었던 것과 같은 상태가 됨.
각자의 컴퓨터에서 작업하는 로컬 브랜치의 경우 리셋(reset)을 잘 쓸 수 있지만, "히스토리를 고쳐쓴다"는 점 때문에 다른 사람이 작업하는 리모트 브랜치에는 쓸 수 없음.
2) git revert : 변경분을 되돌리고, 이 되돌린 내용을 다른 사람들과 공유 - remote 브랜치용(팀프로젝트용)
git revert HEAD : 되돌리고자하는 커밋의 아래에 새로운 커밋이 생겨, 여기에 reset된 커밋이 저장됨.
reset과의 차이점 - 다른 사람들에게도 변경 내역을 밀어(push) 보낼 수 있음
git cherry-pick <...> : 현재 위치(HEAD) 아래에 있는 커밋들에 대한 복사본을 만듦.
git cherry-pick C2 C4 : HEAD 밑에 C2, C4의 복사본을 차례로 만듦. C2, C4의 위치와는 상관 없음.
Interactive(대화형) Rebase :
리베이스의 목적지가 되는 곳 아래에 복사될 커밋들을 보여주는 UI를 띄울것임. 각 커밋을 구분할 수 있는 각각의 해시들과 메시지도 보여줌. "실제" git 에서는 UI창을 띄우는것 대신에 vim과 같은 텍스트 편집기에서 파일을 염.
-적용할 커밋들의 순서를 UI를 통해 바꿀수 있음.
-원하지 않는 커밋들을 뺄 수 있음. 이것은 pick을 이용해 지정할 수 있음
-마지막으로, 커밋을 스쿼시(squash)할 수 있음. 요약하자면 커밋을 합칠 수 있음
git rebase -i HEAD~4 : 인터렉티브 리베이스 텍스트 편집기를 띄워줌. 여기서 -i는 인터렉티브를 뜻함.
어떤 커밋을 취하거나 버릴지를 선택할 수 있음. 또 커밋의 순서를 바꿀 수도 있음. 이 커맨드로 어떤 작업의 일부만 골라내기에 유용함.
Git 태그 : 특정 커밋들을 브랜치로 참조하듯이 영구적인 "milestone(이정표)"으로 표시
git tag v1 C1 : v1이라는 태그를 C1 커밋에 지정해줌.
git describe
명령어의 출력은 다음과 같은 형태로 나타남 : __g
tag : 가장 가까운 부모 태그
numCommits : 그 태그가 몇 커밋 멀리있는지
hash : 묘사하고있는 커밋의 해시
몇개의 세대를 돌아갈지 정하는 것 대신(~의 기능) ^수식은 병합이된 커밋에서 어떤 부모를 참조할지 선택할 수 있음.
git checkout main^2 : main 브랜치 뒤에 숨어있던 HEAD를 두번째 부모를 가리키도록 옮김.
git checkout HEAD~^2~2