깃 정리

윤태웅·2021년 6월 17일
0

git공부

목록 보기
1/1
post-thumbnail

공부는 기본적으로 이 사이트를 참고해서 하되 더 궁금한 점은 구글검색을 이용했다.

git


git은 리누스 토발즈가 개발중인 리눅스코드의 버전관리를 하려고 2주만에 뚝딱 만들어버린 버전관리 프로그램이다.

git 설치

설치 <<여기서 설치 가능하다. 자신의 운영체제에 맞는 프로그램을 골라 설치한다.

git bash, git gui, git cmd

git 설치를 하게되면 pc에 3가지 실행가능한 프로그램들이 보인다.

git bash는 유닉스 bash를 모방한 프로그램,
git cmd는 윈도우 명령 프롬프트를 모방한 프로그램,
git gui는 버전관리를 눈에 보기 좋은 그래픽으로 하는 프로그램이다.
git을 이용하는 사람들의 종류가 다양하기에 다양한 입맛의 도구를 깔아주는 것으로 해석할수 있겠다. 3개의 프로그램으로 나뉘어 있어도 git의 기본적인 사용방법은 다 똑같다. gui는 보기 좋다는 장점, bash는 bash의 명령어를 사용할 수 있다는 장점, cmd는 cmd의 명령어를 사용할 수 있다는 장점이 있다. 나는 뭔가 알록달록해보이는 git bash를 주로 사용한다.




git으로 버전관리하는 방법

git init

git bash나 git cmd를 이용해서 버전관리하고 싶은 프로젝트 디렉토리로 접근한 다음에 git init이라는 명령어를 입력하면 버전관리에 필요한 폴더인 .git이라는 폴더가 해당 폴더에 생성된다.

git init


이 폴더안에 버전들의 기록이 담기면서 오프라인으로도 버전관리하는 것이 가능해진다.

git디렉토리 구조

git프로그램은 버전관리를 위해 파일을 저장하는 3가지 영역이 있다.
각각 working directory, staging area, repository라고 한다.

working directory는 우리가 직접 파일을 작업하는 영역,
staging area는 작업한 파일을 git directory에 등록하기 위한 스냅샷으로 가지고 있는 영역
git directory는 버전들이 저장되는 영역이다.
이 구조에 대한 부연설명은 아래 명령어들을 설명하며 추가로 진행하겠다.

git add

git add명령어는 우리가 작업하던 파일을 staging area에 추가하는 명령어다.

git add 파일이름.확장자

이 명령어를 실행할 시 .git/objects디렉토리에 두개의 숫자를 이름으로하는 폴더들이 생성되는데 이 폴더들이 바로 staging area가 가리키는 스냅샷들이라고 할 수 있다.그리고 앞으로 이 폴더들을 "객체"라고 설명한다.

git sha-1 hash

객체의 이름은 git의 스냅샷 저장방식때문이다.
git은 sha-1함수에 근거하여 파일 내용의 해시값으로 스냅샷을 저장한다.
sha-1의 hash값은 160비트이고 이것을 16진수로 나타내면 40자리의 16진수가 되는데, 폴더이름으로 2자리를 사용하고 파일이름을 38자리를 사용한 것이다.
git이 이런 알고리즘을 사용하는 이유는 다음과 같다. 참고

  • 데이터 중복 저장 방지, 수정되지 않은 파일들의 해시값은 동일하므로 중복으로 저장되는 것을 방지할 수 있다.
  • git은 분산버전관리 프로그램으로 다른 환경에서 작성한 파일들도 repository에 합쳐지게 되는데, 이때 다른 객체들에 대해서 다른 이름을 보장받을 수 있다.
  • 성능적으로 이득을 볼 수 있다. 모든 파일의 내용을 비교하는 것이 아니라 hash값 160비트가 변했는지를 확인하는 것으로 수정된 내용을 금방 파악할 수 있게된다.

git commit

git add 명령어로 staging area에 올린 객체들을 repository에 기록하는 명령이다. 특이하게도 커밋 자체도 .git폴더내에서는 객체로서 저장된다. 커밋 객체의 내용은 다른 데이터 객체를 가리키는 포인터의 내용을 담고있다. git은 모든 기록에 대해 객체를 만들어두고 포인터로 내용을 관리하는 것이다. 각각의 커밋은 개발 버전들을 의미하기에 기능적 단위로 commit을 하는 것이 관리하는데 효과적이다.

git commit -m "커밋메시지"

git branch

git은 branch라는 기능을 제공한다. branch는 한국어로 해석하면 '가지'인것처럼 개발을 가지치기한다.

git branch 이름

git branch 명령어를 실행하면 새로운 branch가 만들어진다.
branch를 이용하면 개발을 병렬적으로 진행할 수 있게된다. 예를들어, 프로젝트에서 시험삼아 새로운 기능을 추가하고 싶어진다면, 내가 새로 개발할 branch를 생성하고 해당 브랜치에서 작업을 하면 항상 작업이 실행될 수 있는 상태로 약속한 master branch의 커밋 내용을 변경하지 않고 내가 원하는 작업들을 진행할 수 있다. 그러다가 추가기능 개발이 끝났다면 뒤에 설명할 git merge명령을 통해 master branch에 개발 내용을 반영할 수 있다.

git checkout 이름

git checkout 명령어를 사용하면 개발중인 branch를 변경할 수 있다.
이때 해당 브랜치가 가리키는 커밋의 내용으로 working directory까지 초기화되니 당황하지 말자.

git merge

branch를 생성해서 개발을 하고 다른 branch와 내용을 합치고 싶을 수 있다. 그때는 git merge명령어로 두개의 branch를 합치는 명령을 내릴 수 있다.

git merge 상대브랜치이름

fast forward merge

부모 commit에서 branch를 따서 작업을 했지만 부모branch가 수정사항이 없고 자식 branch만이 수정사항이 있을때 또는 그 반대일때 merge명령을 내리게 되면 git은 fast forward merge를 진행한다. 단지 두 branch의 최신커밋을 같은 커밋으로 맞춰주는 작업이다. 이 과정에서는 새로운 커밋이 생성되지 않는다. 새로운 커밋을 만들지 않고도 merge결과를 나타낼 수 있기 때문이다.

three way merge

부모 branch 자식 branch모두 수정사항이 있을때 merge명령을 내리면 three way merge를 진행하게 된다. 두 branch의 공통 조상 commit과 각 branch의 최신 커밋 2개를 비교해서 merge 결과물을 만들어내고 새로운 커밋을 만들어낸다.

조상commita branch commitb branch commitmerge 결과 commit
aaaa
baba
(x)(x)bb
b(x)b(x)
cabconflict발생

조상 commit과 비교해 수정사항이 발생한 부분은 수정이 반영된 commit으로 덮어 씌워지고 만약, 같은 부분에 다른 수정사항이 발생하면 merge conflict가 발생하게 된다.

merge conflict

조상commit과 비교했을때 두commit이 같은 부분을 다른내용으로 수정하면 git은 프로그램 내부에서 어떤 내용을 선택할지 판단을 사용자에게 넘기는데 그것을 merge conflict라고 한다. 이때 사용자는 merge conflict가 발생한 파일을 열어 직접수정하거나 merge tool 프로그램을 이용하여 merge conflict가 발생한 부분의 내용을 수정하고 git add,git commit을 하여 중단된 git merge작업을 마무리 할 수 있다.

git stash

stash는 영어로 무언가를 숨기는 것을 의미한다. 그냥 hide라 해도 될것같은데 괜히 있어보이게 만든것 같다.

git stash

이 명령의 기능은 아직 commit을 할만큼 작업을 진행하지 못했는데 급하게 다른 branch로 이동해서 데이터를 참고해야할때 임시 저장소의 역할을 한다. git checkout 명령어를 이용해서 다른 branch로 checkout하기 전에 작업물을 임시 저장하는 용도로 사용한다. git stash는 스택구조로 저장을 하므로 여러버전의 작업물을 저장해놓을수도 있다.

git reset

작업을 하다보면 과거commit으로 작업물을 돌리고 싶을 수가 있다. 그때는 git reset 명령어를 사용하면 된다.

git reset -옵션 commit아이디

git reset에는 옵션을 3가지 줄 수 있다. -hard,-mixed,-soft라는 옵션이 존재하는데 -hard는 working directory,staging area,repository모두 해당 커밋의 내용으로 덮어쓰는 것이고 -mixed는 staging area,repository만 해당 커밋의 내용으로 덮어쓰는 것이고 -soft는 repository만 해당 커밋의 내용으로 덮어쓰는 것이다.
따로 옵션을 안주면 git은 -mixed옵션을 준것으로 해석하니 왜 working directory가 안바뀌냐고 찡찡대지말자.

git revert

git reset과 비슷하게 git revert는 과거 커밋으로 돌아가는 명령어이다. 하지만 차이점이 하나 있는데, 바로 git reset과 달리 과거 기록을 보존하고 되돌리고 싶은 커밋을 가장 최근 커밋으로 만든다는 것이다.

git revert commit아이디

너무 창피한 것을 commit해서 아예 기록으로 안남기고 싶다면 git reset, 개발과정을 꼼꼼하게 기록하고 있다면 git revert를 쓰면 되겠다.
근데 사실 git reset한것도 포인터만 변경된 것이지 커밋객체들은 안지워지고 저장되어있다.

git rebase

rebase는 base를 새롭게 한다는 뜻이다. 브랜치를 따서 작업한 것들의 원래 base branch가 내용이 업데이트 되었을때 현재 브랜치의 base commit을 base branch의 최신 커밋으로 만든다고 이해하면 된다.

git rebase branch이름

rebase도 merge와 같이 파일을 합치는 작업을 하게되기 때문에 conflict가 발생할 수 있다. 이때는 git merge작업처럼 conflict를 해결후 다시 commit하면 해결할 수 있다.

git tag

git을 사용해서 버전관리를 하다보면 실행이 가능한 버전을 만들게 되고 여기에 이름을 붙이고 싶어질 수 있다. 그 기능이 바로 git tag다. 수많은 커밋들 중에 특별한 의미를 가지는 commit들에 tag를 달아준다.(ex/1.0,1.0.1)

git tag 태그이름

0개의 댓글