Git

협업시 팁

General

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
# Changes to be committed:
#	new file:   README
#	modified:   CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C

위의 내용 첫 번째 줄에는 커밋한 파일을 설명할 수 있는 큰 제목 두 번째 줄 부터는 간단한 설명을 남겨놓을 수 있다.

  1. 상위커밋과는 다른 바향으로 새롭게 만들어진 브랜치와의 커밋은 3-way-Merge 라고 하며 각 브랜치가 가리키는 커밋 두개와 공통의 조상 하나를 사용하여 Merge한다. 이 경우 단순히 브랜치 포인터를 최신 커밋으로 옮기는 게 아니라 3-way Merge 의 결과를 별도의 커밋으로 만들고 나서 해당 브랜치가 그 커밋을 가리키도록 이동시킨다. 그래서 이런 커밋은 부모가 여러 개고 Merge 커밋이라고 부른다.Git은 Merge 하는데 필요한 최적의 공통 조상을 자동으로 찾는다. 이런 기능도 Git이 다른 버전 관리 시스템보다 나은 점이다. (3-way-Merge의 경우 같은 merge하는 두 브랜치의 커밋이 같은 파일을 다르게 수정한 경우 충돌이 발생하며 이경우 해당 파일을 수정해 주어야 한다.수정한 후에 git add 명령어로 깃에 저장 후 commit한다.)

Git의 브랜치는 커밋 사이를 가볍게 이동할 수 있는 어떤 포인터 같은 것이다. 기본적으로 Git은 master 브랜치를 만든다. 처음 커밋하면 이 master 브랜치가 생성된 커밋을 가리킨다. 이후 커밋을 만들면 브랜치는 자동으로 가장 마지막 커밋을 가리킨다.

다른 버전 관리 시스템과는 달리 Git은 ‘HEAD’라는 특수한 포인터가 있다. 이 포인터는 지금 작업하는 로컬 브랜치를 가리킨다. 브랜치를 새로 만들었지만, Git은 아직 master 브랜치를 가리키고 있다. git branch 명령은 브랜치를 만들기만 하고 브랜치를 옮기지 않는다.

브랜치를 이동하면 워킹 디렉토리의 파일이 변경된다는 점을 기억해두어야 한다. 이전에 작업했던 브랜치로 이동하면 워킹 디렉토리의 파일은 그 브랜치에서 가장 마지막으로 했던 작업 내용으로 변경된다. 파일 변경시 문제가 있어 브랜치를 이동시키는게 불가능한 경우 Git은 브랜치 이동 명령을 수행하지 않는다.

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0 해당내용 참조해서 이해하고 정리하기.

http://devpools.kr/2017/02/05/%EC%B4%88%EB%B3%B4%EC%9A%A9-git-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0-reset-revert/ 쉽게 설명해 놓은 참고할 만한 블로그


CLI 명령어

파일을 처음 생성하고나면 Untracked 상태인데 Tracked 위의 명령어를 통해 바로 Staged 상태로 만들어 준다. 또한 수정된 파일(Modified상태) 또한 해당 명령어로 Staged상태로 만들어 준다.(참고: staged 상태는 Tracked상태 종류의 3가지 중 하나, 데이타베이스에 커밋 하기전 스냅샷을 만드는 단계)

저장소를 클론하는 것, 서버의 있는 데이터를 복제해서 가져온다.

파일의 상태를 확인하기 위한 명령

파일의 현재 상태를 간단하게 보여준다.

파일이 변경되었다는 사실이 아니라 어떤 내용이 변경됐는지 살펴볼 때 사용하는 명령어 / 워킹 디렉토리에 있는 것과 Stage 하지 않을 것을 비교하여 보여줌, 따라서 수정한 모든 파일이 Staging Area에 있다면 아무것도 출력하지 않는다

저장소에 커밋한 것과 Staging Area에 있는 것을 비교교하여 보여줌

Staged 상태인 파일을 확인한다 git diff --staged와 같은 명령어

Staged된 파일들을 커밋한다.

커밋 후에 생성되는 파일 창에 diff 메시지를 추가해서 보여준다.

커밋과 동시에 파일에 대한 설명을 text자리에 간단하게 추가할 수 있다

Tracked상태의 파일을 모두 Staging Area에 넣는다.

git에서 파일을 제거 하려면 git rm 명령으로 Tracked 상태의 파일을 삭제한 후에 (정확하게는 Staging Area에서 삭제하는 것) 커밋해야 한다.이 명령은 워킹 디렉토리에 있는 파일도 삭제하기 때문에 실제로 파일도 지워진다. git 명령을 사용하지 않고 단순히 워킹 디렉터리에서 파일을 삭제하고 git status 명령으로 상태를 확인하면 Git은 현재 “Changes not staged for commit”(즉, Unstaged 상태)라고 표시해 준다. 그리고 git rm 파일명 명령을 실행하면 삭제한 파일은 Staged상태가 된다. 커밋하면 파일은 삭제되고 Git은 이 파일을 더 추적하지 않는다.

해당 파일을 Staging Area에서만 제거하고 워킹 디렉토리에 있는 바일은 지우지 않고 남겨둔다.

파일이름을 변경한다.

커밋 히스토리를 조회하는 명령어, 가장 퇴근의 커밋이 가장 먼저 나온다.

-p는 각 커밋의 diff 결과를 보여준다. -2는 최근 두개의 결과만 보여준다.

브랜치와 머지 히스토리를 보여주는 아스키 그래프를 출력한다.

Staged상태의 파일을 Unstaged상태로 변경한다.

Modified(수정되고 add하지 않은 상태)상태의 파일을 최근 커밋된 버전으로 다시 되돌리는 명령어

현재 프로젝트에 등록된 리모트 저장소를 확인할 수 있다. 저장소를 Clone하면 origin이라는 리모트 저장소가 자동으로 등록되기 때문에 origin이라는 이름을 볼 수 있다.

리모트 저장소에 대한 단축이름과 URL을 함께 볼 수 있다.

기존 워킹 디렉토리에 새 리모트 저장소를 추가한다.

리모트 저장소에서 데이터를 가져오는 단축키q Clone한 이후에(혹은 마지막으로 가져온 이후에) 수정된 모든 것을 가져온다. git fetch명령은 리모트 저장소의 데이터를 모두 로컬로 가져오지만, 자동으로 Merge하지 않는다.

리모트 저장소의 구체적인 정보를 확인할 수 있다.

리모트 저장소의 이름을 변경한다.

리모트 저장소를 삭제한다.

이미 만들어진 태그가 있는지 확인한다.

Annotated태그를 만든다. /Lightweight 태그는 브랜치와 비슷한데 브랜치처럼 가리키는 지점을 최신 커밋으로 이동시키지 않는다. 단순히 특정 커밋에 대한 포인터일 뿐이다. Annotated 태그는 Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 그리고 태그 메시지도 저장한다. GPG(GNU Privacy Guard)로 서명할 수도 있다. 일반적으로 Annotated 태그를 만들어 이 모든 정보를 사용할 수 있도록 하는 것이 좋다. 하지만 임시로 생성하는 태그거나 이러한 정보를 유지할 필요가 없는 경우에는 Lightweight 태그를 사용할 수도 있다. -m 옵션을 통해서 메시지를 함께 저장할 수 있다. 명령을 실행할 때 메시지를 입력하지 않으면 git은 편집기를 실행시킨다.

예전에 커밋한 파일에 태그를 한다. git log를 통해 커밋 히스토리를 확인하고 커밋 고유번호인 체크섬ㅁ을 몇자리면 명기하여 어떤 커밋인지를 나타내 준다.

git push 명령은 자동으로 리모트 서버에 태그를 전송하지 않는다. 태그를 만들었으면 서버에 별도로 Push 해야 한다.

새로운 브랜치를 만든다.

해당 브랜치를 삭제한다

브랜치 이름 변경

해당 브랜치 이름으로 헤드를 이동시킨다. 헤드를 이동시키면 해당 해드는 해당 브랜치가 있는 커밋을 가리키고 워킹디렉토리의 파이도 그 시점으로 되돌려 놓는다. 이렇게 헤드를 옮길 경우 다른 브랜치의 작업들과는 별개로 진행된다.

브랜치를 만들면서 Checkout까지 한 번에 하려면 git checkout 명령에 -b라는 옵션을 추가한다.

Tracked 된 로컬 파일 전체를 확인할 수 있다.

변경내용을 임시저장 한 것과 같은 효과(commit한 상태는 아니다, 커밋은 하기 싫고 다른 브랜치로 넘어가서 작업을 해야 한다면) stash 명령어를 사용하고 다시 돌아와서 git stash pop 명령어를 통해서 내용을 복구 할 수 있다. 한계점은 같은 조상을 공유하고있는 내용만 적용할 수 있다는 것.

해당커밋으로 헤드를 이동시킨다. 해당 커밋 커밋을 변경하고 버릴 수 있다. 다만 생성 한 커밋을 유지하기 위해 새 분기를 만들려면 ‘git checkout 새로운브랜치이름’ 과 같은 방식으로 새로운 브랜치를 만들고 해당 커밋에 위치시키면 된다. and git checkout HEAD~숫자명령을 통해서도 해당 숫자만큼의 커밋을 이동할 수 있다.

Stash 명령을 사용하면 워킹 디렉토리에서 수정한 파일만 저장한다. Stash는 Modified이면서 Tracked 상태인 파일과 Staging Area에 있는 파일들을 보관해두는 장소다. 아직 끝나지 않은 수정사항을 스택에 잠시 저장했다가 나중에 다시 적용할 수 있다.

저장한 stash를 확인할 수 있는 명령어

git stash apply를 사용하여 Stash를 적용할 수 있다. git stash 명령을 실행하면 이 명령에 대한 도움말을 보여주기 때문에 편리하다. 다른 Stash를 고르고 싶으면 Stash 이름을 입력해야 한다. 이름이 없으면 Git은 가장 최근의 Stash를 적용한다.