Git 명령어
git working flow - 작업 흐름
로컬 저장소는 git이 관리하는 세 그루의 나무로 구성되어 있다.
작업 디렉토리(Working directory): 로컬(실제) 파일
인덱스(Index): 준비 영역(staging area)의 역할
나무인 HEAD: 최종 확정본(commit)
자주쓰는 git 명령어
git init
이 과정은 처음 한 번만 진행되며 git init후에는 .git폴더가 생성되어 git이 내부적으로 버전 관리를 해줌.
git 저장소가 생기고 HEAD는 아직 없는 브랜치를 가리킨다.
git add <’filename’>
어떤 파일을 git에 추가 할 것인가를 지정해준다.
파일 이름을 직접적으로 사용해도 되고, 모든 파일을 추가하고 싶다면 git add .
을 입력하면 된다.
- .gitignore
git에 특정 파일이 올라가는 것을 막고싶다면 .gitignore 폴더 생성후 무시하고 싶은 파일을 추가하면 해당 파일들은 제거해서 git에 추가해준다.
git commit
git commit -m "commit message"
git에서 커밋은 변경사항을 내 컴퓨터에 저장한다는 의미이다.
위 명령어를 실행하면 이제 작업흐름상에 변경된 파일이 HEAD에 반영될 것이다. 하지만, 원격 저장소에는 아직 반영이 되지는 않은 상태이다.
Tip) git add와 commit 한번에 쓰는법
>git commit -am "commit message"
git status
파일의 상태를 확인하려면 git status 명령을 사용한다.
git add 명령어로 추가한 파일 및 수정한 파일을 확인할 수 있다.
위의 그림에서는 세 트리가 모두 같기 때문에 git status
명령을 실행하면 아무런 변경 사항이 없다고 나온다.
Untracked 와 Tracked
Tracked 파일은 이미 스냅샷에 포함돼 있던 파일이고, Tracked 파일은 또 Unmodified(수정하지 않음)와 Modified(수정함) 그리고 Staged(커밋하면 저장소에 기록되는) 상태 중 하나이다.Unstaged 상태의 파일은 커밋되지 않는다.
git reset
commit을 되돌리는 명령어이다.
git reset <option> HEAD~<되돌리고 싶은 만큼>
옵션에 따른 reset 동작
–soft
- HEAD가 가리키는 브랜치를 옮긴다.
–mixed(default option)
HEAD가 가리키는 브랜치를 옮긴다.
Index를 HEAD가 가리키는 상태로 만든다.
–hard
HEAD가 가리키는 브랜치를 옮긴다.
Index를 HEAD가 가리키는 상태로 만든다.
워킹 디렉토리를 Index의 상태로 만든다.
git remote
외부의 깃헙 저장소가 있는 url에 대한 name을 만들어 관리하기 위한 명령어
github에서 repository 생성하면 url도 같이 생성
git remote add <name> <url>
- 원격 서버 주소(url)을 name으로 추가
git remote get-url origin
- name을 origin이라 설정한 것의 url을 가져오겠다.
git remote -v
- 연결된 원격 저장소를 확인
git push
push는 마지막으로 커밋한 사항을 git repository 에 올리겠다는 뜻이다.
push가 안되면 원격 서버에 변경사항이 저장되지 않는다. 다시말해, 프로젝트를 공유하고 싶을 때 리모트 저장소에 Push할 수 있다.
이 명령은 git push [리모트 저장소 이름] [브랜치 이름]
으로 단순하다.
commit 까지만 실행했다면 현재의 변경 내용은 아직 로컬 저장소의 HEAD 안에 머물고 있을 것이다.
이제 이 변경 내용을 원격 서버로 올리기 위해 git push - u origin master
명령을 실행한다.
git pull
원격 저장소의 갱신된 내용을 추가로 내려받는 작업이다.
로컬 저장소보다 최신인 갱신된 원격 저장소의 커밋 정보를 현재 로컬 저장소로 내려받는다.
pull 명령어를 주기적으로 사용하면 최신 커밋 정보로 로컬 저장소를 유지할 수 있다.
git pull [리모트 저장소 이름] [브랜치 이름]
명령어로 원격 저장소의 갱신된 내용을 내려받을 수 있다.
git merge, git rebase
한 브랜치에서 다른 브랜치로 합치는 방법은 merge와 rebase가 있다.
위의 commit 이력을 가졌다고 가정하고 merge와 rebase의 동작 원리와 차이점에 대해 설명하고자 한다.
git branch에 대한 내용은 Git branch게시글을 통해 확인할 수 있습니다.
방법 1) merge
다른 브랜치를 현재 Checkout된 브랜치에 Merge 하는 명령
git merge 노란색 branch
ex) 다른 branch에서 같은 줄을 고치고 합칠 경우
초록색 branch(master) | 노란색 branch |
---|---|
const a = 10; | const a = 20; |
변경 후 각자 commit
초록색 branch(master)에서 노란색 branch를 merge
같은 부분을 수정했기때문에 충돌(conflict) 발생
초록색 branch(master) or 노란색 branch or 둘다 합침
git add .
git merge –continue
방법 2) rebase
다른 브랜치를 현재 Checkout된 브랜치에 rebase 하는 명령
git rebase 노란색 branch
어떤 특정 브랜치를 base로 커밋 이력을 재정렬하겠다는 명령어
- base: 브런치가 생성될 때 기준점
재정렬되는 commit 이력이기 때문에, 재정렬되는 commit 이력에는 이전과는 다른 새로운 해쉬 ID가 부여
git cherry-pick
특정 commit을 가져올 때 사용
branchA: 중요한 commit
branckB: 별로 안 중요한 commit
master에서 branchA의 중요한 commit만을 가져오고 싶을 때, git cherry-pick <원하는 커밋 id>
Tip) Commit에 tag 설정
매번 커밋 id찾기 번거롭다 -> tag사용 (git tag)
중요한 기점이 되는 commit에 tag를 달아 접근하기 편하게 함.
git stash
임시 저장
상황1) branchA에서 작업하는 중에 branchB로 갔다오고 싶음
git checkout branckB => branchA의 변경 사항을 commit하던지, git stash하라고 나옴
git stash하고 branchB에 감 => 다시 branchA로 돌아옴 => git stash apply => 기존 작업 하던 것 보여줌.
상황2) branch 착각하고 잘 못 썼을때
branchA의 stash 한 것을 branchB에서 불러올 수 있음.(B로가서 git stash apply)
git fetch
마지막 pull 이후 원격 저장소 또는 브랜치에 적용된 변경 사항을 확인할 수 있다.
git pull을 하면 로컬까지 바뀌어 버리니까 fetch를 통해 원격이랑 로컬이랑 비교 할 수 있음.
push: fetch + merge
📑 참고 자료