문서의 이전 판입니다!
git clone [저장소주소] [디렉토리명]
: “디렉토리명”으로 저장소 복제git clone --depth 1 [저장소주소] [디렉토리명]
: “디렉토리명”으로 저장소를 복제하는데, 히스토리는 복제하지 않는다(빠르다).git clone –branch <branchname> [저장소주소]
: 특정 branch 를 클론한다.git config --list --local # 현재 저장소 설정 git config --list --global # 공통 설정
git add 파일
: 저장소에 추가git commit -m “메시지”
: 로컬 커밋git push [origin]
: 원격 저장소 origin으로 Pushgit fetch
: 원격 저장소 origin에서 받아오기. Merge는 안함.git pull
: 원격 저장소 origin에서 최신 데이터를 가져와 Merge까지 하기.git
디렉토리 삭제하기git clone --depth=1 git://someserver/somerepo dirformynewrepo rm -rf !$/.git # !$ 는 직전 명령의 마지막 인자(dirformynewrepo) 를 뜻한다.
git status
: 워킹 디렉토리 상태 보기git diff 커밋ID_1 커밋ID_2 [파일명]
: 두 커밋로그 사이의 차이점 비교. 파일명을 지정하면 두 커밋간 해당 파일의 차이점 비교git blame 파일
: 파일을 누가 언제 고쳤는지 보여줌.git diff 브랜치1..브랜치2
: 두 브랜치간의 비교git diff 다른브랜치 -- 파일
: “파일”의 현재 브랜치와 다른 브랜치간의 차이점을 보여준다.git diff --name-status 브랜치1..브랜치2
: 두 브랜치간의 변경된 파일 목록과 상태. --name-only
옵션은 파일 이름만 출력.git diff --stat --color 브랜치1..브랜치2
: 두 브랜치간의 차이를 컬러 차트로 보여줌.git log --graph --left-right --cherry-pick --oneline 브랜치1...브랜치2
git diff --name-only [COMMIT1] [COMMIT2]
: 두 커밋간의 변경된 파일 목록git diff --name-only HEAD~10 HEAD~5
: 헤드에서 10번째 커밋과 헤드에서 5번째 커밋간의 변경된 파일 목록git log [파일]
: 특정 파일 혹은 워킹 디렉토리에 대한 커밋 로그를 보여줌git log -숫자
: 최근 숫자 갯수만큼의 로그만 보여줌git log --full-history [파일]
: 사라진 커밋 히스토리까지 다 보여준다.git log --author=“Jon”
: 특정 사용자로 커밋 로그 검색git log --grep=“정규표현식”
: 정규표현식을 만족하는 커밋 메시지가 있는 로그를 보여줌--all-match
: 모든 --grep
옵션을 다 만족시키는 것만 검색.
가끔씩 Commit이 사라지고 git log --full-history [파일]
명령으로 로그를 봐야 커밋 히스토리가 보이는 경우가 발생한다.
이는 브랜치 Merge 시에 다른 사람의 작업(없어진 커밋)과 충돌이 났을 때 IntelliJ로 치면 Accept yours
혹은 Accept theirs
처럼 특정 작업을 모두 무시하는 Merge를 수행했을 때 발생한다.
git checkout [커밋ID]
: 특정 커밋 시점으로 모든 소스를 변경한다.git checkout HEAD~1
: 한 단계 전으로 이동git checkout HEAD~10
: 10 단계 전으로 이동git checkout master
: 다시 master 브랜치로 원상 복구git rm 파일
: 특정 파일삭제.git mv 파일1 파일2
core.ignorecase
참조.$parent_of_flawed_commit에 대해 rebase
git rebase --interactive $parent_of_flawed_commit
pick
을 reword
로 변경하고 저장--interactive
== -i
# 특정 commit 지정할 경우 git rebase -i -p 원하는커밋바로앞커밋hash ## 바로 앞!!! ## # 특정 갯수 지정할 경우 git rebase -i HEAD~갯수 # Push 안된 모든 커밋을 지정할 경우 git rebase -i $parent_of_flawed_commit # 여기서 나온 편집기 화면에서 고치고자 하는 커밋을 pick 대신 edit로 수정한다. # ------------------------------ # 이제 작성자 변경작업 git commit --amend --author "New Author Name <email@address.com>" git rebase --continue # 이미 push 된 상황이면 --force 로 push 해야만 함. git push --force
git commit --amend --author "New Author Name <email@address.com>"
squash
를 사용한다는 점이 다르다.# 특정 갯수를 지정할 경우 git rebase -i HEAD~갯수 # 맨 처음 커밋로그(합쳐진 결과가 될 커밋)을 제외하고 "squash"로 변경하고 저장.
git fetch origin; git reset --hard origin/master
: 커밋을 모두 취소하고 origin/master
상태로 변경# 커밋 외의 변경사항이 있을 때 변경 사항들을 stash 해 두어야 한다. git stash git reset --hard origin/master # 올바른 리모트 브랜치로 바꿔줄것 git stash pop
git reset --soft HEAD^
: Local 커밋을 취소하지만 커밋으로 인한 변경사항은 유지한다.git checkout -- [파일]
: 아직 스테이지로 안 올라간 파일의 변경 취소git reset --hard HEAD
: 커밋 되지 않은 모든 변경사항 취소. 최종 커밋한 상태로 돌아감.git reset HEAD [파일]
: 스테이지에 올라간 파일을 스테이지에서 뺌(파일 자체는 변경 상태 유지)git rest HEAD^
: 마지막 커밋을 커밋하기 전 상태로 되돌린다.(파일을 빼먹고 커밋했거나 한 경우)git revert [commit_id …]
: 특정 커밋의 변경 사항을 되돌리며, 되돌리는 행위 자체를 하나의 새로운 커밋으로 만든다. 실제 기존 커밋 히스토리가 사라지지는 않는다. 이미 Push된 커밋도 가능.git revert -m [parent] [commit_id] # example git revert -m 1 xxxx
git clean -f
: Untracked 파일 모두 삭제git clean -d -f
: 디렉토리까지 삭제-x
옵션을 주면 ignore된 파일들까지 모두 삭제이미 파일이 많은 신규 프로젝트를 Git 리포지토리로 올리는 작업이 필요한 경우. Git – setting up a remote repository and doing an initial push
# 프로젝트 이름과 원격 리포지토리 이름이 my_project 일 때 cd my_project git init # 불필요한 파일들을 모두 정리한 뒤에 git add * # 혹은 git add --all git commit -m '프로젝트 초기 설정' git remote add origin [git_repository]/my_project.git git push -u origin master
git push origin master
로 origin master
를 명시해줘야 한다.(git 1.8 이상에서는 상관 없는 듯)git remote set-url origin git://new.url.here # origin을 원하는 remote 저장소 이름으로 변경
git branch -vv
: 브랜치의 상세 정보 출력. upstream 까지 보여줌git branch
: 브랜치 정보 출력git branch 이름
: 새 브랜치 만들기git switch 이름
: 해당 브랜치로 스위치git checkout 이름
: 예전 방식git switch -c 이름
: 브랜치 생성하고 해당 브랜치로 스위치git checkout -b 이름
: 예전 방식git checkout -
: 직전 브랜치 체크아웃git branch -d 이름
: 브랜치 삭제, -D
는 강제 삭제git branch --merged
: 머지가 완료된 브랜치 목록을 보여준다. master를 제외한 머지 완료된 브랜치는 삭제해 버리자.git branch --no-merged
: 머지 안된 브랜치 목록을 보여준다.git branch -v
: 각 브랜치의 최종 커밋을 보여준다.git branch -a
: 전체 브랜치(리모트 포함) 목록git branch -r
: 리모트 브랜치 목록git remote prune origin
: 원격에서 삭제된 리포지토리를 로컬에서도 삭제.origin
은 원격지 이름으로 대체될 수 있다.git switch -t origin/serverfix
: 원객 브랜치를 브랜치이름 그대로 생성하며 체크아웃.git checkout --track origin/serverfix
: 옛날방식git checkout -b [localbranchname] origin/[remotebranchname]
: 원격 브랜치를 로컬 브랜치를 생성하며 체크아웃한다. 로컬 브랜치 이름을 다르게 가져갈 수 있다.git push --set-upstream origin [remotebranchname]
: 현재 브랜치를 원격 브랜치에 연결하고 푸시한다.git push origin [remotebranchname]
: 원격브랜치로 push. 원격브랜치가 없으면 만든다.git push origin [localbranchname]:[remotebranchname]
: 특정 로칼 브랜치를 지정하여 원격브랜치로 푸시. 원격 브랜치가 없으면 만든다.git push origin :[remotebranchname]
: 원격 브랜치 삭제. 중간의 콜론(:)이 있다는 점에 주의할 것.git clone -b [remotebranchname] [remote_repo 주소]
: 원격 브랜치를 바로 clone 한다.git branch --track [localbranchname] origin/[remotebranchname]
: 로컬 브랜치와 리모트 브랜치간의 연결git remote add <forkname> <forkgiturl>
git fetch <forkname>
: 소스 받아오기git merge <forkname>/<branch>
: 원본 리포의 특정 브랜치를 내 브랜치에 머지# 현재 상태의 확인 $ git remote -v > origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch) > origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push) # 원본을 upstream 으로 추가 $ git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git # Remote가 잘 추가 됐는지 확인 $ git remote -v > origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch) > origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push) > upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch) > upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push) # upstream 최신화 $ git fetch upstream # 내 리포리토리 master 체크아웃 $ git checkout master # upstream/master 머지 - 끝 $ git merge upstream/master
> 이미 공개 저장소에 Push 한 커밋을 Rebase 하지 마라
이 지침만 지키면 Rebase를 하는 데 문제 될 게 없다. 하지만, 이 주의사항을 지키지 않으면 사람들에게 욕을 먹을 것이다.
일반적인 해답을 굳이 드리자면 로컬 브랜치에서 작업할 때는 히스토리를 정리하기 위해서 Rebase 할 수도 있지만, 리모트 등 어딘가에 Push로 내보낸 커밋에 대해서는 절대 Rebase 하지 말아야 한다.
git rebase master
) 현재 experiment의 커밋들이 가리키는 base 커밋을 마스터의 C10으로 바꾸는 작업이다.git checkout master
), experiment를 머지하면(git merge experiment
) 머지되는 커밋들이 C5에 대해 머지되지 않고, C10의 뒤로 머지되어 master 입장에서 봤을 때 C10 → C7' → C8'로 깔끔한 순서로 머지가 되는 것이다.git pull
git checkout workingbranch
git rebase master
git checkout master
git merge workingbranch
--preserve-merges
: rebase 시에 머지 커밋을 유지한다.git tag -l
: 태그의 목록을 보여준다.git tag -a [tagname] [commit] -m “태그 설명”
: commit을 지정하지 않으면 현재 커밋.git checkout [tagname]
: 태그 목록의 태그 이름을 이용해 해당 태그를 체크아웃한다.git tag -d [tagname]
: 태그 삭제git push --tags
: 태그 전체를 리모트로 푸시git push origin [tagname]
: 특정 태그를 리모트로 푸시git push origin :[tagname]
: 리모트 태그 삭제git push --delete origin [tagname]
: 리모트 태그 삭제git merge [내용을 가져올 브랜치명]
: 특정 브랜치를 현재 브랜치에 Mergegit merge [내용을 가져올 브랜치명] --squash; #충돌 처리 작업 후 ;git commit
: 다른 브랜치로부터 머지를 하되 모든 커밋들을 하나로 뭉쳐서 가져온다. 실제 커밋은 현재 브랜치에서 commit 명령으로 생성한다. How to use git merge squashgit merge -Xignore-space-change [내용을 가져올 브랜치명]
: 머지할 때 공백을 무시한다. -Xignore-all-space
도 가능. rebase
시에도 동일한 방법으로 사용한다.-Xignore-space-at-eol
참조git stash
: 스태시git stash list
: 스태시 목록git stash pop
: 마지막 스태시 복원하고 목록에서 제거git apply 패치파일.patch
git checkout -- $(git ls-files --modified)
git rm $(git ls-files --deleted)
# 리포지토리 생성 git init --bare newreponame # clone git clone newreponame [clonename]
pull --rebase
http://mislav.uniqpath.com/2010/07/git-tips/pull --rebase
를 하던가git config --global branch.autosetuprebase always
혹은git config branch.master.rebase true
: master
대신 원하는 브랜치명
이미 한 add
했던 파일은 ignore해도 적용이 안된다. 캐시돼 있기 때문이라고 한다. 이 때는 다음과 같이 처리한다.
git rm --cached 무시할파일명
# last git config --global alias.last 'log -1 HEAD' git config --global alias.lg \ "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an %ae>%Creset' --abbrev-commit --" git config --global alias.ci commit git config --global alias.co checkout git config --global alias.st status git config --global alias.unstage 'reset HEAD --' # 외부명령 gitk 혹은 gitg git config --global alias.visual '!gitk'