브런치가 바뀌는거는 파란색 글씨를 보면 된다. 파란 글씨는 작업을 하기 위해 바꾼 브런치 명이다.
◼ [심화과정] HEAD와 Branch와의 관계
git의 commit, head, reset도 배우고, branch의 checkout도 배웠다 이 두개의 관계가 있다.
1. git의 HEAD 는 체크아웃한 브런치의 최신 커밋을 가르킨다.
예를 들어 master브런치를 HEAD가 가르키고 있었다.
git checkout premium 으로 브런치를 바꿨다.
그러면 HEAD는 premium으로 이동한다!
코드잇-깃수업이미지[참조]
2. git의 head만이 브랜치에 의한게 아닌 독단으로 이동하여 다른 commit을 가르킬수도 있다. 그런상태를 "Detached HEAD" 상태이다.
이렇게 head만 이동하는 이유는!!! 과거 커밋에서 새로운 브렌치를 만들고 싶을때 이다.
$ git checkout 4b04 // 1. head가 commit의 과거 기록을 직접 가르기게 한다 (4b04번 기록)
$ git branch new-branch // 2. 과거기록을 새로운 브런치에 생성한다
이렇게 head가 가르키는 commit의 기록이 그대로 새로운 브런치가 만들어 지는것이다. 그러면서 직접 commit을 가르키던 head는 새로 만든 'new-branch'를 가르키게 된다.
◼ Branch에서 다 작업했어! 원본에 Merge(병합)하고 , Remote(원격저장소)에 저장.
전에 쓴글의 이미지를 사용해서 간단히 설명을 하려고 한다.
원본 파일 브런치는 [메인] || 수정할 브런치 이름을 [수정1]이다
1. 버전관리를 할 때 원본파일을 '졸업논문.hwp' 파일을 원본에서, [수정1]이라는 브런치를 생성, 이동한다. 2. [수정1]에서 목차를 수정하고 저장한다.(commit 과정까지) 3. [메인]브런치로 checkout을 한다. 4. 그리고 "git merge 수정1"이라고 명령한다 5. git push로 원격저장소에 저장한다.
◼[찾아보기] Merge의 종류
Merge Commit Squash Merging Rebase Merging Recursive Merge Fast-forward 등등등...
종류가 있다. 이것은 회사마다 다르기 떄문에 나중에 일을 하게 된다면 그때 좀더 자세히 찾아 볼 예정이다!
◼ 작업 전엔 항상 Pull ~ 아! Fetch도 있어.
push를 하게 되면 remote에 내가 작업한 것이 업로드 되어있다.
pull은 remote 저장소에서 있는 최신 commit들을 내 local repository(로컬저장소)로 가지고 온다.
그리고 자동으로 merge를 하여 새로운 commit을 만든다.
코드잇-깃수업
fetch는 pull과 같이만, merge만 안한다고 생각하면된다.
그럼 왜 하는거야?
merge를 하기 전에 remote에 올라온 파일이 문제가 없는지 확인을 하고 싶을때,
git fetch를 하여 내용만 가지고 와서 확인하고!
문제가 있을시에 수정을 하고, 없으면 merge를 하면 된다.
◼명령어 모음집
코드잇에 정보를 참조하였다!
내가 생각하는 방식으로 조금 분리를 하고, 내용도 좀 수정하였다
레포지토리 관리
git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성
git configuser.name'codeit' : 현재 사용자의 아이디를 'codeit'으로 설정(커밋할 때 필요한 정보)
git config user.email 'teacher@codeit.kr' : 현재 사용자의 이메일 주소를 'teacher@codeit.kr'로 설정(커밋할 때 필요한 정보)
git push -u origin 브런치 : 맨 처음 브런치가 리모트에 없을때, 로컬 레포지토리의 브런치가 리모트 레포지토리에 tracking 되도록 설정고 등록해야한다
u는 '--set-upstream'약자로
로컬 레포지토리에 있는 master 브랜치가 origin에 있는 master 브랜치를 tracking(추적)하는 걸로 설정
git 도움말
git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력
파일 및 디렉토리 관리
git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기
git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기
git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기
git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음)
원격 저장소 업로드 및 다운로드
git push : 위의 커맨드를 한번 실행하고 난 후에는 git push라고만 쳐도 로컬 레포지토리의 내용을 리모트 레포지토리에 올릴 수 있다.
git pull : 바로 위의 위에 있는 커맨드를 한번 실행하고 난 후에는 git pull이라고만 쳐도 리모트 레포지토리의 내용을 로컬 레포지토리로 가져온다.
git fetch : 리모트에 먼저 머지된 내용을 확인하고 싶고 싶을 떄 사용한다.pull과 다르게 머지는 자동으로 되지 않기에 확인하며 머지를 따로 해주면 된다.
git clone [프로젝트의 GitHub 상 주소] : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기
Commit 관련
git commit : 에디터가 열리며 작성하기 편하고 많은 글을 쓸때 용이하다
git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기
git commit --amend : 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦
git rebase [브랜치 이름] : A, B 브랜치가 있는 상태에서 지금 HEAD가 A 브랜치를 가리킬 때, git rebase B를 실행하면 A, B 브랜치가 분기하는 시작점이 된 공통 커밋 이후로부터 존재하는 A 브랜치 상의 커밋들이 그대로 B 브랜치의 최신 커밋 이후로 이어붙여짐(git merge와 같은 효과를 가지지만 커밋 히스토리가 한 줄로 깔끔하게 된다는 차이점이 있음)
git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성
Commit history 관련
git log : 커밋 히스토리를 출력
git log --pretty=oneline : --pretty 옵션을 사용하면 커밋 히스토리를 다양한 방식으로 출력할 수 있다. --pretty 옵션에 oneline이라는 값을 주면 커밋 하나당 한 줄씩 출력
git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지 확인
git diff [커밋 A의 아이디][커밋 B의 아이디] : 두 커밋 간의 차이 비교
git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력
Git reset 관련
과거의 커밋으로 git reset을 -hard 바꿨다고 최신의 커밋들이 삭제되는 게 절대 아니고, 기록이 보지 않을뿐 숨겨져있다.
git reflog : HEAD가 그동안 가리고있던 커밋들의 기록을 출력
git reset [옵션][커밋 아이디] : 옵션에 따라 하는 작업이 달라짐(옵션을 생략하면 --mixed 옵션이 적용됨)
git reset --soft [커밋 아이디] : HEAD를 특정 커밋으로 이동시키면서 staging area와 working directory는 그대로 유지
git reset --mixed [커밋 아이디] : HEAD를 특정 커밋으로 이동시키면서 staging area는 초기화되고 working directory는 그대로 유지
git reset --hard [커밋 아이디] : HEAD를 특정 커밋으로 이동시키면서 staging area와 working directory 모두 해당 커밋의 상태로 변경그리고 이때 커밋 아이디 대신 HEAD의 위치를 기준으로 한 표기법(예 : HEAD^, HEAD~3)을 사용해도 됨
브랜치 관리
git branch [새 브랜치 이름] : 새로운 브랜치를 생성
git checkout -b [새 브랜치 이름] : 새로운 브랜치를 생성하고 그 브랜치로 바로 이동
git branch -d [기존 브랜치 이름] : 브랜치 삭제
git checkout [기존 브랜치 이름] : 그 브랜치로 이동
git merge [기존 브랜치 이름] : 현재 브랜치에 다른 브랜치를 머지
git merge --abort : 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감
Stash 관련
git stash : 현재 작업 내용을 스택 영역에 저장
git stash apply [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용
git stash drop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 스택에서 삭제
git stash pop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용하면서 스택에서 삭제
기타
git config alias.[별명][커맨드] : 길이가 긴 커맨드에 별명을 붙여서 이후로는 별명으로도 해당 커맨드를 실행할 수 있게 설정
git tag [태그 이름][커밋 아이디] : 특정 커밋에 태그를 붙임
git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력
push까지 절차끝났다 틈틈히 배운것과 왜 이런 과정이 일어나야 하는지 정확하모르고, 그냥 순서에 맞게 사용한건데..
다 의미가 있고 어떻게 해야 살리고, 되돌아가고 하는지 알겠다! ㅎㅎㅎ
◼ Last
......
정신없이 썼다. 하루가 지났다.. 내일을 수업들어야지.. 오늘은 이만 하면 ... 나쁘지 않아