git manual
목차
-
Git
- 커밋 메시지 컨벤션
- git config
- git add
- git mv
- git rm
- git commit
- git push
- git fetch
- git pull - 다른 브랜치에서 특정 브랜치의 내용을 가져올 때 - 다른 브랜치에서 또다른 브랜치의 내용을 가져올 때
- git clone
- git init
- git merge
- git rebase
- git checkout
- git reset
- git revert
- git branch
- git cherry-pick
- git remote
- git stash
- git tag
- git diff
- git apply
- Option
- git show
- git submodule
- git bisect
- git-svn
Git
커밋 메시지 컨벤션
-
feat
: 새로운 기능 추가/개선 -
fix
: 버그 수정 -
design
: css 등 사용자 UI 디자인 변경 -
comment
: 필요한 주석 추가 및 변경 -
docs
: 문서 수정 -
style
: 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 -
refactor
: 코드 리팩토링 -
test
: 테스트 코드, 리펙토링 테스트 코드 추가 -
chore
: 빌드 업무 수정, 패키지 매니저 수정 -
rename
: 파일 혹은 폴더명을 수정하거나 옮김 -
del
: 파일 혹은 폴더를 삭제 -
revert
: 이전 커밋을 되돌림
git config
Option
--global
: 전역 설정~/.gitconfig
에 저장--local
: 로컬 설정.git/config
에 저장--list
: 설정 확인
git username 설정
1
git config --global user.name "username"
git email 설정
1
git config --global user.email "email"
git editor 설정 (기본에디터는 nano)
1
git config --global core.editor "vim"
git alias
1
git config --global alias.co "checkout"
위와 같이 설정할 시 git co
명령어로 git checkout
명령어를 사용할 수 있다.
Git 원격 저장소에서 삭제된 branch를 로컬 저장소에서 자동으로 지우기
1
git config --global fetch.prune true
git diff tool 변경
1
2
3
4
5
6
7
git config --global diff.tool bcompare
git config --global merge.tool bcompare
git config --global difftool.bcompare.cmd "$HOME"/'.bcomp.sh "$LOCAL" "$REMOTE"'
git config --global difftool.bcompare.trustExitCode true
git config --global mergetool.bcompare.cmd "$HOME"/'.bcomp.sh "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'
git config --global mergetool.bcompare.trustExitCode true
git config --global mergetool.bcompare.keepBackup false
git ssh 명령어 설정
1
git config --global core.sshCommand "ssh -F $HOME/.ssh/config -i $HOME/.ssh/id_rsa -o UserKnownHostsFile=$HOME/.ssh/known_hosts -o StrictHostKeyChecking=no"
항상 현재 브랜치로 푸시시키기
1
git config --global push.default current
git add
변경내용 스테이징
1
git add <file/path>
git mv
파일을 이동시킬때 또는 이름을 변경할 때 사용
1
git mv <src file/path> <dst file/path>
git rm
git에서 파일을 삭제할 때 사용
1
git rm <file/path>
Option
-
--cached
: 인덱스에서만 삭제
git commit
커밋
Option
-
-m
: 커밋 메세지 설정
git push
서버로 커밋, 태그 (변경사항)을 푸시
1
git push <option>
Option
-u (--set-upstream)
: 푸시할 remote 지정 (git push -u origin feature/mysql_dbset
)
-u
옵션은 최초 한번 설정한 후 생략하여도 푸시가 가능하다.git push origin feature/mysql_dbset
-f
: 강제 푸시 (서버의 변경사항을 덮어씀, 실무에서 사용하지 않도록 함)-d
: 원격 저장소의 브랜치 삭제 (git push origin -d feature/mysql_dbset
)
etc
푸시를 편하게 진행하는 방법 : https://www.daleseo.com/git-push/ \
항상 현재 브랜치로 푸시시키기 를 참조.
해당 설정을 진행하면 git push
시 현재 브랜치로 자동 푸시된다.
git fetch
서버의 변경 내용을 확인함
git pull
서버의 변경 내용을 확인하고 적용함
모든 브랜치의 내용을 가저욤
1
2
3
4
git branch -r | grep -v "\->" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git branch -r | grep -v "\->" | while read remote; do git branch --set-upstream-to="$remote" "${remote#origin/}"; done
git fetch --all
git pull --all
다른 브랜치에서 특정 브랜치의 내용을 가져올 때
git pull origin <branch name>
예시 ) develop 브랜치에서 master 변경내용을 가져오고 싶을 때
현재 develop 브랜치에 있다고 가정
1
git pull origin master
다른 브랜치에서 또다른 브랜치의 내용을 가져올 때
git pull origin <another branch>:<other branch>
예시 ) debug 브랜치에서 master 변경 내용을 가져오고(pull) 싶으나
현재 develop 브랜치에 있다고 가정
1
git pull origin master:debug
git clone
원격 저장소를 다운로드 함
Option
-
--config
: 복제할 때 설정을 변경할 수 있음
아래와 같은 옵션을 통해 clone 시 특정 ssh key, 유저명 지정 가능
1
git clone $1 --config user.name="$gituser" --config core.sshCommand="ssh -i $curpath/clone_id_rsa -o StrictHostKeyChecking=no"
git init
.git 디렉토리를 생성하고 깃 프로젝트를 생성/초기화함
git merge
브랜치간 내용을 머지
Option
-
--squash
: 커밋을 하나로 합침
git rebase
git checkout
브랜치간 이동, conflict 해결, 파일 복원 등 다양한 용도로 사용됨
1
2
3
4
5
git checkout <branch name> : 브랜치간 이동
git checkout <filename> : 파일 복원 or conflict 해결
git checkout <commit hash> : 특정 커밋의 변경사항을 적용
-
--theirs
: 서버의 변경사항을 적용 -
--ours
: 로컬의 변경사항을 적용
git reset
해당 커밋 해쉬로 되돌린다.
이외에도 커밋 또는 스테이징을 취소 (git add 취소) 하는 역할을 진행한다.
COMMAND
-
git reset HEAD <filename>
: 스테이징 취소 (git add 취소) -
git reset HEAD^
: 마지막 커밋 취소 -
git reset HEAD~2
: 최신 2개의 커밋 취소 -
git reset <commit>
: 해당 커밋으로 히스토리 되돌림
Option
-
--mixed
: commit 취소 및 변경된 파일들은 unstaged 상태로 워킹 디렉터리에 보존 -
--soft
: commit 취소 및 변경된 파일들은 staged 상태로 워킹 디렉터리에 보존 -
--hard
: commit 취소 및 변경된 파일들은 모두 삭제됨
git revert
git branch
1
2
3
git branch <branch name> : 브랜치 생성
git branch <branch name> <commit hash> : 해당 커밋 해시를 가지는 브랜치 생성
--orphan
: 빈(고아) 브랜치 생성-d --delete
: 브랜치 삭제-D
: 브랜치 강제 삭제 (--delete --force
)
git cherry-pick
특정 커밋의 변경사항을 현재 브랜치에 적용한다.
1
git cherry-pick <commit hash>
Option
-
-n
: 커밋은 생성하지 않고 변경사항만 스테이징
git remote
Option
-
-v
: 원격 저장소 목록 확인
Command
-
rm
: 원격저장소 삭제 -
add
: 원격저장소 추가
nginx의 특정 브랜치를 나의 리포지토리로 복사하였 을 때 remote를 사용한 내용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# git remote -v
origin https://github.com/nginx/nginx.git (fetch)
origin https://github.com/nginx/nginx.git (push)
# git remote rm origin
# git remote -v
# git remote add origin git@github.com:iblea/nginx-1.18.git
#
# git remote -v
origin git@github.com:iblea/nginx-1.18.git (fetch)
origin git@github.com:iblea/nginx-1.18.git (push)
# git remote add nginx https://github.com/nginx/nginx.git
# git remote -v
nginx https://github.com/nginx/nginx.git (fetch)
nginx https://github.com/nginx/nginx.git (push)
origin git@github.com:iblea/nginx-1.18.git (fetch)
origin git@github.com:iblea/nginx-1.18.git (push)
git stash
변경 사항을 임시 저장함.
주의 :Untracked 파일은 저장되지 않음
1
2
3
git stash
git stash <command>
Command
-
clear
: 모든 stash 삭제 -
apply stash@<stash number>
: stash 적용 (git stash apply stash@{stash_number}
) -
drop stash@<stash number>
: stash 삭제 -
list
: stash 목록 -
pop
: stash 적용 후 삭제 (apply + drop) -
push
: stash 생성/저장 -
show
: stash 내용 확인 (스태시된 파일들의 변경사항 등 세부 정보 확인)
Opotion
-
--keep-index
(-k
) : 일반적으로 stash 진행 시 staged 된 파일도 모두 스태쉬 진행하지만
git add
(staged)된 내용을 제외한 나머지를 stash에 저장한다.- 단 Untracked 파일은 stash되지 않는다.
-
--include-untracked
(-u
) : Untracked 파일도 stash에 포함한다.
스테쉬 옵션 상세 설명
아래와 같이 4개의 파일이 있다고 가정하자.
스테이징된 파일 : a.c
변경된 파일 (스테이징되지 않은 파일) : b.c, c.c
새로 생성된(git project에 존재하지 않는) 파일 : d.c \
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# git status
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.c
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.c
modified: c.c
Untracked files:
(use "git add <file>..." to include in what will be committed)
d.c
이 때 git stash -k
(--keep-index
)를 실행하면, staged된 파일인 a.c
파일과 Untracked 파일인 d.c
파일은 제외한 나머지 파일들이 스테쉬에 저장된다.
1
2
3
4
5
6
7
8
9
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.c
Untracked files:
(use "git add <file>..." to include in what will be committed)
d.c
만약 git stash -k -u
(--keep-index --include-untracked
)를 실행하면, staged된 파일인 a.c
을 제외한 나머지 파일들이 스테쉬에 저장된다.
1
2
3
4
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.c
git tag
깃의 특정 커밋 해쉬를 태그로 지정할 수 있다.
1
git tag <tag name> <commit hash>
태그 정보 보기
1
git tag
관련 Command
-
git show <tag name>
: 태그 정보 확인 -
git push origin <tag name>
: 태그를 원격 저장소로 푸시 참조 -
git push --delete origin <tag name>
: 원격 저장소로 푸시된 태그 삭제 참조
Option
-d <tag name>
: 태그 삭제
git diff
변경 사항을 비교한다.
git diff <commit hash>
- 특정 커밋의 변경내역부터 작업 디렉토리의 변경내역까지 비교한다. (특정 커밋의 변경내역을 비교하는 것이 아니다.)
git diff <commit hash1>..<commit hash2>
- 커밋1과 커밋2 사이의 변경내역을 비교한다.
git diff
된 내용을 파일로 저장할 수 있다. git diff > difflog.diff
이 diff로그를 가지고 git apply
또는 git patch
로 변경사항을 적용할 수 있다.
Option
-
--name-only
: 변경된 파일명만 출력
git apply
git diff 등으로 생성된 difflog 파일을 가지고 변경사항을 적용한다. 단 이때 difflog 파일과 변경된 라인이 일치해야 diff가 진행된다.
git diff 후 변경 로그가 추가로 존재하여 파일의 라인이 달라졌을 경우 패치되지 않는다.
git apply <difflog file>
- difflog 파일을 가지고 변경사항을 적용한다.
diff 및 apply 예제 (diff 파일을 통해 적용하는 방법)
1
2
3
4
5
git diff <commit1>..<commit2> > ~/difflog.diff
# git show <commit1> > ~/difflog.diff 해도 무방함. (단 show 명령어를 사용했을 경우 커밋 정보텍스트 제거 필요)
# 다른 repository로 이동 후
git apply --reject ~/difflog.diff
find . -name "*.rej" -type f
Option
-
--reject
: 적용할 파일에 충돌이 발생한 경우 충돌 내용을 파일로 생성하고, 충돌이 발생하지 않은 파일의 경우에는 적용한다. 충돌 내용은*.rej
확장자로 생성된다.
git show
특정 커밋의 변경사항을 확인한다.
git show <commit hash>
- 특정 커밋의 변경내역을 확인한다.
git show된 내용을 파일로 저장한 뒤 아래와 같은 show 로그만 제거하면 diff처럼 사용할 수 있고, difflog 파일을 가지고 git apply
또는 git patch
로 변경사항을 적용할 수 있다.
1
2
3
4
5
6
7
commit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab0f
Author: test@test
Date: .........
commit content
................... description ................
Option
-
--name-only
: 변경된 파일명만 출력
git submodule
깃 서브모듈은 다른 깃 저장소를 현재 깃 저장소의 하위 디렉토리로 가져오는 기능이다.
설정된 서브모듈은 .gitmodules
파일에서 확인할 수 있다.
Command
-
git submodule add <git repository url>
: 서브모듈 추가-
git submodule add -b <branch> <git repository url>
: 서브모듈 추가 (지정한 브랜치로 체크아웃)
-
-
git submodule update
: 서브모듈 업데이트-
--init
: 서브모듈 초기화 옵션, 일반적으로git submodule update --init
를 통해 서브모듈을 초기화 및 업데이트 한다. -
--recursive
: 서브모듈 내 서브모듈 업데이트 -
--remote
: 서브모듈을 원격 저장소에 적용한다.--remote
옵션 뒤에 브랜치 이름을 인자로 주어 특정 브랜치만 적용시킬 수 있다. -
--merge
: 서브모듈의 변경사항을 머지시킨다. 일반적으로git submodule update --remote --merge
옵션을 사용하여 원격 저장소에 반영한다.
-
-
git submodule status
: 서브모듈 상태 확인 git submodule init
: 서브모듈 초기화-
git submodule deinit <submodule path>
: 서브모듈 제거-
-f
: 강제 옵션
-
git bisect
깃 bisect로 문제가 발생한 커밋을 빠르게 찾는다.
-
git bisect start
를 통해 검색 시작, -
git bisect good
,git bisect bad
를 통해 문제가 발생한 커밋인지 아닌지를 구분 -
git bisect reset
:git bisect start
한 커밋으로 돌려놓는다. -
git bisect log
: git bisect 과정 확인 -
git bisect replay
1 2
git bisect log > gitbisect.log git bisect replay gitbisect.log # 로 재시작
-
git bisect skip
- 해당 커밋을 건너뜀
출처 : https://blog.gangnamunni.com/post/understanding_git_bisect/
git-svn
svn 저장소와 git을 연동하여 사용하는 명령어이다.
깃에 내장된 명령어가 아니며 별도의 설치가 필요하다.
자세한 사용법은 아래 링크를 참조하는것이 좋다.
git-svn init
아래와 같이 사용할 수 있다.
1
git svn init svn://<SVN IP>/<SVN PATH> --prefix=origin/ --id=svn --username=<svn 계정명> --svn-remote='<원하는이름>'
-> git svn remote 디렉토리가 origin/svn 이 된다. -> git svn fetch “
git-svn fetch
git svn fetch <svn nicknamek>
을 통해 svn 저장소의 최신 변경사항을 가져온다.
svn 별명을 입력하지 않으면 git svn fetch svn
명령어를 실행한 것과 동일하다.
1
git svn fetch
만약 git svn fetch 만 진행하였으나 변경사항이 존재하거나 untracked 파일이 존재할 경우, 아래의 명령어를 실행해본다.
1
git update-index --assume-unchanged <file>
git-svn dcommit
git svn dcommit을 통해 git의 커밋(변경) 내용을 svn으로 동기화할 수 있다.
1
git svn dcommit --username <svn username>