Git에서 활용되는 용어를 정리합니다.
서버에 구축된 저장소
각각의 개발자들이 본인 PC에 구축한 저장소
원격 저장소의 소스코드를 로컬 저장소에 복사하는 과정 서버 오류로 인한 데이터 손실 시, 로컬 저장소의 데이터로 복구 가능(현재 버전 뿐만 아니라 모든 히스토리를 복사해온다.)
PC에서 현재 작업중에 있는 디렉토리 개발자 작업시 프로젝트의 히스토리가 쌓이는 공간 Git에서 관리는 하지만, 추적은 하지 않음
작업 디렉토리 상의 변경점이 올라가는 임시 저장 영역 git에 의해 변경점 추적 관리되는 영역 커밋을 준비하고 검토 할 수 있는 중간 영역
커밋들이 영구적으로 저장되는 영역 원격저장소로 부터 복사(clone)한 커밋들이 존재하는 영역
Git에서 가장 의미있는 변경의 최소 단위
변경의 단위는 개발자마다 조직마다 모두 다르다.
“커밋하다”스테이징 영역의 변경점을 로컬 저장소로 저장하는 과정
원격저장소에 있는 다른 개발자의 커밋들을 받아온다.
로컬저장소에서 만든 커밋을 원격저장소로 업로드 한다.
git config --global user.name "Wookshin"
git config --global user.email "cotlsdnr1@gmail.com"
git config --global --list
vi ~/.gitconfig
상대방의 원격저장소(Github)를 나의 원격저장소(Github)에 복사한다.
Git의 핵심 폴더인 .git 폴더가 생성 master라는 기본 브랜치 생성
git remote add [저장소별칭] [저장소 주소]
git remote add origin https://gitlab.com/wookshin/myfirstproject.git
git remote
git remote -v
git remote rename [현재 저장소별칭] [변경할 저장소 별칭]
git status
git log
Git에 의해 관리되지 않은 파일 단 한번도 스테이징 영역(staging area)에 포함되지 않은 파일
Git에 의해 관리되는 파일 한 번 이상 스테이징 영역(staging area)에 포함된 적 있는 파일
git add TestService.java
작업 디렉토리의 변경점 중 커밋 예정인 파일들은 스테이징 영역에 추가합니다.
git commit
의미있는 변경 단위라고 판단되면, 로컬 저장소에 영구적으로 저장한다.
git log
commit : 커밋의 ID(SHA-1 hash 값을 키값으로 저장)
Author : 커밋 반영한 담당자 정보
Date : 커밋 반영 날짜와 시간
git show b076a
git show {commit id}
find .git/objects -type f
git cat-file -p [방금 생성한 커밋의 sha-1 hash값] #파일의 내용
git cat-file -t [방금 생성한 커밋의 sha-1 hash값] #파일의 타입
git cat-file -p [tree, sha-1 hash값] #파일의 내용
git cat-file -t [tree, sha-1 hash값] #파일의 타입
git cat-file -p [blob, sha-1 hash값] #파일의 내용
git cat-file -t [blob, sha-1 hash값] #파일의 타입
BLOB : 바이너리 데이터 자체만 저장된 BLOB 객체 (Binary Large Object)
git diff
작업 디렉토리에서 기존 코드 대비 변경점 확인
변경점이 적은 경우 쉽게 바로 파악이 가능하지만, 변경점이 많은 경우 변경점 파악이 어려움
git difftool
1) 외부 도구 설정 (예, Beyond Compare)
2) 설치 후 실행 파일 위치 확인
3) git config 를 통해 실행파일 path 등록
git config --global difftool.bc4.path 'C:\Program Files\Beyond Compare 4\BCompare.exe'
4) 기본 difftool로 bc4 설정
git config --global diff.tool bc4
Beyond Compare 설치 : https://www.scootersoftware.com/
git restore --staged MainService.java
잘못 staged 된 파일을 unstaged 로 변경하기
git log --help
명령어 뒤에 –help 옵션을 입력하면,
웹 브라우저를 통해 해당 명령어의 메뉴얼 페이지가 실행됩니다.
git commit --amend
마지막 반영한 최신 커밋 메시지를 변경하고 싶을 때,
최신 커밋 수정 가능한 에디터가 실행됩니다.
git에서는 원복의 단위가 커밋이다.
git revert ‘마지막에 반영한 commit ID’
git revert 9bb3a9f
git push [저장소 별칭] [브랜치]
git push origin master
git pull [저장소 별칭] [브랜치]
git pull origin master
방법1
방법2
git log --reverse
git log -p #코드의 변경점도 같이 보여준다
git log -p -2 #가장 최신 로그 2개를 보여준다
git log -u #-p와 동일하면 역할 (코드의 변경점도 보여준다)
git log -u 'commit ID' #특정 커밋의 로그를 보여준다
git log -1 #가장 최신 로그 1개를 보여준다
git log -2 # 가장 최신 로그 2개를 보여준다
git log --name-only #커밋대상 파일 리스트를 보여준다
git log --oneline #각 커밋 로그를 한줄로 보여준다
git show 'commit ID' #특정 커밋의 자세한 정보를 보여준다(diff 기능)
git log --author 'torvalds'
git log --since=2.weeks
git log --grep '...'
기본 브랜치로부터 파생한 독립적인 작업 공간입니다.
최신 커밋을 가리키는 일종의 포인터입니다.
매우 가볍습니다.
생성, 이동, 병합(merge)이 매우 쉽습니다.
git branch
첫 번째 커밋을 만들어야 브랜치가 생성된 커밋을 가리킬 수 있다.
현재 브랜치를 가리키는 일종의 포인터
현재 브랜치의 마지막 커밋에 대한 스냅샷
git branch feature-login #새로 생성할 브랜치명
git branch #현재 브랜치 확인
git log #브랜치가 어떤 커밋을 가르키고 있는지 확인
git checkout feature-login #브랜치 이동(HEAD 이동)
git branch #현재 브랜치 확인
git log #브랜치가 어떤 커밋을 가르키고 있는지 확인
HEAD는 checkout 대상 브랜치로 이동합니다.
로컬 저장소의 상태는 HEAD가 가리키는 마지막 커밋이 최신이 됩니다.
작업 디렉토리의 파일 상태도 변경됩니다.
git log --all --graph --oneline
git checkout -b issue
1) 기준이 되는 브랜치로 이동합니다. 햐
git checkout master #issue 브랜치 -> master 브랜치로 이동
2) 합쳐질 브랜치를 병합합니다.
git merge issue
브랜치의 위치만 최신 커밋으로 이동시키는 방식입니다.
기준 브랜치의 커밋(master)과 병합될 브랜치의 커밋(issue)이 일직선상에 있을 때 Fast-forward Merge가 발생합니다.
더 이상 사용되지 않는 브랜치는 삭제하기
git branch -d issue
아래 3개 커밋을 모두 고려하여 방합하는 방식으로 3-way Merge의 결과는 새로운 커밋으로 생성됩니다.
개발하는 기능의 목적에 맞게 어떤 변경사항을 어떻게 반영할지를 결정하고 수정하여 반영하는 것을 conflict을 해결하는 과정이라 한다.
1) 직접 merge를 합니다.
vi MainService.java
2) mergetool을 사용합니다.
git mergetool
다른 브랜치의 커밋을 선택적으로 가져와 현재 브랜치에 적용 시킬 때 사용합니다.
git cherry-pick 9bb3a9f #git cherry-pick {commit id}
태그는 특정 시점의 소스코드 정보를 기록합니다. 프로젝트 진행 중 의미있는 시점의 커밋을 태깅한 것입니다.
의미있는 시점이란,
1) Lightweight 태그
git tag v1.0 #git tag [태그명]
2) Annotated 태그
git tag -a v1.0 -m "Implemented login feature" #git tag -a [태그명] -m [태그 메시지]
git tag -a v1.0 -m "Implemented login feature"
git log
git show v1.0
1) 태깅하고자 하는 커밋의 ID 값을 확인한다.
2) 커밋 ID 값을 인자로 태깅한다.
3) 태그 정보를 확인한다.
git log --oneline
git tag -a v0.1 [커밋ID] -m "fix issue number-1"
git log --oneline
git show v0.1
작업 도중 브랜치를 전환할 때 git stash를 이용하여 작업 디렉토리 내 unstaged 파일들을 백업 후 전환합니다.
git stash save
git stash list
*WIP : Work In Progress
git stash apply
git stash drop
base의 위치를 바꿔 머지하는 방식입니다.
git branch -a
git checkout -t origin/test #-t는 tracking을 의미
1) rebase 할 대상 브랜치에서 git rebase 명령어를 사용합니다.
git rebase master #master의 최신 커밋이 base가 되어 test 커밋들이 뒤에 붙습니다.
2) master 브랜치로 전환 후 최종 merge합니다.
git checkout master
git merge test
https://nvie.com/posts/a-successful-git-branching-model