learn git branching
- commit : 커밋은 부모 파일과 다른 점을 스냅샷으로 저장하는 개념
커밋하고 나면 커밋 이전의 파일이 부모 파일이 되고 새로 생성된 파일은 자식 파일이 된다. - branch : 특정 커밋에 대한 참조
git branch (브랜치명) -> 브랜치 생성
git checkout (브랜치명) -> 해당 브랜치로 이동하는 명령어 - merge : git의 합치기(merge)는 두 개의 부모(parent)를 가리키는 하나의 커밋을 만들어 냅니다.
git merge (브랜치명) -> 현재 브랜치와 해당하는 브랜치를 합친다. - rebase : 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는다. 리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다. 리베이스를 쓰면 저장소의 커밋 로그와 이력이 한결 깨끗해집니다.
- git에서 여기저기 옮겨다니기!!
-
HEAD : 체크아웃된 커밋 -> 현재 작업중인 커밋
-
HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미
-
git log를 이용하려 커밋의 해시값을 보고 이동할 수 있는데 다 쓸 필요는 없고 적당히 구분할 수 있는 정도의 해시값만 넣어줘도 깃이 알아서 찾아 넣는다.
-
해시로만 구분하는 것이 아닌 상대 참조로도 구분이 가능하다
- 한 번에 한 커밋 위로 이동하는 ^ ex)git checkout bugFix^
- 한 번에 여러 커밋 위로 이동하는
ex) git checkout HEAD2 (현재 커밋을 이동)
-
제가 상대 참조를 사용하는 가장 일반적인 방법은 브랜치를 옮길 때 입니다. -f 옵션을 이용해서 브랜치를 특정 커밋에 직접적으로 재지정 할 수 있습니다. 이런 식으로 말이죠:
-
git branch -f main HEAD~3
-
(강제로) main 브랜치를 HEAD에서 세번 뒤로 옮겼습니다.
-
- git에서 작업 되돌리기!!
- git reset : 브랜치로 하여금 예전의 커밋을 가리키도록 이동시키는 방식 -> 히스토리를 고쳐 쓴다. -> 다른 사람이 작업하는 리모트 브랜치에서는 쓸 수 없다. ex) git reset HEAD~1
- git revert : 변경 내역을 이전 커밋과는 정반대의 내용으로 새로운 커밋을 생성 ex) git revert HEAD
- 작업을 여기저기로 옮기기!!
- git cherry-pick (Commit1) (Commit2) (...) : 현재 위치(HEAD) 아래에 있는 일련의 커밋들에대한 복사본을 만들겠다는 것을 간단히 줄인 말
- 인터렉티브 리베이스 : rebase 명령어를 사용할 때 -i 옵션을 같이 사용한다는 것 -> git은 리베이스의 목적지가 되는 곳 아래에 복사될 커밋들을 보여주는 UI를 띄울것 입니다.
각 커밋을 구분할 수 있는 각각의 해시들과 메시지도 보여줍니다.- 적용할 커밋들의 순서를 UI를 통해 바꿀수 있습니다(여기서는 마우스 드래그앤 드롭으로 가능합니다.
- 원하지 않는 커밋들을 뺄 수 있습니다. 이것은 pick을 이용해 지정할 수 있습니다(여기서는 pick토글 버튼을 끄는것으로 가능합니다)
- 마지막으로, 커밋을 스쿼시(squash)할 수 있습니다. 불행히도 저희 레벨은 몇개의 논리적 문제들 때문에 지원을 하지 않습니다. 이거에 대해서는 넘어가겠습니다. 요약하자면 커밋을 합칠 수 있습니다
- ex) git rebase -i HEAD~4
-
딱 한 개의 커밋만 가져오기
-
git commit --amend 명령으로 커밋 내용을 정정합니다
-
-- Git 태그는 특정 커밋들을 브랜치로 참조하듯이 영구적인 "milestone(이정표)"으로 표시합니다.
- Git 태그는 커밋들이 추가적으로 생성되어도 절대 움직이지 않는다는 것입니다. 여러분은 태그를 "체크아웃"한 후에 그 태그에서 어떤 작업을 완료할 수 없습니다
- -- 태그는 커밋 트리에서 특정 지점을 표시하기위한 닻같은 역할을 합니다.
- ex) git tag (내용) (위치)
-
git에는 여러분이 가장 가까운 "닻(태그)"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 git describe 입니다!
- git describe (ref) :(ref)에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다
- 명령어의 출력은 다음과 같은 형태로 나타납니다:
- (tag)_(numCommits)_g(hash)
- tag는 가장 가까운 부모 태그를 나타냅니다. numCommits은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. 는 묘사하고있는 커밋의 해시를 나타냅니다
#원격!!
- 원격 저장소의 장점 : 백업으로서의 역할 + 협업 가능
- git clone : 원격 저장소의 복사본을 로컬에 생성해주는 명령어
- git clone 를 입력하면 로컬 저장소에 o/main이라는 원격 브랜치가 생성된다. -> 원격 저장소가 갱신될 때만 갱신된다.
- 주 원격 저장소의 이름은 보통 origin이다.
- git fetch : 원격 저장소에는 있지만 로컬에는 없는 커밋들을 다운로드 받는다.
우리의 원격 브랜치가 가리키는 곳을 업데이트 한다. -> 로컬에서 나타내는 원격 저장소의 상태를 실제 원격 저장소와 동기화한다.- 로컬 상태를 바꾸지 않는다.
- git pull : git fetch + git merge
- git push : 변경된 내용을 원격 저장소에 업로드하고 원격 저장소에서 새 커밋들을 합치고 갱신함
- git pull --rebase : fetch + rebase
- 원격 저장소 거부
- 원격 저장소는 자신의 main 브랜치에 대한 직접적인 커밋을 제한, push 대신에 pull request가 쓰여야 한다는 규칙이 원격 저장소의 main 브랜치에는 적용되어 있기 때문.
- 그래서 다른 브랜치를 따서 브랜치를 옯겨서 푸시를 해야한다는데 뭔소린지 이해 어려움