준비물: GitHub ID
1st commit에 있어 가장 복잡하게 다가왔던 부분입니다.
GitHub에 commit을 하려 하는데, git은 무엇이기에 필요한 것일까요?
Git is a version control system that lets you manage and keep track of your source code history. GitHub is a cloud-based hosting service that lets you manage Git repositories.
나의 코드를 로컬 및 온라인에서 관리할 수 있도록 도와주는 프로그램이 git과 GitHub입니다.
https://git-scm.com/downloads
자신이 사용 중인 운영체제에 맞는 버전을 다운받아 설치하면 됩니다.
수많은 옵션이 당황하게 만들지만, 1st commit의 진행은 default 옵션으로 진행해도 아무런 문제가 발생하지 않습니다. 침착하게 Next를 눌러 설치를 마무리해줍니다.
만약 옵션들의 의미가 궁금하다면 멋지게 정리해주신 블로거분의 글을 참고합시다.
Git 설치하기(2.35.1 이상, 상세한 설치법) https://taewow.tistory.com/13
로컬 저장소(repository)를 관리할 준비를 마쳤으니, 온라인 저장소를 생성해줍니다.
로그인 이후 우측 상단의 + 아이콘을 눌러 New repository를 클릭합니다.
저장소의 이름을 작성해주고, 각종 옵션을 원하는대로 설정 후 생성해줍니다.
첫 번째로 생성한다면 다른 옵션은 변경하지 않는 것을 추천합니다.
첫번째 저장소가 생성되었습니다.
Quick setup의 HTTPS주소를 복사하고, 다시 로컬 저장소로 이동합니다.
온라인에 프로젝트를 업로드할 공간을 만들었지만,
실제로 우리가 작업할 공간은 로컬 컴퓨터의 폴더입니다. 이것을 생성해줍시다.
원하는 곳에 원하는 이름의 로컬 프로젝트 폴더(디렉토리)를 생성합니다.
GUI형식의 익숙한 방법도 괜찮지만, 모처럼이니 git을 사용하는 방법을 소개합니다.
우선 git이 정상적으로 설치되었는지 확인합니다.
$ git --version
git이 정상적으로 설치되었다면, 현재 설치된 git의 버전이 표시됩니다.
git version 2.37.3.windows.1
프로젝트를 수행할 공간(폴더)를 생성해줍니다.
$mkdir [project name]
만들어진 디렉토리로 이동합니다.
$cd [project name]
터미널에 ~/[project name]이 추가되었음을 확인한 후 진행합니다.
혹은 다음 명령어를 통해 현재 작업중인 디렉토리를 표시할 수 있습니다.
$pwd
새롭게 만든 repository를 Git으로 관리하기 위해 다음 명령어을 입력합니다.
$git init
Initialized empty Git repository in C:/Users/jinhe/trst/.git/
위와 같은 문구가 출력되면 바르게 Initializing된 것입니다.
해당 프로젝트 폴더 내에 .git 폴더가 생성되었고, 이제 Git은 현재 repository에 대한 모든 변경사항들을 추적 및 관리할 수 있게 됩니다.
$vi README
README라는 파일을 생성했습니다.
지금부터 이 파일을 commit하고 GitHub repository까지 push해봅시다.
Git에서 Commit이란, 프로젝트 진행에서 체크포인트라고 생각하면 됩니다.
코드의 변경 사항에 따라 필요한만큼 커밋을 생성해두면, 커밋 앞뒤로 자유롭게 이동하며 프로젝트 코드의 변경사항들을 쉽게 확인할 수 있습니다.
$git status
코드를 커밋하기 이전에, Git으로 관리되지 않은 파일이 있는지 확인할 수 있습니다.
방금 생성해준 README 파일이 붉게 표시되어 커밋하지 않았음을 확인했습니다. 코드를 staging area에 추가하고, 커밋을 진행해줍시다.
$git add *
$git add [file name]
add * 는 모든 파일을 추가하는 명령어입니다.
또는 파일명을 지정하여 입력하면 특정 파일만을 추가할 수 있습니다.
다시 스테이터스를 확인해보면 파일명이 초록색으로 바뀌었습니다.
이제 commit을 진행할 수 있습니다.
$git commit -m "[Message]"
-m은 commit 메시지를 추가하는 옵션입니다.
추후에 커밋으로 변경된 사항을 알 수 있는 짧은 설명을 작성해줍니다.
이제 변경사항(commit)을 온라인 저장소(repository)에 업로드할 차례입니다.
로컬 저장소에게 나의 온라인 저장소가 어디인지 알려주는 것이 첫번째입니다.
$git remote add origin [repository 주소]
이 repository 주소는 GitHub 저장소를 생성하고 복사해 둔 Quick setup의 HTTPS주소입니다. 바르게 연결되었는지 확인하기 위해 다음 명령어를 입력합니다.
$git remote -v
저장소 주소가 origin으로 기록되었다면, 이제 push를 진행할 수 있습니다.
현재 GitHub의 main branch는 "main"이지만,
로컬 branch의 default name은 "master"입니다.
지금부터는 GitHub의 main branch에 push하는 방법을 소개합니다.
현재 branch name을 GiHub의 default branch name인 main으로 변경해줍니다.
$ git branch -M [변경할 branch name]
branch name이 변경되었습니다.
$ git push -u origin main
push가 완료됩니다. 온라인 저장소에 commit되었음을 확인할 수 있습니다.
개인 프로젝트의 1st commit이라면 이렇게 문제없이 진행됩니다.
하지만 협업 등에서 commit을 진행할 때, main branch에 1st commit을 진행하려 해도 오류가 발생하는 경우가 있습니다.
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
바로 협업자가 먼저 commit을 진행한 경우입니다.
이미 push해둔 파일의 데이터가 손실될 우려가 있기에 git에서 막아둔 상황입니다.
해결 방법은 2가지가 있습니다.
$git push -u origin +master
$git push -u origin master -f
이 방법은 대체로 사용해서는 안됩니다.
쉽게 말하면 현재 내 저장소를 강제로 GitHub 저장소에 덮어씌우는 명령어입니다.
당연히 GitHub에 존재하는 다른 파일은 전부 유실됩니다.
이를 막기 위해서, GitHub 파일을 내 저장소로 가져오는 동기화 작업이 필요합니다.
GitHub 저장소의 파일을 나의 로컬 저장소로 가져오는 명령어가 바로 pull입니다.
$ git pull origin [branch name]
pull이 바르게 완료되었나 했더니, 여전히 push에서 오류가 발생합니다.
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
원격 저장소의 최종 commit을 따라가지 못한 현재의 branch 상태가 문제가 됩니다.
아래의 명령어를 사용하여 최종 commit한 시점으로 동기화해줄 수 있습니다.
$ git pull --rebase origin [branch name]
이 시점에서 로컬 저장소 폴더가 GitHub main branch와 동일한 파일로 구성되었을 것입니다. 그리고 다시 push를 진행해줍니다.
성공적으로 push가 완료되었습니다.
GitHub의 저장소 main branch에 commit이 추가되었음을 확인 가능합니다.