티스토리 뷰
Git의 기본
시작하기
안녕, 하카타에서 태어난 원숭이 킥킥이야. 오늘은 나랑 같이 버전 관리 시스템, 'Git(깃)' 을 공부해보자.
여러분은 파일을 편집 전 상태로 되돌리고 싶을 때 어떻게 하고 있나요?
가장 간단한 방법은 편집하기 전에 파일을 미리 복사해두는 것입니다. 파일과 폴더명 뒤에 편집한 날짜를 붙여주는 방식이죠. 하지만 파일을 편집할 때마다 매번 복사하는 일은 번거롭기도 하고 실수할 가능성도 많습니다.
또한 위의 그림처럼 특별한 규칙 없이 마음대로 이름을 붙여놓는 경우 어느 파일이 최신인지, 또 파일의 어떤 부분이 변경된 것인지 파악하기 어렵습니다.
아래 그림을 보세요. 이렇게 여러 명이 공유한 파일을 동시에 편집하는 바람에 다른 사람이 먼저 변경하고 있던 내용을 지워버린 경험은 없나요?
바로 이런 문제를 해결하기 위해 만들어진 것이 Git과 같은 버전 관리 시스템입니다.
Git을 이용하여 버전 관리하기
Git이란 소스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'입니다. 원래는 Linux 소스코드를 관리할 목적으로 개발 되었습니다.
Git에서는 소스 코드가 변경된 이력을 쉽게 확인할 수 있고, 특정 시점에 저장된 버전과 비교하거나 특정 시점으로 되돌아갈 수도 있습니다.
또 내가 올리려는 파일이 누군가 편집한 내용과 충돌한다면, 서버에 업로드 할 때 경고 메시지가 발생됩니다. 누군가가 애써 편집한 내용을 덮어써버리는 실수는 이제 없겠죠!
Git으로 파일을 관리하면, 업데이트 이력이 Git에 저장되지.
매번 백업용 파일 복사본을 만들 필요가 없으니까 엄청 편하고 깔끔하다구!
이력을 관리하는 저장소
저장소(Git repository)란 말그대로 파일이나 폴더를 저장해 두는 곳입니다. 그런데 Git 저장소가 제공하는 좋은 점 중 하나는 파일이 변경 이력 별로 구분되어 저장된다는 점입니다. 비슷한 파일이라도 실제 내용 일부 문구가 서로 다르면 다른 파일로 인식하기 때문에 파일을 변경 사항 별로 구분해 저장할 수 있습니다.
원격 저장소와 로컬 저장소
Git은 원격 저장소와 로컬 저장소 두 종류의 저장소를 제공합니다.
- 원격 저장소(Remote Repository): 파일이 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소입니다.
- 로컬 저장소(Local Repository): 내 PC에 파일이 저장되는 개인 전용 저장소입니다.
평소에는 내 PC의 로컬 저장소에서 작업하다가 작업한 내용을 공개하고 싶을 때에 원격 저장소에 업로드 합니다. 물론 원격 저장소에서 다른 사람이 작업한 파일을 로컬 저장소로 가져올 수도 있습니다.
저장소 만들기
내 컴퓨터에 로컬 저장소를 만드는 방법은 두 가지가 있습니다.
첫 번째, 아예 저장소를 새로 만들거나, 두번째, 이미 만들어져 있는 원격 저장소를 로컬 저장소로 복사해 올 수 있습니다.
변경을 기록하는 커밋
파일 및 폴더의 추가/변경 사항을 저장소에 기록하려면 '커밋'이란 버튼을 눌러줘야 합니다.
커밋 버튼을 누르면 이전 커밋 상태부터 현재 상태까지의 변경 이력이 기록된 커밋(혹은 리비전)이 만들어집니다.
커밋은 아래 그림처럼 시간순으로 저장됩니다. 최근 커밋부터 거슬러 올라가면 과거 변경 이력과 내용을 알 수 있겠죠.
각 커밋에는 영문/숫자로 이루어진 40자리 고유 이름이 붙습니다. 저장소에선 이 40자리 이름을 보고 각 커밋을 구분하고 선택합니다.
Tips
버그 수정, 기능 추가 등 특별한 의미가 있는 업데이트를 작업 별로 구분해서 각각 커밋하면, 나중에 이력을 보고 특정 변경 내용을 찾기 쉽습니다.
커밋은 이렇게 이력을 남기는 중요한 작업이기 때문에 커밋 버튼을 누를땐 커밋 메시지를 필수로 입력해야 합니다. 메시지가 없으면 커밋이 실행되지 않습니다.
Tips
메시지는 명료하고 이해하기 쉽게 남겨야 본인 뿐만 아니라 다른 사람이 커밋 이력을 확인하기 쉽습니다. Git 에서 권장하는 메시지 형식을 따르는 것도 좋습니다.
1번째 줄 : 커밋 내의 변경 내용을 요약 2번째 줄 : 빈 칸 3번째 줄 : 변경한 이유
주로 위 형식으로 메시지를 작성합니다.
작업 트리(Work tree)와 인덱스(Index)
Git 에서는 우리가 흔히 말하는 폴더를 '작업 트리'(Work Tree)라고 부릅니다.
그리고 커밋을 실행하기 전의 저장소와 작업 트리 사이에 존재하는 공간을 '인덱스'라고 합니다.
지금까지 배운 Git 용어를 총정리 해 볼까요?
Git의 '커밋' 작업은 '작업 트리'에 있는 변경 내용을 저장소에 바로 기록하는 것이 아니라 그 사이 공간인 '인덱스'에 파일 상태를 기록(stage - 스테이징 한다고 표현하기도 합니다)하게 되어 있습니다. 따라서 저장소에 변경 사항을 기록하기 위해서는, 기록하고자 하는 모든 변경 사항들이 '인덱스'에 존재해야 합니다.
예를 들어, 10개의 파일을 수정했지만 그 중에 7개만 저장소에 공개하고 싶을 때를 생각해 보세요. 변경한 10개의 파일 중 7개를 선택하는 작업이 바로 '인덱스에 등록' 또는 '스테이징(stage)'이라 표현하는 작업 입니다.
이렇게 인덱스란 공간(가상이지만요!)이 중간에 있는 덕분에 작업 트리 안에 있는 커밋이 필요 없는 파일들을 커밋에 포함하지 않을 수 있고, 파일에서 내가 원하는 일부 변경 사항만 인덱스에 등록해 커밋할 수 있습니다.
저장소 공유하기
원격 저장소에 푸시(Push)하기
지금까지는 로컬 저장소의 기본적인 사용 방법을 설명했습니다. 이제부터는 원격 저장소를 이용하여 로컬 저장소의 변경 이력을 공유하는 방법에 대해 알아 보겠습니다.
push
내 PC의 로컬 저장소에서 변경된 이력을 원격 저장소에 공유하려면, 로컬 저장소의 변경 이력을 원격 저장소에 업로드해야 합니다.
웹 상의 원격 저장소로 변경된 파일을 업로드하는 것을 Git에서는 푸시(Push)라고 합니다. push 를 실행하면, 원격 저장소에 내 변경 이력이 업로드되어, 원격 저장소와 로컬 저장소가 동일한 상태가 됩니다.
원격 저장소 복제(Clone)하기
누군가의 변경 이력이 적용된 원격 저장소가 있으면, 그걸 웹에서 통째로 복제해와 내 PC에서 직접 작업할 수 있습니다.
clone
원격 저장소를 복제하려면, 클론(Clone)이라는 조작을 수행합니다.
복제란 원격 저장소의 내용을 통째로 다운로드하는 것을 말합니다. 복제한 저장소를 다른 PC에서 로컬 저장소로 사용할 수 있게 됩니다.
Note
변경 이력도 함께 로컬 저장소에 복제되어 오므로, 원래 원격 저장소와 똑같이 이력을 참조하고 커밋을 진행할 수 있습니다.
원격 저장소에서 풀(Pull)해오기
원격 저장소를 공유해 여러 사람이 함께 작업을 하면, 모두가 같은 원격 저장소에 푸시(Push)합니다. 그럼 다른 사람이 원격 저장소에 올려놓은(Push) 변경 내용을 내 로컬 저장소에도 적용(Pull)할 필요가 있습니다.
Pull
원격 저장소에서 로컬 저장소로 업데이트하려면 풀(Pull)을 실행합니다.
pull 을 실행하면, 원격 저장소에서 최신 변경 이력을 다운로드하여 내 로컬 저장소에 그 내용을 적용합니다.
튜토리얼2 저장소 공유
원격 저장소에 푸시(Push)하기
「튜토리얼 Git의 기본」에서 만든 로컬 저장소 「tutorial」를 push 해보세요.
Source Tree를 실행해, 「tutorial」 저장소를 선택합니다.
저장소 화면의 툴바 오른쪽 끝에 있는 「설정」 버튼을 클릭합니다.
아래 화면에서 「추가」버튼을 클릭합니다.
「리모트의 이름」에 「origin」, 「URL/패스」에 이전 웹페이지에서 생성한 원격 저장소의URL을 복사해서 붙이고 「OK」버튼을 클릭합니다.
인증 계정은 Backlog 사용자명(User ID), 비밀번호와 동일합니다.
원격 목록에 지금 등록한 「origin」이 추가되었습니다. 이제 Backlog의 저장소에 push할 준비가 완료되었습니다.
Tips
콘솔로 작업할 때 push 나 pull 실행 단계에서 원격 저장소명을 생략하면, 자동으로 origin이라는 이름으로 생성되기 때문에 일반적으로 원격 저장소에는 origin이라는 이름을 붙입니다.
그러면 push를 해봅시다. push를 실행하려면, tutorial 저장소 조작 화면 툴바의 「push」 버튼을 클릭합니다.
다음과 같은 대화 상자가 표시되므로, 「master」의 체크박스를 선택하고「OK」버튼을 클릭합니다.
push 가 완료되면 커밋의 설명에 원격 저장소를 나타내는 「origin/master」가 추가됩니다.
Backlog의 Git 페이지를 열어보세요. 최근 업데이트 내역에 push 항목이 추가되어 있습니다.
저장소의 파일 목록에는, push 한 저장소의 파일이 추가되었습니다.
원격 저장소 복제(Clone)하기
원격 저장소를 복제하여 다른 곳에서도 작업을 할 수 만들어 봅시다.\
내가 다른 사용자가 됐다고 가정하고 아까 Push했던 원격 저장소의 파일을 내PC의 "튜토리얼2"라는 새폴더로 복사해 오겠습니다.
SourceTree의 북마크 목록 화면의 왼쪽 상단의 「Add Repository」버튼을 클릭 또는 메뉴바에서 「파일」 >「신규를 선택 하십시오」
저장소 복사 버튼을 클릭합니다. 원격 저장소의 URL과 로컬 저장소를 보존하는 폴더를 입력한 뒤 작성 버튼을 클릭합니다.
여기서는 이전 페이지에서 만든 원격 저장소를, 「tutorial2」라는 폴더명으로 복제합니다.
복제한 저장소가 북마크 목록에 추가되었습니다.
복제한 저장소 「tutorial」 안에, 아까 push했던 sample.txt가 존재하는지 확인해주세요.
누구나 쉽게 이해할 수 있는 Git 명령어
복제한 저장소에서 다시 푸시하기
이번에는 복제한 로컬 저장소에서 다시 원격 저장소로 파일을 푸시(push) 해 봅시다.
tutorial2에서의 작업
우선 이전 페이지에서 복제한 저장소의 폴더에 있는 sample.txt파일을 열어 아래 굵은글자 부분의 내용을 추가하고 커밋합니다.
원숭이도 이해할 수 있는 Git 명령어 add 변경사항을 인덱스에 등록하기
tutorial2에서의 작업
로컬 저장소 커밋이 한단계 진행됐습니다.
tutorial2에서의 작업
이제 커밋을 push 합시다. 툴바의 「push」를 클릭하십시오.
tutorial2에서의 작업
아래 같은 화면이 표시되면 master의 체크박스가 선택하고 「OK」버튼을 클릭합니다.
tutorial2에서의 작업
원격 저장소를 나타내는 「origin/master」의 커밋도 진행되었습니다.
Tips
한번 커밋 위치에 대하여 복습해봅시다.
- origin/master
원격 저장소 「origin」의 브랜치인 「master」의 위치를 나타내고 있습니다. - origin/HEAD
원격 저장소 「origin」을 복제해 올 때 다운로드되는 커밋의 위치를 나타내고 있습니다.
일반적으로 「origin/master」와 동일한 위치를 가리킵니다. - master
로컬 저장소 브랜치인 「master」의 위치를 나타내고 있습니다.
브랜치에 대한 내용은 발전 편에서 자세히 설명합니다.
Backlog의 Git 페이지를 열어주십시오. 최근 업데이트 내역에 방금 push 한 커밋이 추가되어 있을 것입니다.
원격 저장소에서 풀(Pull)해오기
원격 저장소에서 「tutorial」로 최신 변경 내용을 가져와 봅시다.
이전 페이지에서 「tutorial2」로부터 원격 저장소로 보낸(Push) 내용을 내PC의「tutorial」폴더로 가져와(Pull) 봅시다.
tutorial에서의 작업
pull을 실행하려면, 툴바의 풀 버튼을 클릭합니다.
tutorial에서의 작업
아래 화면에서 OK 버튼을 클릭합니다.
tutorial에서의 작업
master의 위치와 원격 저장소인 origin/master 위치가 동일하게 Pull이 진행되었습니다.
tutorial에서의 작업
sample.txt 파일을 열고 내용을 확인해봅시다.
원숭이도 이해할 수 있는 Git 명령어 add 변경사항을 인덱스에 등록하기
「add 변경사항을 인덱스에 등록하기」가 추가되어 있습니다.
변경 이력의 통합
변경 이력 병합(Merge)하기
merge
내가 끌어온 저장소가 최신 버전이 아닌 경우, 즉 내가 pull 을 실행한 후 다른 사람이 push 를 하여 원격 저장소를 업데이트 해버린 경우에는 위의 그림과 같이 내 push 요청이 거부되어 버립니다.
이런 경우 병합(merge)이라는 작업을 진행하여 다른 사람의 업데이트 이력을 내 저장소에도 갱신 해야합니다. 만약 병합하지 않은 채로 이력을 덮어쓰게 되면 다른 사람이 push 한 업데이트 내역(그림의 커밋C)이 사라져 버리기 때문입니다.
충돌 해결하기
이전 페이지에서 설명한 것처럼, 병합 기능은 Git 에서 변경한 부분을 자동으로 통합해 주는 기능입니다. 그러나 경우에 따라 자동으로 병합할 수 없는 경우도 있습니다.
바로 원격 저장소와 로컬 저장소 양쪽에서 파일의 동일한 부분을 변경한 경우입니다. 이 경우 두 변경 내용중 어느 쪽을 저장할 것인지 자동으로 판단 할 수 없기 때문에 충돌이 발생합니다.
Git 은 충돌이 발생한 파일 내용을 아래 그림처럼 표시합니다. 이 부분을 우리가 직접 수정해 주어야 합니다.
Point
===== 로 구분된 윗 부분이 로컬 저장소,
아랫 부분이 원격 저장소의 변경 내용이라는 점!
다음 그림과 같이 모든 충돌 부분을 수정한 후에, 다시 커밋을 수행하면 됩니다.
충돌상태 만들기
우선은 「tutorial」과 「tutorial2」를 사용하여 충돌 상태를 만들어봅시다.
tutorial에서의 작업
우선은 tutorial 폴더의 sample.txt를 열고, 아래처럼 수정한 후 커밋하십시오.
원숭이도 이해할 수 있는 Git 명령어 add 변경사항을 인덱스에 등록하기 commit 인덱스의 상태를 기록하기
tutorial2에서의 작업
그 다음, tutorial2 폴더의 sample.txt를 열고 이번엔 조금 다르게 아래 내용으로 수정하고 나서 커밋하십시오.
원숭이도 이해할 수 있는 Git 명령어 add 변경사항을 인덱스에 등록하기 pull 원격 저장소의 내용을 가져오기
tutorial2에서의 작업
그 상태로 tutorial2에서 원격 저장소로 push합시다.
Point
지금 원격 저장소 sample.txt파일 메시지 세 번째 행엔 "pull 원격 저장소의 내용을 취득함"이란 변경 이력이 기록되어 있다고!
tutorial에서의 작업
이번에는 tutorial에서 원격 저장소로 push합시다.
오류가 발생하여 push 를 거부(rejected)당했습니다.
충돌 해결하기
먼저 pull 을 실행하여, 원격 저장소의 최신 변경 이력을 로컬로 가져와 봅시다.
tutorial에서의 작업
툴바의 pull 버튼을 클릭하여 pull 을 실행합니다.
tutorial에서의 작업
다음과 같은 화면이 표시되므로 그대로 OK 버튼을 클릭합니다.
tutorial에서의 작업
병합 중에 충돌이 발생했다는 것을 나타내는 메시지가 표시되었습니다.
tutorial에서의 작업
sample.txt 파일 열어서 확인해봅니다.
Git 이 충돌이 발생한 부분에 다음과 같은 수정을 했습니다.
원숭이도 이해할 수 있는 Git 명령어
add 변경 사항을 인덱스에 등록하기
<<<<<<< HEAD
commit 인덱스의 상태를 기록하기
=======
ull 원격 저장소의 내용을 가져오기
>>>>>>> 17c860612953c0f9d88f313c8dfbf7d858e02e91
※ 여기에서는 양쪽 변경사항을 둘다 도입하기로하고, 불필요한 마커 행은 삭제합니다.
원숭이도 이해할 수 있는 Git 명령어
add 변경 사항을 인덱스에 등록하기
commit 인덱스의 상태를 기록하기 pull 원격 저장소의 내용을 가져오기
tutorial에서의 작업
파일 내용에 변경사항이 생겼으니 다시 커밋해야겠죠. 우클릭 메뉴에서 commit 을 클릭하여 커밋해 보세요.
최신 변경 내용을 원격 저장소에서 로컬 저장소로 가져왔습니다.
위 빨간 박스안에 표시된 것 처럼 두 가지 변경 사항이 통합됐음을 알 수 있습니다.
이로써 이전 페이지에서는 거부되었던 push 를 할 수 있게 되었습니다. push 해봅시다.
출처
'Project > Git' 카테고리의 다른 글
[Git Flow] Git Flow 개요 및 설치 사용법 (0) | 2022.03.23 |
---|---|
GIT 마무리 (0) | 2020.09.03 |
GIT 심화편 (0) | 2020.09.03 |
- Total
- Today
- Yesterday
- Intellj들여쓰기
- Letsencrypt+nginx
- 마이바티스CamelCase
- camelcase
- 마이바티스
- Letsencrypt wildcard
- letsencrypt
- SSL
- Letsencrypt wildcard auto renew
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |