본문 바로가기

카테고리 없음

Git&Github

*youtube 얄팍한 코딩사전님의 github 무료강의를 듣고 정리한 내용입니다.

https://youtu.be/1I3hMwQU6GU?feature=shared

 

Version Control System

파일의 변화를 추적하고 관리하는 시스템.

 

시간

: 프로젝트의 버전들을 얼마든지 넘나들 수 있음.

차원

: main파일 복사해다가 사본에서 작업하는것도 가능하지만, 프로젝트의 내용들을 마치 다른 폴더인것처럼 자유롭게 전환하고 변경사항들을 쉽게 적용할 수 있음.

 

Git을 사용하는 2가지 방법

CLI vs GUI

-CLI: 커맨드 라인 인터페이스, 터미널이나 Git Bash를 사용해서 명령어 입력으로 Git 사용, Git에서 뭔가를 실행하기 위한 명령어를 입력할 때 사용.

-GUI: 그래픽 유저 인터페이스, SourceTree 사용 -> 프로젝트 상태를 git상에서 자세히 살펴봐야할때 사용

 

GIT 설정 & 프로젝트 관리 시작하기

https://www.yalco.kr/@git-github/1-5/

 

Git 설정 & 프로젝트 관리 시작하기

어려운 프로그래밍 개념들을 쉽게 설명해주는 유튜브 채널 '얄팍한 코딩사전'. 영상에서 다 알려주지 못한 정보들이나 자주 묻는 질문들의 답변들, 예제 코드들을 얄코에서 확인하세요!

www.yalco.kr

*Git 전역 사용자명과 이메일 주소 설정

git config --global user.name "(본인 이름)"

git config --global user.email "(본인 이메일)"

*기본 Branch명 변경

git config --global init.defaultBranch main

 

VSCode에 작업 폴더를 생성하고,

해당 폴더를 git이 관리하도록 설정

Terminal창을 켠 후 해당 작업폴더 위치로 가서 "git init" 명령어 입력.

작업폴더로 가서 숨김파일 해제 상태로 보면 .git파일이 생성된 것을 볼 수 있다.

 

 

vs코드에서 파일 작성 후, "git status" 입력하면, 현재 작업 폴더에 있는 파일들의 상태를 보여줌.

+) SourceTree 설치해서 내 작업폴더 추가하기. create 버튼 눌러서 폴더 추가하면 됨.

 

*Git에게 맡기지 않을 것들 => ".gitignore"

보안상 민감한 정보를 담은 파일

자동으로 생성 or 다운로드되는 파일들(ex)Java에서 생성되는 class파일, 라이브러리 등)

 

 

git에게 맡기지 않을 파일로 secrets.yaml파일 생성

.gitignore라는 파일 생성 후, 제외할 파일명을 적어줌. 여기서는 secrets.yaml

-> git status 명령어를 입력해보면, secrets.yaml 파일은 제외된 것을 확인할 수 있음.

*.gitignore 작성 형식 문서 참조

https://git-scm.com/docs/gitignore

 

Git - gitignore Documentation

The optional configuration variable core.excludesFile indicates a path to a file containing patterns of file names to exclude, similar to $GIT_DIR/info/exclude. Patterns in the exclude file are used in addition to those in $GIT_DIR/info/exclude.

git-scm.com

 

 

[Git에서 시간여행하기]

*변화를 타임캡슐(각 버전들)에 담아 묻기

git add "파일명" 한 후 "git status"를 실행하면, new file: tigers.yaml이 changes to be commited이라고 나옴.

아직 커밋이 된 건 아니고 커밋할 준비가 되었다는 뜻.

"git add ."을 실행하면 아래와 같이 작업폴더의 전체 파일들이 커밋할 준비를 맞힘.

그럼 뭐하러 하나하나 커밋하는게 왜 필요할까? 버전마다 다른 캡슐에 넣어서 관리하고 싶을 때 파일마다 분리해서 커밋을 각 다른 버전의 타임캡슐에 관리할 수 있음.

 

이제 본격적으로 commit을 해보겠음.

FIRST COMMIT 저장 후 종료할 것임.

터미널에 "git commit" 입력 -> "i" 누르고 "FIRST COMMIT" 입력 후 esc키 누르기 

->:q!(아무것도 저장하지 않고 빠져나옴.),  :wq(저장하고 종료)

 

*작업Vi 명령어상세(출처: yalco 사이트)

입력 시작 i 명령어 입력 모드에서 텍스트 입력 모드로 전환
입력 종료 ESC 텍스트 입력 모드에서 명령어 입력 모드로 전환
저장 없이 종료 :q  
저장 없이 강제 종료 :q! 입력한 것이 있을 때 사용
저장하고 종료 :wq 입력한 것이 있을 때 사용
위로 스크롤 k git log등에서 내역이 길 때 사용
아래로 스크롤 j git log등에서 내역이 길 때 사용

 

이후 git commit을 해보면, 이미 FIRST COMMIT으로 작업폴더를 커밋한 상태이므로 nothing to commit이라는 문구가 뜸.

SourceTree History탭에 가면 확인할 수 있음.

 

->이 과정을 빠르게 하는 법: git commit -m "FIRST COMMIT"이라고 입력하면 커밋 메시지까지 함께 작성할 수 있음.

 

+) 모든 commit마다 고유의 문자열(식별코드같은것)을 가짐. "git log"를 치면 나옴.

 

작업폴더 파일들에 변화를 주기.

lions.yaml 파일 삭제, tigers.yaml 파일 내용 변경, leopards.yaml 파일 생성

이후 "git status"를 입력하면 파일 변동 사항들이 출력됨.

"git diff" 명령어는 변경사항을 좀 더 구체적으로 보여주는 명령어. (j: 내려가기,k: 올라가기)

 

다시 "git commit" -> "i" + Replace Lions with Leopards(새로운 버전명) -> esc키 + ":wq"

(혹은 git commit -m "Replace Lions with Leopards") 입력 후 Enter

이제 새 버전의 작업폴더가 또다른 타임캡슐에 담겼다고 보면 됨. (Commit 완료)

SourceTree에서 보면, 두가지 버전의 작업물이 커밋된 것을 확인할 수 있다.

git log도 한번 실행해보면, 두가지 commit 식별문자열이 찍힌다.

 

+) git add+ git commit 한번에 하는 법

단, 새로 추가된 파일이 없을 때만 가능.

git commit -am "(메시지)"

 

 

 

추가적 실습을 위해 3개의 커밋을 추가해 총 5개의 커밋을 생성했음.

 

 

[Git을 사용한 시간여행]

Git에서 프로그램을 과거로 되돌리는 방법: Reset vs Revert

Reset: 시간을 과거로 되돌리려면, 해당 과거로 돌아간 다음 이후 행적은 히스토리에서 지워버리는 것.

Revert: 과거 이후 행적을 삭제하는게 아니라, 이때의 변화를 거꾸로 수행하는 캡슐을 하나 넣음으로써 결과적으로 과거 히스토리와 같은 상태로 돌아가게 됨.

Revert

Revert가 필요한 이유?

만약 노란색 박스 안에 있는 내역들은 그대로 유지하면서

Replace Cheetas with Leopards에서 실행했던 내용만 취소해야 하는 경우, 

Replace Cheetas with Leopards에서 실행했던 내용을 거꾸로 실행하는 새 히스토리를 만들어서 추가해주면 해결이 된다.

 

개발자들은 git에 올라간 내역을 가지고 협업하는데, 한번 공유공간에 올라간 내역을 reset해버리면 그걸 기반으로 작업한 다른 사람들의 코드와 심각한 충돌을 일으키기 때문에 Revert가 필요함.

 

 

 

[Reset 실습]

현재 히스토리에서 Add team Cheetas부분으로 돌아가고 싶음.

"git log" -> Add team Cheetas 부분의 커밋 해시(식별코드같은것)를 복사 -> git reset --hard (돌아갈 커밋 해시)

해당 명령어를 실행한 후 VSCode 파일을 보면, 파일의 생성, 변경, 삭제 현황이 Add team Cheetas때로 돌아가있는 모습을 확인할 수 있음.

*Reset하기 전 커밋 내용들 복원하기

작업폴더의 .git 폴더를 삭제하고 그곳에 전에 백업해놨던 .git 폴더(Reset하기 전)를 작업폴더에 다시 붙여넣어보면,

히스토리 5개가 모두 다시 살아있는 것을 확인할 수 있다.(실무에서 쓰는 방식은 아님.)

 

 

 

[Revert로 과거의 커밋 되돌리기]

git revert (되돌릴 커밋 해시)->wq로 저장하고 빠져나오기

 

*commit 하지 않고 revert하기revert한 내용을 바로 commit하지 않고 추가적인 수정사항을 내포하여 commit하기 위할 때 사용

git revert --no-commit (되돌릴 커밋 해시)

[SourceTree로 진행해보기]

1) leopards.yaml 파일 delete

2) .gitignore 파일에 " *.config " 추가

3) hello.txt 파일 삭제

 

SourceTree에서 커밋하지 않은 변경사항들을 "스테이지로 올리기" 하면 아래와 같이 변경사항들이 표시됨.

소스트리 왼쪽 상단 커밋 아이콘을 누르고 'Commit with SourceTree'라고 입력 후 커밋 버튼을 눌러주면 커밋 완료.

*Revert: Add George to Tigers 의  수정사항 되돌리기 

-> 해당 커밋에 마우스 우클릭 -> "커밋 되돌리기..."->아래같은 창이 뜨면 "예" 누르기

*Reset: Replace Cheetas with Panthers 시점으로 되돌려보기

해당 커밋 마우스 우클릭 -> "이 커밋까지 현재 브랜치를 초기화" -> 선택지로 "HARD"를 선택 -> "확인" -> "예"

 

 

[차원 여행하기]

한번에 여러 모습의 프로젝트를 사용해야 할 때

ex) main용 서버, test용 서버, 디자인을 점안적으로 바꿔서 테스트해보거나 등등...

실제 배포용 버전과 아직 작성중인 불완전한 버전을 분리해야 함.

차후에 적용이 확정된 버전을 main 브랜치로 가져와서 합침.

이 모든것을 백업파일 만들 필요 없이 하나의 프로젝트 파일에서 가능하도록 해준다!

 

*기존 브랜치 말고 다른 branch를 생성해보기

git branch (브랜치명)

add-coach라는 브랜치를 아래와 같이 생성했음. 그 후 "git branch" 입력해서 생성된 branch들을 조회

브랜치 생성하기, 브래치 목록보기

add-coach, master 두개가 뜨는 것을 확인할 수 있음. 현재 branch는 master로 설정되어있음.

브랜치 스위치하기

git switch (스위치 할 브랜치명)을 입력한 후 "git branch"를 입력해보면, 브랜치가 add-coach로 switch 된 것을 확인할 수 있음.

 

*branch 생성과 동시에 이동하기

git switch -c (새 브랜치명)

"git branch" 해보면 브랜치 생성과 동시에 해당 브랜치로 switch되어있음을 확인할 수 있다.

브랜치 생성과 동시에 변경

 

*git branch 이름바꾸기

git branch -m (기존 브랜치명) (새 브랜치명)

master -> main으로 브랜치명을 변경했다.

브랜치명 변경

*브랜치 삭제하기

git branch -d (삭제할 브랜치명)

"git branch to-delete": to-delete라는 브랜치 생성

"git branch -d to-delete": 새롭게 생성한 to-delete라는 브랜치 삭제

"git branch"로 브랜치 목록들을 보면 제대로 지워진 것을 확인할 수 있음.

 

+) 다른 브랜치로 가져오지 않은 내용이 있는 브랜치를 지울 때는 -d(소문자) 대신 -D(대문자)로 강제 삭제 해줘야 함.

git branch -D (강제삭제할 브랜치명)

 

 

[각 브랜치에서 여러 다른 작업 해보기]

 

1. main branch

-Leopards members에 Olivia 추가

커밋 메시지: Add Olivia to Leopards

-Panthers members에 Freddie 추가

커밋 메시지: Add Freddie to Panthers

 

2. add-coach branch

- Tigers 매니저 정보 아래 coach: Grace 추가

커밋 메시지: Add Coach Grace to Tigers

-Leopards 매니저 정보 아래 coach: Oscar 추가

커밋 메시지: Add Coach Oscar to Leopards

-Panthers 매니저 정보 아래 coach: Teddy 추가

커밋 메시지: Add Coach Teddy to Panthers

 

3. new-teams branch

-pumas.yaml 파일 추가

커밋 메시지: Add team Pumas

-jaguars.yaml 파일 추가

커밋 메시지: Add team Jaguars

 

->이 과정들을 마치고 SourceTree로 가보면 가지치기 형식으로 3개의 branch가 생성된 것을 볼 수 있다.

 

[branch 병합하기]

위에서 생성한 branch 2개를 main branch에 병합하고 싶다면 어떻게 해야할까?

 

Merge vs Rebase

 

-Merge: 두 가지를 이어 붙이는 것, 히스토리에 브랜치의 흔적이 남음.

즉, 브랜치들을 죄다 냅두고 끝에만 모아서 정리하는 것.

뼈대가 되는 main 브랜치로 이동

여기서 내가 main브랜치에 병합할 브랜치를 add-coach라고 하겠다.

git merge add-coach

main 브랜치로 이동해서 "git merge add-coach"를 한 모습

*Merge는 reset으로 되돌릴 수 있다. merge도 하나의 커밋으로 보기 때문에

merge하기 전 해당 브랜치의 마지막 시점으로 돌아가면 merge를 되돌릴 수 있다.

merge를 마쳤으면 병합된 가지 브랜치는 삭제한다.

git branch -d add-coach

 

-Rebase: 브랜치의 마디, 커밋들을 대상 브랜치로 옮겨붙이는 것, 히스토리가 한줄로 깔끔히 정리됨.

곁가지들을 싹 다 잘라다가 줄기에 이어붙이는 것.

Merge는 main 브랜치로 이동해서 가지 브랜치르 병합했다면, Rebase는 그 반대이다.

우선 "new-teams" 브랜치로 이동한다.

git rebase main

그 후 rebase 뒤에 합칠 메인 브랜치명을 입력하여 브랜치를 병합한다.

브랜치 병합 후 new-teams는 브랜치 가지 끝까지 가있지만, main브랜치는 아직 이어붙인 접합부에서 히스토리가 멈춰있다. 따라서 main을 newteams의 위치로 옮겨줘야 한다.

"git switch main" 입력해 main 브랜치로 넘어오고 "git merge new-teams"를 다시 해준다.

main 브랜치의 싹을 맨 위로 다시 올려주는 느낌..?

new-teams 브랜치에서 rebase 한 후 main브랜치로 돌아와 new teams와 merge한 결과 main 가지가 new-teams와 같아짐.

 

 

branch 사용 내역을 남겨둘 필요가 있다면 Merge, 히스토리를 깔끔하게 정리하고 싶다면 Rebase를 사용하면 됨.

 

이제 병합 끝난 new-teams 브랜치는 삭제하고, "git branch"로 현황 보면 main 브랜치 하나만 남아음을 확인할 수 있다.