본 문서에서는 Git을 사용하기 위한 주요 명령들에 대해 다룬다. 각 명령어에 대한 상세한 옵션과 설명은 -help
(콘솔) 또는 --help
(브라우저) 옵션을 사용하여 확인할 수 있다.
최종 수정일 : 2022.12.30
git config
git init
git add
git commit
git status
git log
git ls-files
git branch
git checkout
git merge
git clone
git remote
git push
git fetch
git pull
git config --list
git config [--global] [--unset] user.name username
git config [--global] [--unset] user.email useremail
git config [--global] [--unset] init.defaultBranch branchname
git을 설치하면 제일 먼저 환경설정을 해주어야 한다.
gitconfig에서 일반적으로 설정해주어야 할 항목은 다음과 같다.
user.name
user.email
defaultBranch
gitconfig 파일은 ~/.gitconfig에 저장되어 있다.
git init
git add objectname
git rm [option1] objectname
git commit [option1]
git status
git log [option1]
git ls-files
git init을 실행하면 해당 저장소에 새로 .git
디렉터리가 생성되고, 디렉터리 내에 다음과 다음과 같은 오브젝트가 생성된다
HEAD
config
description
hooks/
info/
objects/
refs/
이렇게 새로 생성된 .git
디렉터리 안에는 해당 저장소에서 git이 관리하고 있는 정보가 모두 담겨있다.
즉, git init을 통해 저장소의 기록되지 않던 모든 변화들이 git에 의해 추적되기 위한 준비를 마치게 된다.
objectname 부분에는 현재 디렉터리(.), 특정 파일, 특정 폴더등이 들어갈 수 있으며, add 명령을 통해 추가된 오브젝트들은 git에 의해 추적이 시작된다.
rm 명령을 통해 삭제된 오브젝트들은 git에 의해 추적되지 않는다.
[option1]
--cached : Staging Area(add 를 하고나서의 영역)에서 파일을 제거하고 working directory(Local)에서는 파일을 유지한다.
-r : 재귀적(recursive)으로 해당 명령을 적용한다.
git은 추적하고 있는 파일들의 변경사항들을 추적하지만, 우리가 확언을 해주기 전에는 이러한 변화들이 확정적인지, 원하던 변경인지에 대해 판단하지 않는다. 따라서 우리는 일정한 시점에 우리가 원하는 만큼의 변화가 일어났으며, 이것을 하나의 완성된 상태로 표현하겠다는 '확정작업'을 필요로 한다. commit 명령을 통해 이러한 작업을 하게 되며, .git
디렉터리는 이러한 커밋 이력을 기록한다.
[option1]
-a : 변경된 파일 모두를 커밋한다.
--amend : 마지막 커밋과 커밋하지 않은 상태에 있는 변경 내역이 합쳐진, 최종 커밋을 대체하는 새로운 커밋을 만든다. 변경내역을 만들지 않는 경우 커밋 메시지만 변경한다.
Changes to be comitted:
unmodified.txt
Changes not staged for commit:
modified.txt
Untracked files:
untracked.txt
status
는 다음과 같은 세 가지 상태로 git 디렉터리 내의 객체들에 대한 상태를 보고한다.
unmodified
: git에 의해 추적되고 있으며, git의 관리 내용과 실제 객체가 일치한다.
modified
: git에 의해 추적되고 있으며, git의 관리 내용이 실제 객체와 다르다.
untracked
: git에 의해 추적되지 않고 있다.
git log [option1]
[option1]
-p : 각 커밋에 적용된 실제 변경 내용을 보여준다.
--stat : 각 커밋에서 수정된 파일의 통계 정보를 보여준다.
--name-only : 커밋 정보 중에서 수정된 파일의 목록만 보여준다.
--relative-date : 정확한 시간을 보여주는 것이 아니라 1일 전, 1주 전처럼 상대적인 시간형식으로 보여준다.
--graph : 브랜치 분기와 병합 내역을 아스키 그래프로 보여준다.
-num : 최근 num개의 로그를 보여준다.
git에서 관리중인 객체들의 리스트를 나열한다.
git branch [option] [branchname]
git checkout branchname
git merge branchname
git branch
는 git에서 추적하고 있는 모든 파일의 상태를 기록한 스냅샷이다. 옵션 없이 사용할 경우 로컬 브랜치를 목록을 보여준다.
[-r]
원격 브랜치 목록을 보여준다.
[-a]
모든 브랜치 목록을 보여준다.
[branchname]
branchname 브랜치를 생성한다.
git checkout
은 해당 브랜치의 스냅샷 상태를 현재 작업위치로 불러온다.
git merge
는 'branchname' 브랜치를 '현재 작업중인' 브랜치에 병합한다.
기본적으로는 특정영역을 수정하기 위해 파생한 브랜치와 메인 브랜치는 특정영역에 대해서 선후관계가 명확하므로 충돌(conflict)이 발생하지 않는다. 그러나 양쪽 파일 모두가 변경된 경우, 어느 파일이 기준이 되어야 하는지 명확하지 않은데, 이 때는 충돌이 발생한다. 충돌상황에서는 다음과 같이 충돌 내용을 확인할 수 있다.
<<<<<<< HEAD (Current Change) print("Code from Test Branch1") ======= print("Code from Test Branch2") >>>>>> test2 (Incoming Change)
이러한 부분을 수동으로 해결해준 뒤 다시 merge
가 호출되면 현재 브랜치에 두 브랜치가 병합된다.
git remote add aliasname githubURL.git
git remote remove aliasname
git remote rename originalName newName
git remote -v
별칭으로 관리할 연결된 원격 저장소 역시 깃 디렉터리로 초기화 된 폴더마다 .git
에서 관리한다. 따라서 디렉터리마다 다른 원격 저장소를 갖는다.
git clone githubURL
git fetch
git pull
clone
원격 저장소에 있는 객체들을 현재 디렉터리에 그대로 복사해오며, 이 파일들에 대해 git은 별도의 처리를 수행하지 않아 untracked 상태가 된다.
fetch
원격저장소의 브랜치로 변경된 사항을 가져온다. 가져온 원격 저장소의 브랜치를 현재 브랜치와 merge하여 통일성을 가지도록 할 수 있다. 이 때 로컬 저장소와 충돌이 있는 경우 git diff
명령을 사용하여 확인할 수 있다.
pull
pull 명령을 사용할 경우 fetch와 merge를 동시에 진행한다. 만약 어떠한 수정사항이 있는지 알아야 할 경우 pull보다는 fetch를 사용하는 것이 좋다.
merge
, pull
사용 시 다음과 같은 옵션를 사용하여 무시할 수 있다.git push
사용 시 기본적으로 main 브랜치에 업로드한다. 다른 작업자가 원격 저장소를 먼저 변경한 경우 push를 허용하지 않는다.
git push [remote] +[branch]
강제로 원격 저장소에 로컬 저장소의 내용을 덮어쓴다. 이러한 기능은 가급적 사용하지 않도록 한다.