[Git]Git 시작하기
Updated:
Git 사용법
Git에 입문하기 위해 기본적인 Git 키워드와 원리들을 설명한다
1. Git 최초 설정
Git 전역으로 사용자 이름 & 이메일 주소 설정(GitHub계정과 별개)
// 설정
git config --global user.name '본인이름'
git config --global user.email '본인이메일'
git config --global init.defaultBranch '브랜치명'
// 확인
git config --global user.name
git config --global user.email
-> 주브랜치명은 과거 master로 사용하다가 최근엔 main으로 사용함
2. 프로젝트 생성 & Git 관리 시작
Git으로 관리할 폴더 설정
git init // git으로 관리하기 위한 키워드
git status // 해당 폴더 내에서 변경사항 있는지 check
-> Git 으로 관리하고자 하는 폴더의 위치에서 vsc 실행 후 터미널에 git init 명령어 입력하면 .git폴더가 생성됨
-> git으로 관리되고 있는 폴더에 특정 파일이 추가되었을 경우, git status 명령어를 통해 변화를 확인해볼 수 있음

위의 오류발생시 해당 폴더가 git으로 관리되고 있지 않는거라고 생각하면됨
주의!!!) .git 폴더는 지금껏 Git으로 관리한 버전 내역들이 들어있는 폴더로 삭제시 이전 버전들이 날아감
Git으로 관리하지 않을 것들
-> 보안상 민감하여 포함하지 말아야하는 경우 or 빌드결과물 등 굳이 포함할 필요가 없는 경우에 한해 .gitignore 파일을 사용하여 git으로 관리하지 않을 수 있음
-> .gitignore 파일 만들어서 관리하지 않을 파일 적어놓으면 해당 파일은 git status 목록에 뜨지 않음을 알 수 있음
file.c // 모든 file.c
./file.c // 현재 폴더의 file.c
*.c // .c 확장자명을 가진 파일
log/ // log폴더와 그 내용들
-> .gitignore 사용예시. 추가로 필요하면 git 공식문서 참조
3. 시간을 넘어 버전관리하기
프로젝트 변경사항 추가하기(add)

-> 빨간색으로 보여지는 파일 모두 Git의 관리를 받지 않는 상태
-> Git으로 관리하기 위해 먼저 git add 명령어에 대해 알아보자
git add async.js // 파일 하나 추가
git add . // 모든 파일 추가
git status // Git 상태확인

-> git status 명령어로 확인하면, 초록색으로 바뀌면서 commit을 기다린다는 메시지가 뜸
변화를 특정버전에 담기(commit)
git commit -m '작성할 메세지' // 변경사항 묻기
-> git commit 명령어를 사용하여 git add를 통해 추가한 변경사항을 버전에 묻을 수 있음

git log // 커밋내역 확인
-> 이후 git log 명령어를 통해 확인해보면, 메세지와 함께 커밋이 되었음을 확인가능
차이점 확인하기(diff)
git diff // 이전과의 차이점 check
-> git diff 명령어를 사용하여 이전과 달라진 차이점을 구체적으로 확인가능

-> git status를 통해서는 파일 수정, 삭제, 추가에 따라 변경사항을 볼 수 있음

-> 변경사항 git add, git commit 후 git log로 확인하면 변경되었음을 확인할 수 있음
4. 과거로 돌아가기
reset
-> 현재내역은 삭제하고 과거로 돌아가는 방식
git reset --hard '돌아가려는 커밋해시값' // 해당 커밋시점으로 돌아감
git reset --hard // 아직 커밋되지 않은 내역을 지우고 최종 커밋의 상태로 돌아감
-> git log를 통해 돌아갈 커밋 해시값을 찾아 git reset 하면 해당 시점으로 돌아갈 수 있음
-> 다만, 프로젝트 협업시 공유된 공간에 한번 이미 커밋된 내역을 reset해버리면 충돌문제가 발생할 수 있음 => 한번 공유가 된 커밋내역은 revert를 이용하여 되돌리자!!!
revert
-> reset과 다르게 시점은 현재인데, 특정 커밋값을 삭제하는 방식
git revert '돌아가려는 커밋해시값'
-> 현재상태에서 입력한 커밋해시값에 해당하는 커밋만을 취소하여 반영한 상태라고 생각하면됨
-> 마찬가지로 git log를 통해 돌아갈 커밋 해시값을 찾아 입력하면, 새로운 버전을 만들어 해당 내역을 추가할 수 있음
-> 특정시점 이전의 커밋내역은 놔두고, 특정시점의 커밋내역만 수정해야할 경우에 사용함
-> 이때, 커밋 메세지 default값은 ‘Revert (이전 메세지)’ 인데, 원한다면 수정가능
-> 충돌이 발생할 수 있는데, ‘git rm’을 통해 충돌파일을 삭제하고 ‘git revert –coninue’를 해주면됨
git revert --no-commit '돌아가려는 커밋해시값'
-> 위 명령어를 통해 커밋되지 않은 상태의 해당버전으로 돌아갈 수 있음
5. 차원 넘나들기
하나의 프로젝트를 ‘실제배포용, 테스트용, 새로운 시도용’ 등등 다양한 모습으로 관리하여야 할때 각각 다른 Branch에서 관리하고 확정된 것만 메인차원에 통합하는 방식을 사용한다!!!
Branch 생성하기
// Branch 생성
git branch '생성할 브랜치명'
// Branch 목록확인
git branch
// 해당 Branch로 이동
git swtich '브랜치명'
// 첫번째와 세번째 줄의 코드를 한번에 실행
git switch -c '생성할 브랜치명'
// Branch 삭제
git branch -d '삭제할 브랜치명'
// Branch 이름변경
git branch -m '기존 브랜치명' '변경할 브랜치명'
// 모든 브랜치의 커밋내역 확인
git log --all --decorate --oneline --graph
-> 생성된 브랜치는 각각 독립적인 git log를 가진다. 각각의 브랜치에서 수행한 커밋내역은 다른 브랜치에 적용되지 않음을 명심하자
-> ‘git log –all –decorate –oneline –graph’ 를 통해 다른 브랜치에서 수행한 커밋내역까지 모두 확인가능하다
Branch 병합하기
-> 여러가지 Branch를 병합하는 방법에는 Merge와 Rebase 2가지가 존재한다
-
Merge
-> 2개의 Brunch를 merge 한다고 예를 들면, 2개의 Brunch는 그대로 냅둔채로 끄트머리만 병합하는 방식이 바로 Merge이다
-> Brunch의 사용내역을 남겨둘 필요가 있는 프로젝트에서 사용한다. 단, Brunch가 그대로 남아있기 때문에, 지저분할 수 있다git merge '병합할 브랜치명'-> 여기서 ‘병합할 브랜치명’은 메인 브랜치에서 함께 병합할 또다른 브랜치명을 의미한다. 예를 들어, master에서 branch1을 병합하려고 하면, master branch로 swich해서 ‘git merge branch1’를 수행하면 된다
-> Merge에 의해 끄트머리에 새로 생성되는 것도 하나의 커밋이기 때문에 reset으로 되돌리기가 가능하다
-> Merge을 마친후 ‘git branch -d’를 통해 merge 완료한 브랜치를 삭제해주면 된다 -
Rebase
-> 2개의 Brunch를 rebase 한다고 예를 들면, Brunch를 없애고 기존의 Brunch에 제거한 Brunch에 있던 커밋내역들을 이어붙이는 방식이다
-> Brunch의 사용내역을 남겨둘 필요가 없고 커밋내역을 깔끔히 정리해야 하는 프로젝트에서 사용된다
-> 협업시에 이미 공유된 커밋내역에 관해서는 rebase를 사용하지 않는 것이 권장된다// rebase작업 git rebase '현재 브랜치를 포함시킬 브랜치명' // master브랜치를 rebase한 마지막 커밋내역으로 위치시키기 위한 코드 git merge '함께 rebase한 브랜치명'-> Merge와 다르게 Rebase수행시에 적을 브랜치명은 ‘어디로 현재 브랜치를 이어붙일 것인지’에서 ‘어디’에 해당한다
-> branch2를 master에 rebase시킨다고 가정할때, 위 명령어를 실행하면 branch2는 마지막 커밋내역에 위치하는 반면, master는 branch2의 커밋내역들을 이어붙이기 전의 커밋에 위치한다. 그러므로 추가적으로 master브랜치에서 branch2를 merge하는 작업이 요구된다
-> 마찬가지로 Rebase을 마친후 ‘git branch -d’를 통해 rebase 완료한 브랜치를 삭제해주면 된다
Branch 병합시 충돌문제
-> 위의 예시는 다른 파일간 혹은 같은 파일이라도 다른부분을 수정할 경우의 예시이다. 만약, 같은 파일의 같은 위치에 다른 내용이 있는 브랜치들끼리 병합할 경우, 충돌문제가 발생한다
Merge 충돌
-> 같은 파일의 같은 위치에 다른 내용이 있다면 둘 중 하나를 선택하거나, 둘 모두를 적용시킬 수 있다. 본인이 원하는대로 처리한 후에 ‘git add .’, ‘git commit’을 해주면 최종적으로 병합에 성공한 것이다
git merge --abort // Merge 중지
-> 만약 즉각적인 충돌 해결이 어려울 경우, 위 명령어를 통해 Merge를 잠시 중지하는 방법도 존재한다
Rebase 충돌
-> Merge와 달리 Rebase는 해당 커밋내역들을 일일이 병합할 브랜치로 옮기는 것이기 때문에, 각각의 커밋내역들마다 충돌을 해결해줘야하는 번거로움이 있다. Rebase하려는 커밋내역 개수만큼 Merge충돌 과정을 반복해준다고 생각해주면 된다
-> 같은 파일의 같은 위치에 다른 내용이 있다면 둘 중 하나를 선택하거나, 둘 모두를 적용시킬 수 있다. 본인이 원하는대로 처리한 후에 ‘git add .’를 먼저 해준다. 이후 Merge와는 다르게 ‘git rebase –continue‘를 통해 다음 충돌을 해결해야 한다. 이 과정을 반복하다가 오류가 모두 해결되면 충돌이 해결된 것이다. 마지막으로 Rebase답게 ‘git merge’를 통해 master브랜치를 가장 최근 커밋내역으로 옮겨줘야한다
git rebase --abort // Rebase 중지
-> Merge와 마찬가지로 즉각적인 충돌 해결이 어려울 경우, 위 명령어를 통해 Rebase를 잠시 중지하는 방법도 존재한다
6. GitHub 시작하기
-> Git으로 관리되는 프로젝트의 원격 저장소로 프로젝트 진행간 협업에 필수적인 tool
-
Repository 생성

-
새작업 or 기존작업 Repository에 올리기
-> 첫 작업 시에는 위의 코드를, 기존 작업하던 것을 Repository에 올리려고 한다면 아래 코드를 입력해주면 됨
git remote add origin '원격 저장소 주소' // local의 Git 저장소와 원격 저장소 연결(원격 저장소로 이름을 origin으로 설정)
git branch -M main // 기존 브랜치명을 master에서 main으로(GitHub 권장사항)
git push -u origin main // local의 커밋내역들을 origin 원격 저장소의 main브랜치로 업로드(한번 사용이후부턴 git push로 가능)
git remote // 현재 어떤 원격저장소에 연결되어 있는지 확인
cf> 협업시에 GitHub 홈페이지 올린 프로젝트를 다운받을때, Download ZIP이 아니라 ‘git clone’ 명령어를 통해 받아와야 ‘.git’ 폴더까지 가져올 수 있음
git clone '가져올 원격 저장소 주소'
-> 여기서 주소는 아래 그림의 https주소를 복붙하면됨

push & pull
-> push 키워드를 통해 local의 커밋내역들을 원격 저장소로 올리고, pull을 통해 원격 저장소의 커밋내역을 local로 가져온다
git push // 한번 -u 옵션 쓴 이후에는 이와 같이 사용해도 무방
git pull
=> 원격저장소의 커밋내역보다 local의 커밋내역이 최신이 아니라면 git push 명령어를 실행해도 아래와 같은 오류가 발생함

-> 이런 경우 git pull을 먼저 받아야 하는데, 2가지 방식으로 해결가능하다
git pull --no-rebase // Merge방식
git pull --rebase // Rebase방식
-> 위의 코드는 local과 원격저장소의 커밋내역을 2개의 Branch로 분기한 후 다시 하나로 Merge하는 방식이고, 아래의 코드는 원격의 커밋내역을 먼저 pull한후 local의 커밋내역을 그 이후에 이어붙이는 방식이다
-> 협업시에 Rebase 사용하지 않는 것이 좋다고 했지만, pull 상의 Rebase는 사용해도 O.K
git push --force
-> local의 커밋내역을 강제로 원격에 올리는 방식
-> 협업시 상의전에는 되도록이면 사용X(개인 Repository에서만 사용권고)
원격의 Branch
- local to 원격
git branch -a // local과 원격의 모든 Branch 나열-> local에서 새로운 브랜치를 만들고 ‘git push -u origin 브랜치명’을 통해 원격에 올리면 원격에서도 새로운 브랜치가 생성된다
-
원격 to local
-> 해당 창을 통해 원격에서 Branch를 만드는 것이 가능하다. 이는 다른 팀원이 생성한 브랜치와 다름없다
-> 이후 ‘git branch -a’ 를 통해 확인해봐도 변경사항이 확인되지 않는데, 이는 아직 원격의 변경사항을 local이 인지하지 못했기 때문이다git fetch // 원격의 변경사항 확인 git switch -t '원격명'/'브랜치명' // fetch를 통해 확인한 원격의 브랜치 변경사항을 local의 브랜치에도 적용-> 위 명령어들을 통해 팀원들이 변경한 브랜치 내역들을 local에 적용하여 사용할 수 있다
git push '원격명' --delete '원격의 브랜치명' // 원격의 해당 브랜치 삭제
Leave a comment