git

Jeongyun Heo·2020년 12월 31일
0

git

목록 보기
3/4
post-thumbnail

가장 쉬운 Git 강좌 - (상) 혼자작업편
https://youtu.be/FXDjmsiv8fI

Git 사용법

1. Git 저장소 만들기

내 컴퓨터에 프로젝트를 진행할 폴더를 만든다.

git-practice 폴더 만들기

그리고 그 폴더를 VS Code로 연다.

cat 이라는 파일을 만든다.

저장 꼭 하기

mouse 라는 파일을 만든다.

이제 git-practice 폴더를 Git이 관리하도록 만들어 보자

VS Code 하단에 터미널을 연다.

Terminal - New Terminal

하단에 터미널이 열리고 현재 폴더로 이미 이동이 되어 있다.

여기에 git 명령어를 입력한다.

git init을 입력한다.

빈 Git 저장소가 만들어졌다는 메시지가 뜬다.

git-practice 폴더가 git의 관리 하에 들어간 것이다.

이름과 이메일을 등록한다.

git config --global user.name "이름입력"
git config --global user.email "메일주소입력"

폴더에서 숨겨진 파일 보기를 하면 .git 폴더가 생긴 걸 볼 수 있다.

.git 폴더에 git-practice 폴더의 시공간이 저장되는 거

이걸 지우고 이번에는 SourceTree로 해 본다.

SourceTree로 하는 법

SourceTree를 연다.

새로 만들기 - 로컬 저장소 생성

작업중인 폴더를 선택해준다.

잘 만들어졌다.

더블 클릭하면 창이 열린다.

마찬가지로 .git 폴더가 만들어진 것을 볼 수 있다.

Git 저장소가 생겼고, 이를 제어하는데 필요한 나의 정보도 입력되어 있다.

이제 해야할 것은
파일 두 개가 만들어져 있는 지금 상태를 타입캡슐에 묻어두는 것이다.
미래에서 언제든 이 시점으로 돌아올 수 있도록

2. 현재 시점을 저장하기

타입캡슐에 묻으려면 일단 타입캡슐에 담아야 한다.

담을 게 뭐가 있는지 Git의 눈으로 살펴본다.

git status 입력

아직 담기지 않은 파일들이 보인다.

Untracked files
Git에서 아직 쳐다보지 않는다는 뜻
이 항목들은 정확히는 이 파일들이 아니라
이 파일들이 만들어졌다는 사실들이다.

일단 담는다.

git add -A 입력 👈 이곳의 모든 걸 git의 타임캡슐에 넣는다는 의미

다시 git status 입력

Changes to be committed 👉 "묻을 것들" 이라고 이해하면 됨

이제 묻어본다.

캡슐을 묻을 때는 이게 무슨 캡슐인지 설명을 달아 놓는다.

git commit -m "설명" 입력

첫 번째 타입캡슐이 묻혔다.

git status 입력해서 살펴본다.

담아서 묻을 게 없다고 나온다.

SourceTree로 해본다.

SourceTree로 하는 법

아까 터미널에서 묻어서 묻을 게 없다고 나온다.

dog라는 새 파일을 하나 만든다.

터미널에서는 git status를 입력해야 볼 수 있지만

SourceTree는 자동으로 새로 묻을 파일이 생겼다고 보여준다.

캡슐 안으로 add하는 것을 git 용어로 stage한다 라고 함

앞에 체크해주면 위로 올라간다.

커밋 메시지를 적고 커밋 버튼을 클릭한다.

커밋 하면 새 캡슐이 묻힌 것이다.

방금 묻은 캡슐만 파내면 dog파일만 나오는 거 아니냐고 생각이 들 텐데
그 이전의 작업내역들이 전부 같이 나오니까 걱정하지 않아도 된다.

cat 파일을 삭제한다.

mouse 파일은 내용을 mickey로 바꿔준다.

그리고 penguin 파일을 새로 만든다.

저장하는 거 잊지 말기

터미널에서 git status 입력해서 상태는 본다.

penguin이 생성됐다는 사실 뿐만 아니라
mouse가 변경되었다는 사실, 그리고 cat이 삭제되었다는 사실까지
타입캡슐에 넣을 목록으로 나와 있다.

SourceTree에서도 확인할 수 있다.

이 변화들 역시 같은 방식으로 캡슐에 담아서

커밋으로 묻어버리기로 한다.

앞에 체크해주고

커밋 메시지 작성하고 커밋 버튼 클릭

지금까지 묻은 캡슐들을 한 번 보자

git log 명령어 입력

캡슐의 정보들과 메시지들이 뜬다.

터미널에서 맨 아래에 기존의 입력 줄이 안 뜨고 글자도 안 쳐진다면
vi 에디터 라는 게 실행 중인 거
Q를 눌러서 빠져나온다.

SourceTree에서는 히스토리 탭에서 볼 수 있다.

각각을 클릭해보면 뭐가 어떻게 바뀌었는지도 볼 수 있다.

3.1 과거로 돌아가기 - Reset

이전에 묻었던 캡슐을 파내서 과거의 상태로 돌아가본다.

과감한 방법과 신중한 방법이 있다.

과감한 방법은 돌아갈 과서 이후의 행적은 복원할 여지 없이 완전히 지운다.

아까 git log로 확인한 타임캡슐 중 두 번째 시점으로 돌아가본다.

일련번호의 앞자리 여섯자리만 복사한 다음

git reset 다음에 넣고 --hard를 붙여서 입력한다.

현재 이 시점으로 와 있다는 메시지가 뜨고

파일들을 보면 penguin은 사라져 있고

지웠던 cat은 다시 생겨났고

mouse의 이름도 되돌아와 있는 걸 볼 수 있다.

다시 변화들을 줘서 reset 전 상태로 만든 다음

이번에는 SourceTree에서 해본다.

SourceTree로 하는 법

이 시점을 오른쪽으로 클릭한 다음
master를 이 커밋으로 초기화 클릭

옵션으로 hard 선택

경고 메시지 뜨는데 확인 눌러주면 됨

확인을 눌러주면 폴더는 예전 상태로 돌아가고
히스토리에서는 이 시점 이후 항목이 사라져 있는 걸 볼 수 있다.

다시 미래 시점으로 가지 못 한다.

3.2 과거로 돌아가기 - Revert

다시 되돌려 놓기

위에서 했던 것보단 조금 소심하게 미래에 한 발을 걸치고 과거로 가는 방법

reset이 아닌 revert를 써보자

마찬가지로 git log로 일련번호를 확인하는데

이번에는 돌아갈 시점이 아닌, 취소할 시점을 찾는다.

가장 최근 걸 고르면 된다.

git revert 6자리 입력

그러면 이렇게 새 커밋 메시지를 작성하는 화면이 나온다.

그대로 저장하고 닫아준다.

파일들이 과거 상태로 돌아왔다.

git log

로그를 확인해보면 reset처럼 해당 시점 이후가 지워진 게 아니라
해당 시점 뒤에 새 캡슐이 묻힌 걸 볼 수 있다.

SourceTree에서 보면

이 캡슐과는 정확히 반대되는 변화가
여기서의 변화를 상쇄했다는 걸 알 수 있다.

그럼 reset으로 다시 미래로 돌아갈 수 있다.

SourceTree로 하는 법

SourceTree에서 revert를 하려면

취소할 지점을 우클릭하고 커밋 되돌리기 클릭

시간을 정복했으니 이제 평행우주로 가본다.

4. 평행우주 넘나들기 - Branch

회사에서는 이렇게 동물들을 관리하는데
나는 뭔가 다른 시도를 해보고 싶다
그렇다고 회사 파일들을 함부로 변경할 수는 없다
그럴 때 평행우주를 만들어 넘어가면 된다

my-idea 라는 평행우주를 만들어본다.

git branch my-idea

branch는 가지라는 뜻으로 현 시점에서 두 미래로 분기하겠다는 의미

다시 git branch를 입력해보면

기존 branch인 master, 그리고 새로 만든 my-idea가 있다

이 우주로 넘어가려면 git checkout my-idea 라고 입력하면 된다

이동을 했는데 달라진 점을 느끼지 못하는 이유는

새로 만들어지는 branch는 원 branch의 현 상태를 그대로 가져간다.

파일들이 그대로여서 달라진 점을 못 느끼는 거

그럼 이 평행우주에서 나만의 작업을 해보자

mouse 파일은 지우고

dinosaur 라는 파일을 새로 만든다.

그리고 캡슐에 넣어서 묻어준다.

갑자기 상사가 와서 프로젝트 어떻게 되어가냐고 물어본다

git checkout master 입력해서 회사용으로 넘어가기

감쪽같이 이전 상태로 돌아옴

SourceTree로 하는 법

SourceTree로 해보기

브랜치 보기 클릭

master랑 my-idea가 있는 걸 볼 수 있다.
그리고 master에 체크가 되어 있는 상태이다.

원하는 브랜치를 더블클릭 해서 두 브랜치를 왔다갔다 할 수 있고
브랜치를 이동할 때마다 파일 상태도 바뀌는 걸 볼 수 있다.

my-idea로부터 또 새로운 브랜치를 만들어보자

my-idea에 체크아웃 된 상태에서 위에 있는 브랜치 버튼 클릭

새 브랜치의 이름을 my-another-idea로 하고
새 브랜치 체크아웃에 체크하고 브랜치 생성 버튼 클릭

새 브랜치가 생성된 것을 볼 수 있다.

my-idea로부터 파생된 브랜치라 my-idea의 상태를 그대로 가져간 걸 볼 수 있다.

여기선 고양이 이름을 nyang 이라고 바꾸고
캡슐어 넣어 묻어둔다.

자유롭게 세 개의 평행우주를 넘나들 수 있다

master 브랜치로 돌아가서 상사가 난입한 상황으로 돌아가본다.

(SourceTree에서 master 더블클릭)

master에서 dog 파일에 강아지 이름을 mong 으로 수정

커밋한다.

제가 구상해본 안이 있는데
mouse를 빼고 둘리 라는 공룡을 넣어보는 거예요
그리고 고양이 이름도 이름을 냥으로 바꿨어요

메인 프로젝트에 적용하기로 함

5.1 다른 우주에서 가져오기 - Merge

my-idea와 my-another-idea 두 평행우주에서 일어난 변화를 master 브랜치로 가져와야 한다.

my-another-idea 브랜치가 my-idea 브랜치의 변화도 포함하니까
my-another-idea에서만 불러오면 된다

먼저 master 브랜치로 돌아온다.

git checkout master

그리고 git merge 다음에 변화를 가져올 branch 이름을 적는다.

git merge my-another-idea

엔터를 누르면

커밋 메시지를 작성하는 vi 화면이 나온다.

뭐야 왜 나는 파일 비어 있지

그냥 직접 입력해줌

이 시점의 상태로부터
상사의 지시대로 강아지 이름이 바뀌었을 뿐만 아니라
다른 평행우주들에서 작업한 내역들까지 모두 적용된 상태가 되었다.

git log --graph --all --decorate

시각화 된 두 분기에서의 작업내역을 볼 수 있다.

SourceTree로 하는 법

이번에는 merge 하기 전의 시점으로 돌아가서 SourceTree로 해본다.

SourceTree는 더 간단하다.

모든 게 합쳐질 브랜치에 체크아웃 된 상태에서

병합할 브랜치를 우클릭 한 다음 Merge ~~~ 클릭

시각화도 더 깔끔하게 보인다

merge 라는 게 언제나 방금 예시처럼 아름답게 이루어지진 않는다.

bark-wang 이라는 새로운 브랜치를 만든다.

git branch bark-wang

bark-wang으로 들어간다.

git checkout bark-wang

그리고 dog 파일에 bark: wang wang 을 붙이고

add 해서 commit 한다.

다시 master 브랜치로 돌아와서

git checkout master

dog 파일에 bark: warl warl 을 입력하고

add, commit 해준다

master와 bark-wang 브랜치 모두에서 같은 파일의 같은 부분에 수정을 한 상태이다.

아까는 수정한 파일들이 서로 달라서 병합이 매끄럽게 되었지만
이렇게 같은 파일, 같은 라인에 둘이 손을 대면 merge 할 때 conflict

이 둘 간에 갈등, 충돌이 있다고 뜬다.

파일을 보면 이렇게 두 브랜치의 작업이 다른 부분을 비교해서 나타내준다.

아까는 merge 할 때 add와 commit 메시지 작성을 자동으로 나온 내용 그대로 저장했지만 지금은 git이 자동 add를 거부한다.

이 둘 중 하나를 택해서 다른 쪽을 지워주고 저장한 다음
git add -A로 캡슐에 넣고
이번엔 git commit 까지만 입력한다.

병합하는 거라고 메시지가 이미 입력되어 있는 걸 볼 수 있다.

그냥 닫아주면 됨

merge 완료됨

이런 식으로 conflict를 해결할 수 있지만
꽤나 피곤하고 신경쓰이는 일이기 때문에
여러 브랜치들에서 작업할 때, 협업할 때는
가능한 다른 브랜치들이 같은 파일을 수정하는 일을 피해서 작업하는 게 좋다

과거로 돌아가는 방법이 두 가지 있었던 것처럼
다른 평행우주에서 작업한 내용을 가져오는 또 다른 방법이 있다.

5.2 다른 우주에서 가져오기 - Rebase

원래 상태로 되돌려 놓고 시작

git branch -d bark-wang 이라고 입력하니까 아래처럼 나옴

SourceTree에서 브랜치 이름 우클릭 해서 삭제
강제 삭제 체크하고 확인 버튼 누르니까 bark-wang 브랜치 삭제됨

아까처럼 merge를 하면 이런 식으로 branch로 분기해서
각각 작업을 하고 병합하기까지 모든 과정이 로그로 남아 있다.

git log --graph --all --decorate

여기서는 이렇게 딱 두 갈래지만
실제 프로젝트를 진행해보면 여러 갈래들이 여기서 합치고 저기서 분기하고
굉장히 복잡해지는 경우가 많다.

이럴 때 모든 변경 내용들이 한 줄로 딱 깔끔하게 정리됐으면 좋겠다 싶을 때, merge 대신 rebase를 쓴다.

git rebase my-another-idea

SourceTree에서 결과를 보면 분기들이 깔끔하게 한 줄로 합져져 있는 걸 볼 수 있다.

SourceTree로 하는 법

하기 전에 원래 상태로 되돌리기

rebase 했던 거 취소하기

git reset --hard ORIG_HEAD

SourceTree에서 rebase를 하려면
'Merge(병합)' 대신 '재배치'를 선택해주면 된다.

한 줄로 깔끔하게 되었다.

프로젝트의 성격이나 팀의 필요에 따라 merge나 rebase 중 적절한 것을 선택해서 사용하면 된다.

다 쓴 브랜치를 삭제할 땐

git branch -D 브랜치명

SourceTree에서는 브랜치 우클릭 하고 삭제 클릭하고 강제 삭제 체크하고 없애면 된다.

바로 add, commit 하는 명령어들은
git add -A
git commit -m "메시지"
실제 프로젝트에서 지양하는 분들이 많다.

Pro Git 한글판은 한 번 쯤은 꼭 읽어보는 게 좋다.

Pro Git book
https://git-scm.com/book/ko/v2

0개의 댓글