Git 명령어 정리

git init

현재 폴더에 git을 등록한다.


git clone {PATH}

PATH의 깃 원격 저장소에 있는 내용들을 모두 가져온다.
git clone은 다음과 같은 명령어들로 원격 저장소의 내용을 가져온다.

1. 저장소 폴더 생성
2. 저장소 폴더 내에서 git init
3. git remote add origin {PATH}
4. git fetch
5. git checkout {최종 커밋}


git branch [-l], git branch -v, git branch -r, git branch -a

-l 옵션은 생략이 가능하며, 로컬 브랜치들의 목록을 보여준다.
-v 옵션은 로컬 브랜치들의 목록을 마지막 커밋 내용과 함께 보여준다.
-r 옵션은 원격 브랜치들의 목록을 보여준다.
-a 옵션은 원격/로컬 브랜치들의 목록을 모두 보여준다.

git branch {이름}, git branch {생성 브랜치} {기준 브랜치}

새로운 브랜치를 생성한다.(단, 생성만 하고 이동은 하지 않는다)
branch 명령어의 인자로 이름을 두 개 주면 뒤 브랜치를 기준으로 새로운 브랜치를 생성한다.(마찬가지로 새로운 브랜치로의 이동은 하지 않는다)

git branch (-merged | -no-merged)

-merged 옵션은 이미 merge 된 브랜치들, -no-merged 옵션은 아직 merge 되지 않은 브랜치들을 보여준다.(*이 붙지 않은 브랜치들은 이미 merge되었기 때문에 삭제가 가능하다)

git branch -d (이름)

해당 브랜치를 삭제한다.(*이 붙어 있으면 삭제가 불가능하다)

git branch -m (기존 이름 A) (바꿀 이름 B)

브랜치 A를 브랜치 B로 변경한다.(-M 옵션을 사용할 경우 동일한 이름의 브랜치도 덮어 쓴다)


git add {파일 이름}, git add . , git add -u, git add -A, git add --all

파일 이름만 적게 되면 해당 파일만 스테이징한다.
. 옵션을 주면 변화된 파일, 추가된 파일을 스테이징한다.(삭제된 파일은 x)
-u 옵션을 주면 변화된 파일, 삭제된 파일을 스테이징한다.(추가된 파일은 x)
-A, --all 옵션을 주면 현재 추적 중인 모든 변화된 파일을 스테이징한다.(삭제, 추가, 변화 o)

git add -i, git add --interactive

원하는 파일만을 고를 수 있게 대화형 프로그램이 시작된다.

git add -p

원하는 라인만 스테이징할 수 있도록 변경된 라인을 한 줄씩 보여준다.
s(split) : 변경 단위를 더 세밀하게 쪼갠다.
n(no) : 해당 변경 사항을 스테이징하지 않는다.
y(yes) : 해당 변경 사항을 스테이징한다.
e(edit) : 스테이징할 라인을 직접 편집할 수 있다.


git remote, git remote -v

등록된 원격 저장소의 이름만 보여준다.
-v 옵션을 주면 등록된 원격 저장소의 이름과 URL을 보여준다.

git remote add {리모트 이름} {PATH}

해당 PATH의 원격 저장소를 {리모트 이름}으로 등록한다.

git remote show {리모트 이름}

해당 리모트의 모든 브랜치와 정보를 보여준다.

git remote rm {리모트 이름}

해당 리모트를 제거한다.

git remote update

모든 리모트의 정보를 업데이트한다.(새로운 원격 브랜치가 갱신된다)

git remote prune {리모트 이름}

리모트 브랜치 정보와 로컬 브랜치 정보를 비교해 로컬 브랜치를 갱신한다.


git status

현재 브랜치, 파일들의 상태 등 전반적인 상태를 보여준다.

git status -s, git status --short

파일의 상태를 문자로 보여준다.

<??> {파일 이름} : 해당 파일이 git 디렉토리에 추가되었지만 추적중이지 않은 상태
<A > {파일 이름} : 새로운 파일이 추가된 후 Staged 된 상태, 이전 상태가 없으므로 Modified                         여부를 알 수 없다.
< M> {파일 이름} : 추적중이던 파일이 수정되었지만 Staged 되지 않은 상태
<M > {파일 이름} : 추적중이던 파일을 수정하고, Staged 한 상태
<MM> {파일 이름} : 첫 번째 수정 내역은 Staged 되었지만 두 번째 수정 내역은 아닌 상태, 이 때 Commit 을 하면 두 번째 수정 내역은 여전히 남아 < M> 상태가 된다.


git commit, git commit -m {커밋 메세지}, git commit -am {커밋 메세지}

옵션을 주지 않으면 커밋 에디터가 열리고, 변경 내용을 텍스트로 저장하면 커밋이 생성된다.
-m 옵션을 주면 커밋 에디터 없이 메세지 등록이 가능하다.
-am 옵션을 주면 스테이징, 커밋이 동시에 실행된다.

git commit --amend -m {커밋 메세지}, git commit --amend --no-edit

이전 커밋 내용에 빠뜨린 내용이 있을 경우 사용한다.
새롭게 Staged 된 내용을 바로 이전 커밋에 추가하고, 옵션에 따라 커밋 메세지를 바꿀 수도 있다. 단, amend 는 로컬에서만 사용하는게 좋다.

git commit -v

현재 스테이징된 내용을 자세히 보여준다.


git checkout {브랜치 이름}, git checkout -b {브랜치 이름}, git checkout -t {원격 브랜치}

해당 브랜치로 헤드를 옮긴다.
-b 옵션을 주면 새로운 브랜치를 만들고 그 브랜치로 헤드를 옮긴다.
-t 옵션을 주고 원격 브랜치 이름을 입력하면 원격 브랜치 이름 그대로 로컬 브랜치가 생성되고 그 브랜치로 헤드를 옮긴다.

git merge {합칠  브랜치 이름}

현재 헤드의 브랜치와 대상 브랜치를 merge 한다.

git merge -Xignore-space-change {합칠 브랜치 이름}, git merge -Xignore-all-space {합칠 브랜치 이름}

단순히 공백의 변화(스페이스 -> 탭 or 탭 -> 스페이스)만으로 충돌이 발생했을 때 쓸 수 있다. 공백의 변화를 무시하고 merge를 진행한다.

git merge --abort

현재 merge를 취소한다. merge 전에 워킹 디렉토리에서 stash나 커밋하지 않은 파일(저장되지 않은 파일)이 있다면 취소되지 않는다.(무시하고 되돌리고 싶다면 git reset --hard HEAD를 이용하자)

git merge -Xours {브랜치 이름}, git merge -Xtheirs {브랜치 이름}

대상 브랜치와 merge를 할 때, 충돌이 발생하면 충돌을 무시하고 무조건 현재 브랜치(ours)나 대상 브랜치(theirs)의 내용으로 merge한다.

+ git rebase : merge와 같이 두 브랜치를 병합할 때 사용된다. rebase는 병합 과정이 마치 하나의 브랜치에서 된 것처럼 히스토리를 보여주게 된다.

git revert {돌아갈 커밋 명}, git revert {시작 커밋}.. {끝 커밋}

해당 커밋 혹은 커밋들로 돌아간다. 커밋 내용이 사라지지 않으며, revert한 내역까지 commit log에 남게 된다.

revert는 커밋 내역이 사라지지 않아 이미 원격 저장소에 push한 뒤 커밋을 되돌려도 충돌이 나지 않는다.

git reset --hard {돌아갈 커밋 명}

해당 커밋 이후의 모든 변경된 내용을 지우고 돌아간다.(이후의 파일, 스테이징 변경 내역이 모두 사라진다)

git reset --soft {돌아갈 커밋 명}

해당 커밋으로 돌아갔지만, 이후의 스테이징 내용이 남아있어 다시 커밋할 지를 선택할 수 있다.

git reset {돌아갈 커밋 명}git reset --mixed {돌아갈 커밋 명}

해당 커밋으로 돌아갔지만, 변경된 파일 내역은 남아있어 다시 스테이징할 수 있다.

※ 커밋 명은 커밋 해쉬 값(절대 경로)이나 상대 거리로 정할 수 있다.
ex) git reset HEAD~2  --> 현재 헤드로부터 2번째 전 커밋으로 이동한다.

HEAD^ VS HEAD~

^n : n번째 부모를 가르킨다.(^ == 1)
ex) HEAD^1 == 헤드의 첫 번째 부모
~n : 현재 노드에서 첫 번째 부모만을 따라갈 때 n번째 조상
ex) HEAD~2 == 헤드의 두 번째 조상

reset은 커밋 이력이 모두 사라지기 때문에 로컬에서만 사용하기 좋다.

git log, git log -p -n

옵션을 주지 않으면 모든 커밋 히스토리를 시간 순으로 보여준다.
-p 옵션을 주면 커밋들의 diff 정보를 보여준다.
-n 옵션을 주면 최근 n개의 히스토리를 보여준다.

git diff {로컬 브랜치} {로컬 브랜치}, git diff {로컬 브랜치} {원격 브랜치}, git diff {커밋 명} {커밋 명}, git diff {커밋 or 브랜치} {Pull Request 브랜치}

위와 같이 여러 조합으로 사용할 수 있으며, 서로의 차이를 보여준다.

git diff [커밋 명], git diff --staged [커밋 명]

옵션을 주지 않으면 해당 커밋과 현재 unstaged된 수정 사항과의 차이를 보여준다.(default는 마지막 커밋 기준)
--staged 옵션을 주면 해당 커밋과 staged된 수정 사항과의 차이를 보여준다.

git fetch [원격 저장소]

원격 저장소의 최신 내역들을 불러오지만 합치지는 않는다.(원격 저장소 내역만으로 새로운 커밋을 만든다 -> 후에 내 워킹 디렉토리와 merge 해야함)

git fetch --prune

원격 저장소에서 지워진 로컬 브랜치들을 자동으로 삭제해 준다.

git pull [원격 저장소], git pull --rebase [원격지]

원격 저장소의 최신 내역들을 볼러와 merge까지 수행한다.(즉, fetch + merge)
--rebase 옵션을 주면 합칠 때 merge 대신 rebase로 수행한다.

git push {원격 저장소} {원격 브랜치}

해당 원격 브랜치로 로컬 저장소의 최신 커밋 내역을 업로드한다.

git push -u {원격 저장소} {로컬 브랜치}, git push --set-upstream {원격 저장소} {로컬 브랜치}

브랜치를 추적해서 이후에 git push 명령어만 입력해도 원격 저장소로 push가 가능해진다.

git push --delete {원격 브랜치}

원격 저장소의 해당 브랜치를 삭제한다.

git cherry-pick {커밋 명}, git cherry-pick {시작 커밋 명} {끝 커밋 명}

특정 커밋이나 커밋들을 현재 브랜치에 복사한다.

댓글

이 블로그의 인기 게시물

HTML - input file 버튼 꾸미기

HTML - 이미지 미리보기(jQuery 없이)

BOJ - DNA 유사도(2612)