Git 주요 명령어 정리

Posted by 나에요임마
2017. 12. 6. 00:42 Program/GitHub

놀이터흙이제맛 2013.08.09 15:01

관련 문서

목차

add

staging / do track

작업폴더의 파일을 깃이 추적하게 하거나 커밋을 위한 준비상태로 만듦.

git add *
git add .
git add *.java
git add README.TXT

모든 추적 및 추적되지 않는 파일의 변경 내용을 추가

git add -A
git add --all
# git rm을 쓰지 않고 직접 삭제한 파일도 모두 스테이징할 때 쓰면 유용하다.

Git 대화 모드로 파일 staging

git add -i

branch

브랜치 생성

git branch mybranch

다른 시점의 스냅샷에 브랜치 생성

"checkout으로 포인터 이동 후 브랜치 생성"의 단축형. 여기서 위치는 다른브랜치나 커밋체크섬 혹은 태그가 될 수 있다.

git branch 브랜치명 위치

브랜치 확인

git branch
git branch -r   # 리모트 브랜치 목록 보기
git branch -a   # 지역과 리모트 브랜치 모두 보기
git branch -v   # 마지막 커밋 메세지도 함께 출력한다.

merge 여부 확인

merged 상태인 브랜치만 표시하거나 그렇지 않은 브랜치만 표시한다.

git branch --merged
git branch --no-merged

기존 브랜치를 다른 브랜치에 덮어쓰기

새로 브랜치를 생성하거나 기존 브랜치에 현재 브랜치의 데이터를 덮어쓴다.

git branch -f 대상브랜치 [위치]

브랜치 이름변경

git branch -m NAME_FROM NAME_TO

브랜치 삭제

git branch -d mybranch
git branch -D mybranch # 브랜치 강제삭제(보통 non-merged 브랜치를 삭제할 때 사용)

blame

바보같은커밋을비난하기위한명령어 blame은 데이터의 각 줄을 누가 언제 마지막으로 고쳤는지 확인할 수 있으며 디버깅용도로 사용된다.

파일 커밋 정보 줄 단위로 보기

git blame 파일

특정 라인만 보기

git blame -L 시작라인,종료라인 파일

git blame -L 12,22 simplegit.rb

파일의 줄 단위의 복사, 붙여넣기, 이동 정보 보기

git blame -M 파일

파일의 줄 단위의 이동과 원본 파일 정보 보기

git blame -C -C 파일

checkout

브랜치(혹은 HEAD) 이동

다른 커밋으로 이동함을 의미한다. 워킹 디렉토리는 이동한 브랜치의 데이터와 같아진다.

git checkout master
# 만약 master라는 브랜치가 로컬에 존재하지 않고 원격저장소에만 저장한다면 원격의 데이터를 checkout한다.

다른 커밋 이력으로 HEAD 이동

깃이 만든 히스토리의 특정 시점을 명시해서 그 시점의 스냅샷으로 되돌리는 것을 의미한다. 브랜치를 만들지 않고 체크섬이나 태그로 HEAD(포인터)를 이동할 수 있다. 현 작업폴더와 지정한 커밋 이력의 데이터가 같아진다.

이전 커밋으로 이동하면 해당 시점을 포함한 이전 이력만 조회할 수 있는 문제가 있다. 예를 들어 최초의 체크섬으로 이동했다고 가정했을때 이동 한 뒤에는 - log로 조회했을때 - 단 하나의 커밋 이력만 보인다. 하지만 태그를 달아뒀다면 어느 시점이던 상관없이 모두 보인다. 

checkout 으로 특정 체크섬 혹은 이나 태그로 이동했을 때 깃은 이것을 "분리된 HEAD 상태(detached HEAD)"라고 하며 이 상태에서 바로 작업하는 것보다 브랜치를 생성하여 작업할 것을 권장하고 있다.

git checkout 체크섬

git checkout 태그

git checkout 6f9021d4a03586a787ebcef2f94dd2eca1aec941
git checkout v0.3.1.5

브랜치를 새로 만들고 HEAD 이동

git checkout -b 브랜치

Modified 되돌리기

워킹 디렉토리의 파일을 로컬 저장소의 내용대로 복원

git checkout -- .   # 현재 경로의 모든 파일 되돌리기
git checkout HEAD .    # 현재 경로의 모든 파일 되돌리기

fetch 시점으로 HEAD 이동

git fetch 명령을 사용했을때 "FETCH_HEAD"라는 포인터에 스냅샷이 저장된다. 해당 스냅샷을 확인 후 원하는 브랜치로 이동해 머지한다.

git checkout FETCH_HEAD

git checkout 리모트저장소/리모트브랜치

fetch로 받아온 스냅샷을 머지하지 않고 새 브랜치로 생성

git checkout -b FETCH_HEAD

git checkout -b 생성할브랜치 리모트저장소/리모트브랜치

git checkout -b hotFix anotherServer/master   # 이 명령은 해당 브랜치를 트래킹 브랜치로 만든다.

원격 저장소의 추적(tracking)중인 브랜치 바꾸기

git-scm의 메뉴얼에서는 서버가 특정 브랜치를 추적하게 해서 pull, push를 서버/브랜치 명시 없이 쓸 수 있게 한다는데 직접 해보면 에러가 뜨면서 잘 안된다. 어떤 상황에 사용하는건지 설명이 부족함. 몇 번 헤딩해본 결과 서버에 한개 이상의 브랜치가 존재할 때, clone으로 받아오면 로컬에는 master 브랜치밖에 없다. 이때 checkout -b 로 브랜치를 생성하되 원격 저장소가 생성하는 브랜치를 추적하게 한다.

git checkout -b 로컬브랜치 리모트저장소/리모트브랜치

git checkout --track 리모트저장소/리모트브랜치   # 1.6.2 이상

git checkout --track origin/serverfix

Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch 'serverfix'

cherry-pick

cherry-pick은 커밋하나만 rebase 하는 것이다. 다음 페이지에서 자세한 사항을 확인할 수 있다.

Git 프로젝트 운영하기

선택 병합

git cherry-pick 커밋명

커밋하지 않고 선택 병합

git cherry-pick -n 커밋명

clone

저장소 복제

현재 디렉토리의 하위에 깃저장소를 만들고 명시된 원격 저장소의 데이터를 모두 받아온다. 디렉토리명을 명시하지 않으면 원격 저장소의 디렉토리명과 동일하게 만들어진다.

git clone ~/Documents/workspace/ex/cal/src
git clone file://c:/users/noritersand/noriterGit/localServer localGitRepo
git clone https://noritersand@dev.naver.com/git/lernforscm.git naverGitRepo
git clone git://github.com/schacon/grit.git gitHubRepo

bare repository: 깃저장소를 bare 저장소로 복제 

git clone --bare 저장소주소 [디렉토리]

복제 시 데이터 제한하기

git clone --depth 200 ~/Documents/work/   # 마지막 200개의 커밋만 복제한다.

commit

커밋

변경내용을 확정함. 워킹 디렉토리나 스테이징 에어리어에만 있는 파일을 깃저장소에 확정 저장한다.

git commit

에디터 없이 커밋

vim등의 에디터를 실행하지 않고 메세지를 즉시 입력한다.

git commit -m "hello this is test commit"

Signed-off-by 추가

커밋 메시지에 Signed-off-by를 추가한다. -s 혹은 --signoff 옵션을 사용하면 커밋 메시지에 작성자가 자동으로 추가된다.

git commit -s -m 'commit message test'
[master 1204311] commit message test
 1 file changed, 1 insertion(+)

git log -1 HEAD
commit 1204311e62660b46c375c6e4d9a61a48a9adeb1d
Author: noritersand <who@where.com>
Date:   Thu Nov 17 10:07:35 2016 +0900

    commit message test

    Signed-off-by: noritersand <who@where.com>

자동 스테이징(staging)

워킹 디렉토리의 변경한 파일을 스테이징 없이 커밋한다. 단, 추적중인 파일만 가능

git commit -a -m "auto staging"

마지막 커밋 수정

커밋 직후 사용하면 코멘트만 수정한다. 파일을 스테이징 했다면 새로 커밋 이력을 추가하지 않고 이전 커밋에 덮어쓴다. 

git commit --amend
git commit -m 'initial commit'
git add forgotten_file
git commit --amend # forgotten_file이 마지막 커밋에 추가된다.

마지막 커밋 수정하고 커밋 메세지 재사용

git commit -C HEAD --amend

config

config 는 --global 옵션을 빼고 사용할 때 각 저장소마다 각각의 설정정보를 저장한다.

작업자의 이름/이메일 설정

git config --global user.name "이름"
git config --global user.email "이메일"

기본 편집기 설정

git config --global core.editor 편집기

Diff 도구 설정

git config --global merge.tool vimdiff

설정 확인

git config --list
git config -l
git config --global --list
git config core.editor

단축어(alias) 만들기

git config --global alias.사용할키워드 '명령어'

git config --global alias.unstage 'reset HEAD --'
git config --global alias.visual '!gitk'
git config --global alias.ss 'status'

단축어 목록 보기

git config --get-regexp alias
git config --list | grep alias

단축어 삭제

git config --global --unset alias.ss

SSL 검증 비활성화

git config --global http.sslVerify false

diff

Unstaged와 Staged의 비교

git diff

Staged와 Commited의 비교

git diff --cached
git diff --staged

fetch

원격 저장소의 데이터 가져오기

데이터를 모두 가져오지만 머지는 생략한다. 보통 서버의 데이터를 확인하는 용도로 사용한다.

git fetch # origin 저장소에서 받아온다.
git fetch pb master

태그 받아오기

원격 저장소의 태그를 모두 받아온다. 태그'만' 받는다.

git fetch --tags

help

도움말 보기

git help <verb>

git <verb> --help

man git-<verb>

git help config
git config --help

init

기존 디렉토리를 Git 저장소로 만들기

git init

bare repository

작업폴더(working directory 혹은 work tree)가 없는 저장소를 만든다. 이 명령은 로컬 저장소가 아닌 원격 저장소 즉, 서버를 생성할 때 사용한다.

git init --bare

log

커밋 히스토리 조회

git log

log의 옵션

-p  각 커밋에 적용된 패치를 보여준다.

--stat  각 커밋에서 수정된 파일의 통계정보를 보여준다.

--shortstat  `--stat` 명령의 결과 중에서 수정한 파일, 추가된 줄, 삭제된 줄만 보여준다.

--name-only  커밋 정보중에서 수정된 파일의 목록만 보여준다.

--name-status    수정된 파일의 목록을 보여줄 뿐만 아니라 파일을 추가한 것인지, 수정한 것인지, 삭제한 것인지도 보여준다.

--abbrev-commit  40자 짜리 SHA-1 체크섬을 전부 보여주는 것이 아니라 처음 몇 자만 보여준다.

--relative-date  정확한 시간을 보여주는 것이 아니라 `2 주전`처럼 상대적인 형식으로 보여준다.

--graph 브랜치와 머지 히스토리 정보까지 아스키 그래프로 보여준다.

--pretty    지정한 형식으로 보여준다. 이 옵션에는 oneline, short, full, fuller, format이 있다. format은 원하는 형식으로 출력하고자 할 때 사용한다.

git log -p -2  # 2개의 항목과 패치내용만 보인다.
git log --pretty=oneline   # 각 커밋들의 메세지와 체크섬만 한 줄씩 출력된다.
git log -1 HEAD~3   # HEAD보다 세 개 이전의 커밋 로그 보기
git log v1.0 v2.4   # v1.0 태그에서 v2.4 태그 사이의 로그 보기

pretty=format의 placeholder

  • %H Commit hash
  • %h Abbreviated commit hash
  • %T Tree hash
  • %t Abbreviated tree hash
  • %P Parent hashes
  • %p Abbreviated parent hashes
  • %an Author name
  • %ae Author e-mail
  • %ad Author date (format respects the --date= option)
  • %ar Author date, relative
  • %cn Committer name
  • %ce Committer email
  • %cd Committer date
  • %cr Committer date, relative
  • %s Subject
  • 더 많은 내용은 공식 도움말 참고
git log --pretty=format:"%h %s" --graph

조회범위 제한옵션

-(n) 최근 n 개의 커밋만 조회한다.

--since, --after 명시한 날짜 이후의 커밋만 검색한다.

--until, --before 명시한 날짜 이전의 커밋만 조회한다.

--author 입력한 저자의 커밋만 보여준다.

--committer 입력한 커미터의 커밋만 보여준다.

git log --since=2.weeks
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/

merge

현재 브랜치와 다른 브랜치의 데이터를 병합

Git의 합치기(merge)는 두 개의 부모(parent)를 가리키는 특별한 커밋을 만들어 낸다. 두개의 부모가 있는 커밋이라는 것은 "한 부모의 모든 작업내역과 나머지 부모의 모든 작업, 그리고 그 두 부모의 모든 부모들의 작업내역을 포함한다"라는 의미가 있다.[각주:1]

수행하려는 merge가 3way 일때 충돌이 일어나 실패한다면 깃은 자동으로 해당파일에 충돌부분을 추가해 준다(텍스트로 확인할 수 있다).

git merge 브랜치1 [브랜치2]

git merge master   # 현재 HEAD가 가리키는 데이터를 master와 병합
git merge master hotfix   # hotfix를 master에 병합

# 새로운 토픽 브랜치인 iss 에서 작업 후 master와 병합하려고 한다면
git checkout master; git merge iss
# 혹은
git merge iss master

커밋하지 않고 병합

git merge --no-commit

Merge 도구 실행

3way merge가 실패했을때 사용한다. config 옵션에 설정된 도구가 실행되며 실행되기 전 .orig 확장자로 백업파일이 생성된다.

git mergetool

fetch 후 머지

git fetch로 받아온 스냅샷을 현재 브랜치와 머지한다.

git merge FETCH_HEAD

mv

파일명 수정

git mv FILE_FROM FILE_TO

pull

원격 저장소의 데이터 가져오기

fetch와 비슷하지만 pull은 머지를 자동으로 수행한다.

git pull [리모트저장소] [브랜치]

git pull   # 기본적으로 clone으로 생성한 원격 저장소가 origin일 때만 작동하지만, 추적브랜치를 변경해서 사용할 수도 있다.
git pull pb master

push

원격 저장소에 데이터 올리기

로컬의 커밋된 데이터를 서버에 업로드한다. 특정 조건을 충족하지 않으면 불가능할 때가 있다. 

git push [리모트저장소] [브랜치]

git push   # origin 저장소에 존재하는 브랜치에 push
git push origin other   # 서버에 other란 브랜치가 없으면 새로 생성 후 업로드
git push -u origin master  # 입력인자를 기억하는 옵션. 다음에 실행할 git push 혹은 git pull 이 origin/master로 연결되도록 한다.

로컬 브랜치와 원격 저장소의 브랜치 이름이 다를때 (혹은 원격 저장소에 다른 브랜치를 생성할 때)

git push 리모트저장소 로컬브랜치:서버브랜치

git push origin serverfix:awesomebranch    # 현재 로컬브랜치가 serverfix 일때 리모트브랜치 awesomebranch를 생성하고 push

리모트 브랜치 삭제

git push 리모트저장소 (공백):브랜치

git push teamone :other

생성한 태그 공유

push명령은 태그정보를 포함하지 않아서 따로 올려야 한다.

git push 리모트저장소 태그

혹은

git push --tags   # 생성한 태그를 모두 전송

git push origin v1.5

태그 정보 받아오기

클론으로 저장소를 복제하는게 아니라면 받아오는것 역시 추가작업이 필요. 단, 로컬에 있는 태그와 같은 커밋 이력일 경우엔 기존 태그를 삭제해야함.

git fetch 리모트저장소 tag 태그명

git pull 리모트저장소 tag 태그명

업스트림(upstream) 브랜치 설정

로컬 저장소를 init 명령어로 생성했을땐 수동으로 업스트림 브랜치를 설정할 필요가 있다. 업스트림 브랜치란 원격 저장소와 바로 연결된 로컬 저장소를 말하며 push나 pull 명령등에서 원격 저장소 이름을 생략할 수 있게 한다.

git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date

새 로컬 저장소 생성하고 원격 저장소에 푸시하기

touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://noritersand@127.0.0.1:8443/r/test.git
git push --set-upstream origin master

기존의 로컬 저장소를 푸시하기

git remote add origin https://noritersand@127.0.0.1:8443/r/test.git
git push --set-upstream origin master

rebase

브랜치 병합(3way merge의 다른방법)

merge의 경우 두 브랜치의 최종결과만을 기준으로 병합한다면 rebase는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하며 병합한다. 저장소의 커밋 로그와 이력을 한 줄로 정리해주기 때문에 보통 완료된 브랜치를 마스터에 병합할 때 사용한다.

git rebase testing     # 현재 브랜치를 testing쪽으로 rebase

checkout과 rebase를 동시에

git rebase master testing   # testing을 master쪽으로 rebase, HEAD는 testing으로 변경

#iss123을 master에 rebase 한다고 했을 때:
git rebase master iss123   # iss123을 master에 rebase 하고..
git rebase iss123 master   # master 브랜치를 fast-forward 한다

rebase의 자세한 내용은 다음 페이지를 참고: Git브랜치 Rebase하기

reset

Staged 되돌리기(스테이징 취소)

add로 인덱스에 등록한 파일을 Unstaged 상태로 바꾼다. 파일을 명시하지 않으면 모두 되돌린다.

git reset HEAD [파일]

Commit 되돌리기

이미 커밋이 완료된 상태에서 이전 커밋으로 돌아간다. (커밋 이력도 사라짐)

git reset HEAD~1   # 이전 커밋으로 1회 되돌림

revert

Commit 되돌리기2

reset과 다른점은 이전 커밋내용으로 되돌리되 HEAD가 원래의 커밋을 가리키는게 아니라 새로운 커밋을 생성하여 변경한 내용을 기록한다.

git revert HEAD

rm

파일/폴더 삭제

git rm readme.txt

git rm 명령어는 git이 추적중인 파일 혹은 폴더에만 사용할 수 있다.

깃의 추적을 중단시키기(파일은 남기고 깃디렉토리에서만 삭제)

git rm --cached readme.txt

file-glob 패턴으로 범위삭제

git rm log/\*.log   # log/디렉토리의 확장명이 log인 파일 모두 삭제
git rm \*.~    # ~로 끝나는 파일 모두 삭제

remote

원격 저장소 목록

현재 로컬저장소에 등록되어진 원격 저장소를 모두 출력하되 단축이름만 표시한다.

git remote

원격 저장소 URL 확인

원격 저장소의 단축이름과 URL을 표시한다.

git remote -v

원격 저장소 URL 바꾸기

git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

원격 저장소 추가

git remote add 단축이름 주소

git remote add remoteRepo https://noritersand@dev.naver.com/git/exlernforscm.git

원격 저장소 살펴보기

특정 저장소의 구체적인 정보(URL, 추적중인 브랜치)를 표시한다.

git remote show 리모트저장소

원격 저장소 이름 바꾸기

git remote rename NAME_FROM NAME_TO

원격 저장소 삭제

git remote rm 원격저장소이름

원격 저장소에서 쓸모가 없어진 브랜치 제거하기

git remote prune 리모트저장소

show

커밋 정보 조회

현재 HEAD의 커밋정보를 조회한다.

git show HEAD

태그로 조회

git show v1.1

체크섬(해시)으로 조회

체크섬은 중복이 없을때 앞의 일부분만 명시해도 된다.

git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b
git show 1c002dd4b

status

저장소 상태 확인

현재 깃저장소의 브랜치, 파일들의 상태를 볼 수 있다.

git status

svn

서브버전 저장소 복제

git svn clone SVN저장소주소

표준 레이아웃을 사용하는 서브버전 저장소 복제

표준대로 trunk와 branches 및 tags를 저장소 구조로 사용하는 저장소를 복제할 때 사용한다.

git svn clone -s SVN저장소주소

비표준 레이아웃을 사용하는 서브버전 저장소 복제

git svn clone -T 트렁크경로\

 -b 브랜치경로\

 -t 태그경로\

 svn저장소

표준 레이아웃을 사용하는 서브버전 저장소의 특정 리비전 복제

git svn clone -s -r 2321

표준 레이아웃을 사용하는 서브버전 저장소를 복제하고 모든 리모트 브랜치에 접두어 추가하기

git svn clone -s --prefix svn/ svn저장소

상위의 서브버전 저장소에서 갱신하고 재정렬하기

git svn rebase

상위의 서브버전 저장소에 커밋데이터 올리기

git svn dcommit

상위 서브버전 저장소에 푸싱될 커밋 목록 보기

git svn dcommit -n

서브버전 저장소 로그 보기

git svn log

서브버전 저장소 파일의 커밋정보 줄단위로 보기

git svn blame 파일

tag

태그 조회

git tag

Lightweight 태그 만들기

특정 커밋지점의 포인터를 생성(책갈피와 비슷한 개념)

git tag v2.2

Annotated 태그 만들기

이름, 이메일, 날짜, 메세지를 저장하는 태그를 생성함

git tag -a v1.1 -m "my version 1.1"

지나간 커밋 이력에 태그 만들기

체크섬을 알고 있다면 예전 커밋에도 태그할 수 있다.

git tag -a v0.8 9fceb02

태그에 서명

GPG(GNU Privacy Guard) 개인키로 태그에 서명

git tag -s 태그명 [-m "태그메세지"]

git tag -s v1.5 -m "my signed 1.5 tag"

태그 서명 검증

태그서명에 사용된 키가 공개키인지 검증한다.

git tag -v v1.0

태그 삭제

git tag -d v0.9

원격 저장소의 태그 삭제

git push origin :v0.9


'Program > GitHub' 카테고리의 다른 글

GitHub로 남의 프로젝트에 감놓고 배놓기  (0) 2017.08.05
완전 초보를 위한 깃허브  (0) 2017.08.05