[깃] 기본 개념 및 명령어 정리
설정
이름 설정
git config --global user.name 이름
이메일 설정
git config --global user.email 이메일
.gitignore
파일 생성 (윈도우)
gitignore.txt
파일 생성ren gitignore.txt .gitignore
명령어 실행
트리
Git의 트리
- HEAD: 마지막 커밋 스냅샷, 다음 커밋의 부모 커밋
- 인덱스 (Index): 다음에 커밋할 스냅샷
- 워킹(작업) 디렉토리(Wokring Directory): 샌드박스 (Sandbox)
HEAD
- 현재 브랜치를 가리키는 포인터
- 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킴
- 지금의 HEAD가 가리키는 커밋은 바로 다음 커밋의 부모가 됨
- 즉, HEAD는 현재 브랜치의 마지막 커밋의 스냅샷
인덱스 (Index)
- 바로 다음에 커밋할 대상
- 스테이징 영역(Staging Area;
git commit
명령을 실행했을 때 Git이 처리할 대상 파일들이 있는 곳)에 있는 파일 - 인덱스는 워킹 디렉토리에서 마지막으로 체크아웃(Checkout) 한 브랜치의 파일 목록과 파일 내용으로 채워짐
- 이후 파일 변경 작업을 하고 변경한 내용으로 인덱스를 업데이트할 수 있으며 이렇게 인덱스를 업데이트하고
git commit
명령을 실행하면 인덱스는 새 커밋으로 변환됨
워킹(작업) 디렉토리
- 위의 두 트리는 파일과 그 내용을 효율적인 형태로
.git
디렉토리에 저장하지만, 사람이 알아보기 어려움 - 워킹 디렉토리는 실제 파일로 존재하며 바로 눈에 보이기 때문에 사용자가 편집하기 수월함
- 커밋하기 전에는 인덱스(스테이징 영역)에 올려놓고 얼마든지 변경할 수 있음
트리와 용어 정리
커밋
최초로 파일 추적
git add 파일명
- 파일의 상태 변화: Untracked -> Tracked, Staged, Unmodified
추적 중인 파일을 변경한 후 스테이징 영역에 파일 추가
git add 파일명
- 파일 변경 시 파일의 상태 변화: Tracked, Staged, Unmodified -> Tracked, Unstaged, Modified
- 명령어 실행 후 파일의 상태 변화: Tracked, Unstaged, Modified -> Tracked, Staged, Modified
git add
명령으로 최초로 파일을 추적한 후 파일을 수정했다면 커밋을 위해 다시git add
명령으로 Staged 상태로 만들어야 함- 파일을 수정하고
git add
명령으로 Staged 상태로 만든 후 다시 파일을 수정하면 첫 번째 수정 파일의 상태는 Staged, Modified이고 두 번째 수정 파일의 상태 Unstaged, Modified임 - 따라서 두 번째 수정 사항으로 파일을 커밋하기 위해서는 먼저
git add
명령어로 Unstaged 상태를 Staged 상태로 변경시켜야 함
- 파일을 수정하고
스테이징 영역에 추가된 파일 커밋
git commit 파일명
- 파일의 상태 변화: Tracked, Staged, Modified -> Tracked, Unstaged, Unmodified
변경된 모든 파일을 스테이징 영역에 추가 및 커밋
git commit -a
커밋 메시지를 작성(인라인 작성)하고 파일 커밋
git commit -m "메시지"
파일 상태 변경
워킹 디렉토리에서 파일 제거 (추적 중인 파일은 유지, 스테이징 영역에서는 파일 유지)
git rm 파일명
워킹 디렉토리에서 파일 제거 및 추적 중인 파일 제거 (스테이징 영역에서 파일 제거)
git rm -f 파일명
추적 중인 파일만 제거 (스테이징 영역에서만 파일 제거)
git rm --cached 파일명
파일명 변경
git rm 변경전파일명 변경후파일명
되돌리기
가장 최근의 커밋을 취소하고 변경 후 새로 커밋
git commit --amend
- 첫 번째 파일 커밋:
git commit 파일명1
- 두 번째 파일 추가:
git add 파일명2
- 첫 번째 파일 커밋을 취소하고 두 번째 파일을 포함하여 새로 커밋:
git commit --amend
- 같은 브랜치 상에 있는 최종 커밋을 취소하고 새로운 내용을 추가하거나 설명을 추가하여 커밋 가능
파일의 상태를 Unstaged로 변경
git reset HEAD 파일명
- 파일의 상태 변화: Staged -> Unstaged
이전 커밋 삭제 및 삭제 이력을 남김
git revert 커밋체크섬
- 이전에 작성한 커밋을 삭제하여 변경 사항 되돌림
- 해당 커밋의 변경 사항을 되돌리는 내용의 새로운 커밋을 만들어 삭제 내역을 모든 사람이 알 수 있게 함
이전 커밋 삭제 및 삭제 이력을 남기지 않음
git reset 커밋체크섬
- 해당 커밋 이후의 변경 사항을 모두 되돌림
git revert
와 달리 삭제한 커밋 내역을 남기지 않음
reset 되돌리기
이전 커밋 시점으로 파일 되돌리기
git reset 커밋체크섬
git revert
: 되돌리기 전의 커밋(변경 사항을 반영하는 커밋) + 되돌린 후의 커밋(변경 사항을 취소하는) 모두 이력으로 남게됨git reset
: 변경 사항을 반영하는 커밋은 삭제되고 변경 사항을 적용하기 전의 커밋만 남게됨git reset
명령은 현재 커밋인 HEAD의 위치, 인덱스, 워킹 디렉터리도 함께 되돌릴지를 선택하기 위한 모드를 지정할 수 있음
reset 되돌리기의 모드
-
soft
모드git reset --soft 커밋체크섬
- HEAD의 위치만 되돌림
- 인덱스와 워킹 디렉토리는 변경하지 않음
- 즉, 마지막 커밋 시점 이후 변경 사항은 그대로 유지하고 해당 파일(변경된 파일)은 인덱스(스테이징 영역)에 올라가 있음
-
mixed
모드 (기본값)git reset 커밋체크섬
- HEAD의 위치와 함께 인덱스의 상태를 되돌림
- 워킹 디렉토리는 변경하지 않음
- 즉, 마지막 커밋 시점 이후 변경 사항은 그대로 유지하되 해당 파일(변경된 파일)은 인덱스(스테이징 영역)에 올라가 있지 않음
- 해당 커밋 시점의 파일 내용과 현재 파일 내용에 차이가 존재하면 커밋을 위해 먼저
git add
명령으로 인덱스(스테이징 영역)에 올려야 함
-
hard
모드git reset --hard 커밋체크섬
- HEAD의 위치, 인덱스, 워킹 디렉토리를 모두 되돌림
- 즉, 마지막 커밋 시점 이후 변경 사항을 모두 폐기하고 해당 파일(변경된 파일)은 인덱스(스테이징 영역)에 올라가 있지 않음
- HEAD의 위치, 인덱스, 워킹 디렉토리를 모두 되돌림
reset 되돌리기 취소
soft reset 되돌리기 취소
git reset --soft ORIG_HEAD
hard reset 되돌리기 취소
git reset --hard ORIG_HEAD
ORIG_HEAD
:git reset
명령을 실행했을 때 삭제한 커밋 내역을 보관함- 해당 명령을 통해
git reset
명령으로 삭제한 커밋을 되돌릴 수 있음
checkout 되돌리기
파일의 상태를 변경 직전의 최종 커밋 시점으로 되돌림
git checkout -- 파일명
- 아직 커밋하지 않은 변경 내역을 취소
- 파일의 내용이 최종 커밋 시점으로 되돌아감
- 파일의 상태 변화: Modified → Unmodified
- HEAD의 위치, 인덱스, 워킹 디렉토리를 모두 되돌림
reset
의hard
모드와 동일
스테이징 영역에 추가된 모든 파일을 취소 (파일의 상태를 Unstaged로 변경)
git checkout .
브랜치
현재 브랜치 보기
git branch
모든 브랜치 보기
git branch -a
브랜치 생성
git branch 브랜치명
브랜치 생성 및 체크아웃
git checkout -b 브랜치명
현재 체크아웃한 브랜치에 병합하지 않은 브랜치 목록 확인
git branch --no-merged
특정 브랜치에 대한 병합 확인
git branch --no-meged 브랜치명
현재 체크아웃한 브랜치에 이미 병합된 브랜치 목록 확인
git branch --merged
특정 브랜치에 대한 병합 확인
git branch --merged 브랜치명
브랜치 삭제
git branch -d
브랜치 삭제 (강제)
git branch -D
원격 저장소 브랜치 삭제
git push origin --delete 브랜치명
현재 브랜치와 대상 브랜치의 차이점 출력
get diff 브랜치명
병합과 리베이스
- 병합과 리베이스 모두 한 브랜치의 변경 사항을 다른 브랜치에 적용하는 방법임
- 병합
- 변경 사항이 적용된 브랜치의 변경 사항을 현재 브랜치(체크아웃한 브랜치)에 반영
- 병합 이후에도 원본 브랜치의 이력을 삭제하지 않고 그대로 유지
- 두 브랜치의 마지막 커밋 결과를 서로 비교하여 결과물을 합치는 과정
- 변경 사항을 적용할 브랜치로 먼저 체크아웃한 후 변경 사항이 적용되어 있는 브랜치를 병합
- 병합은 두 브랜치를 연결하는 병합 커밋을 새로 생성함
- 특정 조건에서 병합 커밋을 생성하지 않을 수도 있음
- 리베이스
- 병합과 마찬가지로 변경 사항이 적용된 브랜치의 변경 사항을 현재 브랜치(체크아웃한 브랜치)에 반영
- 병합 커밋을 생성하는 대신 원본 브랜치에 각 커밋에 대해 새로운 커밋을 생성함으로써 변경 사항에 대한 기록을 다시 작성함
브랜치 병합
-
브랜치 체크아웃
git checkout 브랜치명
-
브랜치 병합
git merge 변경사항적용된브랜치명
브랜치 병합 (한 줄)
git merge 변경사항적용된브랜치 변경사항적용할브랜치
리베이스
-
브랜치 체크아웃
git checkout 브랜치명
-
브랜치 리베이스
git rebase 변경사항적용된브랜치명
명령형 리베이스
git rebase –i 변경사항적용된브랜치명
이력
상태 보기
git status
추적 무시된 파일 보기
git status --ignored
로그 보기
git log
git log -p
: 각 커밋에 적용된 실제 변경 내용을 보여줌git log --word-diff diff
: 명령의 실행 결과를 단어 단위로 보여줌git log --stat
: 각 커밋에서 수정된 파일의 통계 정보를 보여줌git log --name-only
: 커밋 정보 중에서 수정된 파일의 목록만 보여줌git log --relative-date
: 정확한 시간을 보여주는 것이 아니라 1일 전, 1주 전처럼 상대적인 시간을 비교하는 형식으로 보여줌git log --graph
: 브랜치 분기와 병합 내역을 아스키 그래프로 보여줌
원격 저장소
로컬 저장소를 원격 저장소와 연결
git remote add 저장소별칭 [https://github.com/사용자이름/원격저장소이름.git](https://github.com/%EC%82%AC%EC%9A%A9%EC%9E%90%EC%9D%B4%EB%A6%84/%EC%9B%90%EA%B2%A9%EC%A0%80%EC%9E%A5%EC%86%8C%EC%9D%B4%EB%A6%84.git)
로컬 저장소가 원격 저장소와 연결되었는지 확인
git remote –v
원격 저장소에 푸시할 로컬 저장소의 브랜치를 지정하여 푸시
git push 원격저장소별칭 로컬브랜치이름
원격 저장소의 master 브랜치에 푸시
git push origin master
로컬 저장소의 모든 브랜치를 푸쉬
git push origin --all
원격 저장소의 커밋 정보를 로컬 저장소에 가져옴 (병합을 하지는 않음)
git fetch
로컬 저장소의 master 브랜치에 원격 저장소의 origin/master 브랜치를 병합
git merge origin/master
깃 삭제
리눅스
rm -rf .git
윈도우
rmdir .git
rmdir /s .git
Comments