본문 바로가기

Today Learning _

Part 15. Git 다루기

Git 이란 무엇인가?

소스 코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'이다.
Git에서는 소스 코드가 변경된 이력을 쉽게 확인할 수 있고, 특정 시점에 저장된 버전과
비교하거나 특정 시점으로 되돌아 갈 수 있다.

 

 

또한 내가 올리려는 파일이 누군가 편집한 내용과 충돌한다면, 

서버에서 업로드 할 때 경고 메시지가 발생하게 된다. 

그래서 누군가 편집한 내용을 덮어버리는 실수를 없앨 수 있다.

 

 

** Git 으로 파일 관리를 하면 업데이트 이력이 Git에 저이 된다.
매번 백업용 파일 복사본을 만들 필요가 없으니까 편하고 깔끔하다.

 

 

 

 

이력을 관리하는 저장소

저장소(Git respositoty)란 말 그대로 파일이나 폴더를 저장해 두는 곳이다.
git저장소가 제공하는 좋은 점 중 하나는 파일이 변경 이력 별로 구분되어 저장된다는 것이다.

 

비슷한 파일이라도 실제 내용 일부 문구가 서로 다르면 다른 파일로 인식하기에

파일을  변경사항 별로 구분해 저장할 수 있다.

 

 

원격 저장소와 로컬 저장소

 

Git 은 원격 저장소와 로컬 저장소 두 종류의 저장소를 제공합니다.

- 원격 저장소(Remote Repository) : 파일이 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소이다.
- 로컬 저장소(Local Respository) : 내 PC에 파일이 저장되는 개인 전용 저장소이다.

 

평소에는 PC 로컬 저장소에서 작업하다가 작업한 내용을 공개하고 싶을 때 원격 저장소에 업로드합니다. 

또한 원격 저장소에서 다른 사람이 작업한 파일을 로컬 저장소로 가져올 수 있습니다.

 

 

저장소 만들기

 

로컬 저장소를 만드는 방법

 

1. 저장소를 새로 만든다.
2. 이미 만들어져 있는 원격 저장소를 로컬 저장소로 복사해 올 수 있습니다.

 

 

 

 

 

변경을 기록하는 commit

파일 및 폴더의 추가/변경 사항을 저장소에 기록하려면 commit을 해야 한다.
commit을 하면 이전 commit 상태부터 현재 상태까지의 변경 이력이 기록된 commit이 만들어진다.

시간순으로 저장되며 최근부터 거슬로 올라가면서 과거 변경 이력과 내용을 알 수 있다.


각 커밋에는 영문/숫자로 이뤄진 40자리 고유 이름이 붙는다.
저장소에선 이 이름을 보고 각 커밋을 구분하고 선택한다.

 

버그 수정, 기능 추가 등 특별한 의미가 있는 업데이트를 작업 별로 구분해서 각각 
커밋하면 나중에 이력을 보고 특정 변경 내용을 찾기 쉽다.

 


커밋은 이력을 남기는 중요한 작업이기에 커밋을 할 떄 커밋 메시지를 필수로 입력해야 한다.
메시지가 없으면 커밋이 실행되지 않는다.

 

메시지는 명료하고 이해하기 쉽게 남겨야 다른 사람이 커밋 이력을 확인하기 쉽다.

- 1번째 줄 : 커밋 내의 변경 내용 요약

- 2번째 줄 : 빈칸
- 3번째 줄 : 변경한 이유

 

 

 

 

 

 

 

작업트리(Work tree)와 인덱스(Index)

git에서는 우리가 흔히 말하는 폴더를 '작업 트리(Work Tree)'라고 부릅니다.
그리고 커밋을 실행하기 전의 저장소와 작업 트리 사이에 존재하는 공간을 '인덱스'라고 부릅니다.

즉, 인덱스에 등록되지 않은 파일은 커밋이 되지 않는다.

 

 

 

용어 정리


- Git commit : 작업 트리에 있는 변경 내용을 저장소에 바로 기록하는 것이 아니라

그 사이 공간인 '인덱스'에 파일 상태를 기록(statge)하게 된다. 

따라서 저장소에 변경 사항을 기록하기 위해서는 기록하고 하는 모든 변경 사항들이 '인덱스'에 존재해야 한다.

ex) 10개의 파일을 수정했지만 그중 7개만 저장소에 공개하고자 할 때. 
변경한 10개의 파일 중 7개를 선택하는 작업이 '인덱스에 등록' = 스테이징(statge)라 표현하는 작업이다.

인덱스란 가상의 공간이지만 중간에 있기에 작업 트리 안에 있는 커밋이 필요 없는 파일
커밋에 포함하지 않을 수 있고 파일에서 내가 원하는 일부 변경 사항만 인덱스에 등록해 커밋할 수 있다.

 

 

 

 

 

 

 

 

Git 저장소 공유하기

 

원격 저장소에 푸시(Push)하기

 

pc로컬 저장소에서 변경된 이력을 원격 저장소에 공유하려면

로컬 저장소의 변경 이력을 원격 저장소에 업로드해야 합니다.

웹 상의 원격 저장소로 변경된 파일을 업로드하는 것을 Git에서는 푸시(Push)라고 합니다.
push를 실행하면, 원격 저장조에 내 변경 이력이 업로드되어 원격 저장소와 로컬 저장소가 동일한 상태가 됩니다.

 

 

 

원격 저장소 복제(Clone)하기

 

누군가의 변경 이력이 적용된 원격 저장소를 통째로 복제해와 내 PC에서 작업할 수 있습니다.

clone

원격 저장소를 복제하려면 클론이라는 조작을 수행합니다.
복제란 원격 저장소의 내용을 통째로 다운로드하는 것을 의미합니다.
복제한 저장소를 다른 pc에서 로컬 저장소로 사용할 수 있게 됩니다.

변경 이력도 함께 로컬 저장소에 복제되어 오기에
원래 원격 저장소와 똑같이 이력을 참조하고 커밋 진행이 가능합니다.

 

 

 

원격 저장소에서 풀(Pull)해오기

 

원격 저장소를 공유해 여러 사람이 함께 작업을 하면 모두가 같은 원격 저장소에 푸시합니다. 

그럼 다른 사람이 원격 저장소에 올려 놓은(push) 변경 내용을 내 로컬 저장소에도 적용(pull)할 필요가 있습니다.

 

Pull
 

원격 저장소에서 로컬 저장소로 업데이트 하려면 풀(Pull)을 실행합니다.
pull을 실행하면 원격 저장소에서 최신 변경 이력을 다운로드하여 내 로컬 저장소에 그 내용을 적용합니다.

 

 

 


 

 

원격 저장소에 로컬 저장소의 이력 push하기

원격 저장소의 주소는 이름으로 기록해 둘 수 있다. 

기록해두면 push 할 때마다 긴 원격 저장소의 주소를 입력할 필요가 없다. 

우선 origin이라는 이름으로 원격 저장소를 등록하고 push 한다.

 



원격 저장소를 추가할 때 = remote 명령어를 사용한다.

$ git remote add   <name(등록명)>    <url(원격 저장소의 url)>

콘솔로 작업할 때 push나 pull 실행 단계에서 원격 저장 소명을 생략하면 
자동으로 origin이라는 이름으로 생성되기에 일반적으로 원격 저장소에 origin이라는 이름을 붙인다.

 

 

저장소를 push 하려면 push 명령어를 사용한다.
repository는 push 경로의 주소,  refspec 은 push 할 브랜치를 지정한다.

$ git push <repository> <refspec>

 

 

다음 명령어를 실행해 원격 저장소 origin에 커밋을 push 한다.
실행 옵션에서 한번 -u를 하면 이후에는 브랜 치명 지정을 생략할 수 있다.
단, 비어있는 원격 저장소에 최초로 push 했을 때는 원격 저장 소명과 브랜 치명 생략이 불가능하다.

$ git push -u origin master
     Username:<사용자명>
     Password :<비밀번호>

 

 

 

 

 

 

원격 저장소 복제(Clone)하기

$git clone   <repository>  <directory>

repository는 원격 저장소의 URL, directory는 복제 대상의 폴더명 지정.

 

 

 

 

 

복제한 저장소에서 다시 push 하기

복제해 온 해당 파일을 수정한 후 

 

$ git add <파일 이름>
$ git commit -m "파일 설명 추가"

이 변경 내용을 push 하여 원격 저장소를 업데이트한다.


$ git push

복제한 저장소에서 push 할 땐 origin master를 생략할 수 있다.

 

 

 

 

 

원격 저장소에서 풀(Pull)해오기

$ git pull   <repository>   <refspec>

풀을 수행하려면  pull 명령어를 사용한다. 만약 저장 소명이 생략되면 origin의 이름으로
등록되어 있는 저장소 밑에 pull을 수행하기 된다.

$ git pull origin master

업데이트 하기

$ git log

업데이트 확인하기

 

 

 

 

 


 

 

 

변경 이력 병합(Merge)하기

 

merge

 

내가 끌어온 저장소가 최신 버전이 아닌 경우
즉, 내가 pull을 실행한 후 다른 사람이 push를 해 원격 저장소를 업데이트해버린 경우에는 push 요청이 거부됩니다.

이런 경우 병합(merge)이라는 작업을 진행해 다른 사람의 업데이트 이력을 내 저장소에도 갱신해야 합니다.
만약 병합하지 않은 채로 이력을 덮어쓰면 다른 사람이 push 한 업데이트 내역이 사라져 버리기 때문입니다.



충돌 해결하기

 

병합 기능은 Git에서 변경한 부분을 자동으로 통합해 주는 기능입니다.
그러나 경
우에 따라 자동으로 병합할 수 없는 경우도 있습니다.

원격 저장소와 로컬 저장소 양쪽에서 파일의 동일한 부분을 변경한 경우가 그렇습니다.
이 경우 두 변경 내용 중 어느 쪽을 저장할 것이지 자동으로 판단하지 못하기에 충돌이 발생합니다.

따라서 충돌이 발생한 파일 내용을 직접 수정해 주어야 합니다.

 

=== 로 구분된 윗부분이 로컬 저장소, 
아랫부분이 원격 저장소의 변경 내용입니다.

모든 충돌 부분을 수정한 후, 커밋을 수행합니다.

 

 

 

 

 

참고자료

 

Git을 이용한 버전 관리 【Git의 기본】 | 누구나 쉽게 이해할 수 있는 Git 입문~버전 관리를 완벽하게 이용해보자~ | Backlog

Git을 이용한 버전 관리 【Git의 기본】 | 누구나 쉽게 알 수 있는 Git에 입문하신 것을 환영합니다. Git을 사용해 버전 관리를 할 수 있도록 함께 공부해봅시다!

backlog.com