반응형

Git와 GitHub를 사용해보며 알게된 점들을 정리하기 위해 만든 포스트입니다.  

포스트 작성 후, 재검토해보며 터미널의 결과를 수정해서 스크린샷과 터미널의 실행 결과(해쉬코드 같은 것)에 차이가 있을 수 있습니다. 

 

윈도우를 기반으로 진행하고 있지만 우분투에서도 같은 명령을 사용하여 진행 가능합니다. 

단지 윈도우와 리눅스의 파일시스템 관련 명령어만 차이가 있습니다. 



다음 글들을 참고했습니다. 

 

https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners 

 

https://goddaehee.tistory.com/274 




2021. 8. 23 - 최초작성

 

2021. 9. 17

 

GitHub에서 인증시 토큰을 사용하도록 바뀐점 반영

 

다음과 같은 에러가 발생합니다.

 

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.

fatal: Authentication failed for 'https://github.com/webnautes/example.git/'




0. Git 설치

Git는 분산 버전 관리 도구입니다. 

변경된 파일을 관리하고 여러 사람이 동시에 작업하는 것을 조율합니다. 

Ubuntu

다음 명령을 사용하여 설치합니다. 

 

$ sudo apt update

 

$ sudo apt install git



Windows

 

아래 링크에서 64-bit Git for Windows Setup를 클릭하여 다운로드합니다. 

https://git-scm.com/download/win



별다른 옵션 변경없이 설치를 진행하면 됩니다. 

 



1. GitHub 가입

GitHub는 분산 버전 관리 도구인 git을 웹상에 호스팅해주는 서비스입니다. 

GitHub없이 Git은 사용할 수 있지만 Git없이는 GitHub를 사용할 수 없습니다. 



아래 링크에 접속하여 GitHub 계정을 생성합니다. 

https://github.com/join 

 




2. 로컬 저장소 생성

git는 새로운 프로젝트를 저장할 디렉토리를 생성하고 이 디렉토리를 로컬 저장소(repository)로 사용할 수 있도록 설정해줍니다. 

참고로 PC의 하드 디스크에 만들어진 경우 로컬 저장소, GitHub 처럼 다른 곳에 만들어진 경우 원격 저장소라고 합니다.    



윈도우의 경우 명령 프롬프트에서, 우분투의 경우 터미널에서 진행합니다. 



디렉토리를 생성하고 해당 디렉토리로 이동합니다. 

 

C:\Users\webnautes>mkdir project

 

C:\Users\webnautes>cd project



다음 명령으로 Git 저장소를 초기화합니다. 

 

C:\Users\webnautes\project>git init

Initialized empty Git repository in C:/Users/webnautes/project/.git/



 .git 디렉토리 내에 저장소 관리를 위해 필요한 디렉토리 및 파일들이 생성됩니다. 우분투에서는 ls .git 명령을 사용하세요. 

 



3. 저장소에 새로운 파일 추가

우분투에서는 익숙한 편집기( nano, vim 등)를 사용하여 파일 내용이 1234인 newfile.txt 파일을 생성합니다. 



윈도우에서 진행해보기 위해  명령 프롬프트를 실행한 후,  현재 위치에서 메모장을 실행하여 새로운 파일 newfile.txt을 생성한 다음 1234를 입력하고 저장했습니다. 

 

C:\Users\webnautes\project>notepad newfile.txt



뒤에서 사용할 예정이니 파일 이름에 1234를 입력해두세요. 



현재 위치에 newfile.txt라는 파일이 생성된 상태입니다. 우분투에서는 dir 대신 ls 명령을 사용하세요. 

 



git에서 새로운 파일이 로컬 저장소에 추가된 것을 감지하게 됩니다. git 상태를 확인할 수 있는 git status 명령으로 확인해보면 newfile.txt가 Untracked files에 추가된 것을 볼 수 있습니다. git에서 파일의 변경을 감지했지만 아직은 추적하지 않는 상태라는 의미입니다. 



C:\Users\webnautes\project>git status

On branch master

 

No commits yet

 

Untracked files:

  (use "git add <file>..." to include in what will be committed)

        newfile.txt

 

nothing added to commit but untracked files present (use "git add" to track)




4. 스테이징 환경에 파일 추가 

git add 명령을 사용하여 스테이징 환경에 파일을 추가합니다. 

 

C:\Users\webnautes\project>git add newfile.txt



git status 명령을 사용하면 커밋할 변경사항(Changes to be committed:)에 newfile.txt 파일이 추가된 것을 볼 수 있습니다. 

스테이징 환경(staging environment)에 파일이 추가되었음을 의미합니다. 

 

C:\Users\webnautes\project>git status

On branch master

 

No commits yet

 

Changes to be committed:

  (use "git rm --cached <file>..." to unstage)

        new file:   newfile.txt




5. 커밋 생성

앞에서 스테이징 환경에 변경된 사항이 올라갔습니다. 

이제 변경된 사항을 커밋(commit) 단위로 패키징하여 기록으로 남길 수 있습니다.   



다음 명령을 사용하면 현재 스테이징 환경에 올라가 있는 모든 변경사항이 하나의 커밋으로 기록됩니다.  

 

git commit -m “변경된 사항 설명”



커밋을 다음처럼 실행할 수 있습니다.

아직 이메일 주소를 등록하지 않았다면 다음과 같은 에러가 발생합니다. 

 

C:\Users\webnautes\project>git commit -m "새로운 파일 추가"

Author identity unknown

 

*** Please tell me who you are.

 

Run

 

  git config --global user.email "you@example.com"

  git config --global user.name "Your Name"

 

to set your account's default identity.

Omit --global to set the identity only in this repository.

 

fatal: unable to auto-detect email address (got 'webnautes@DESKTOP-8TRVTF8.(none)')



위에서 빨간색으로 표시한 명령을 사용하여 이메일을 등록해야 합니다. 

첫번째 명령은 GitHub 계정에서 사용한 이메일 주소를 사용하여 실행하세요. 두번째 명령은 GitHub 상의 저장소에 표시되는 이름 입니다. 



C:\Users\webnautes\project>git config --global user.email "webnautes@⬛⬛⬛⬛⬛⬛"

 

C:\Users\webnautes\project>git config --global user.name "webnautes"



정상적으로 커밋이 생성되었다면 다음과 같은 메시지가 보입니다. 

 

C:\Users\webnautes\project>git commit -m "새로운 파일 추가"

[master (root-commit) 1fcf393] 새로운 파일 추가

 1 file changed, 1 insertion(+)

 create mode 100644 newfile.txt



git status로 확인해보면 변경된 사항이 모두 커밋되었기 때문에 다음처럼 보이게 됩니다. 

 

C:\Users\webnautes\project>git status

On branch master

nothing to commit, working tree clean




6. GitHub에 저장소 생성

로컬 저장소를 GitHub에 올려서 다른 사람과 공유할 수 있도록 하려면 필요한 작업입니다.



GitHub에 접속하여 로그인합니다. 

https://github.com/ 




GitHub에서 인증시 토큰을 사용하도록 변경되어 추가 작업이 필요합니다.

오른쪽 위에 있는 프로필을 클릭하여 메뉴에서 Settings를 클릭합니다. 

 





왼쪽에 보이는 메뉴에서 Developer settings를 클릭합니다. 

 




왼쪽에 보이는 메뉴에서 Personal access tokens를 클릭합니다. 






Generate new token을 클릭합니다. 

 




사용 용도를 적습니다.

 



토근 만료일을 지정할 수 있습니다. 만료일 없음(No expiration)은 권장하지 않고 있습니다.

 




저장소만 사용할거라 Repo만 체크했습니다. 다른 권한 항목들이 많습니다.

 



Generate token을 클릭합니다.

 



생성된 토큰을 복사해둡니다. 

 




생성된 토큰은 Personal access tokens을 클릭하면 볼 수 있습니다. 

 




이제 새로운 저장소를 생성합니다.

 

오른쪽 위에 보이는 프로필 옆에 있는 + 기호를 클릭하여 보이는 메뉴에서 New repository를 선택합니다. 

 




Repository name에 저장소 이름을 적어주고 저장소 공개여부를 지정하기 위해 Public 또는 Private를 선택합니다. 

Add a README file을 체크하고(이 파일에 저장소에 대한 설명을 추가할 수 있습니다.) Create repository 버튼을 클릭합니다. 

 




다음과 같은 페이지가 보이게 됩니다. 

 




초록색 Code 버튼을 클릭 후, 빨간색 사각형 부분을 클릭하여 저장소 주소를 복사하여 메모장 등에 붙여놓기 해둡니다. 

 





주의 ) 최근 GitHub의 메인 브랜치 이름이 master에서 main으로 변경되었습니다.

맞취주는 게 좋을듯 한데 다른 의견이 있으시면 댓글로 남겨주세요. 

 

로컬  저장소의 메인 브랜치 이름이 현재는 master인데 GitHub에 업로드 전  main으로 변경해야 합니다. 

왜냐하면 GitHub의 메인 브랜치 이름이 main으로 변경되었기 때문입니다. 



git branch -m 명령을 사용하여 로컬 저장소의 메인 브랜치 이름을 master에서 main으로 변경합니다.   



현재 메인 브랜치의 이름은 master입니다.

 

C:\Users\webnautes\project>git branch

* master



브랜치의 이름을 master에서 main으로 변경합니다.

 

C:\Users\webnautes\project>git branch -m master main

 

이제 메인 브랜치의 이름은 main입니다. 

 

C:\Users\webnautes\project>git branch

* main




로컬 저장소 위치에서 다음 명령을 사용하여 GitHub에 새로 생성한 원격 저장소로 업로드할 수 있습니다. 

빨간색 주소 부분은 앞에서 복사해둔 주소로 변경하세요. 

 

C:\Users\webnautes\project>git remote add origin https://github.com/webnautes/example.git



GitHub 저장소에 있는 내용을 로컬 저장소에 반영합니다. 

앞에서 GitHub 저장소에 README 파일을 추가했기 때문에 필요합니다. 

 

C:\Users\webnautes\project>git pull origin main --allow-unrelated-histories

remote: Enumerating objects: 3, done.

remote: Counting objects: 100% (3/3), done.

remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

Unpacking objects: 100% (3/3), 579 bytes | 10.00 KiB/s, done.

From https://github.com/webnautes/example

 * branch            main       -> FETCH_HEAD

 * [new branch]      main       -> origin/main

Merge made by the 'recursive' strategy.

 README.md | 1 +

 1 file changed, 1 insertion(+)

 create mode 100644 README.md




이제 로컬 저장소를 GitHub 저장소에 업로드합니다. 

Userrname에는 깃허브의 사용자 이름을 적고

Password에는 앞에서 복사해둔 토큰을 붙여넣기 합니다.

윈도우의 명령 프롬프트 창에선 마우스 우클릭하면 붙여넣기가 되지만 입력된 토큰이 보이진 않습니다. 

바로 엔터를 누르면 됩니다. 

 

C:\Users\webnautes\project>git push -u origin main

Username for 'https://github.com': webnautes

Password for 'https://webnautes@github.com':



토큰 생성시  만료일 없음(No expiration)을 선택안했다면 정기적으로 이 작업이 필요해보입니다.

 

 

문제 없다면 다음처럼 GitHub에 있는 원격 저장소에 업로드가 잘된 것을 볼 수 있습니다. 

 

C:\Users\webnautes\project>git push -u origin main

Username for 'https://github.com': webnautes

Password for 'https://webnautes@github.com':

Enumerating objects: 6, done.

Counting objects: 100% (6/6), done.

Delta compression using up to 8 threads

Compressing objects: 100% (3/3), done.

Writing objects: 100% (5/5), 486 bytes | 486.00 KiB/s, done.

Total 5 (delta 0), reused 0 (delta 0), pack-reused 0

To https://github.com/webnautes/example.git

   41fa425..88da063  main -> main

Branch 'main' set up to track remote branch 'main' from 'origin'.



GitHub 저장소 페이지에서 F5를 눌러주면 newfile.txt가 보이고 옆에 commit시 추가했던 메시지가 보입니다. 







7. 새로운 브랜치 생성 및 GitHub에 업로드

기존 프로젝트를 변경하지 않고 새로운 기능을 추가하는 작업을 진행하고 싶을 때 새로운 브랜치(branch)를 생성할 수 있습니다.

기존 프로젝트를 복사해와서  기존 프로젝트에 영향을 주지 않고 작업을 진행하게 됩니다. 새로운 브랜치도 Git이 별도로 변경사항을 기록하고 추적합니다. 

새로운 브랜치에서 기능 추가하는 작업이 완료된 후, 기존 프로젝트가 저장된 브랜치와 병합할 수 있습니다.



현재 활성화된 브랜치를 확인합니다.   *가 붙어 있는 브랜치가 현재 활성화된 브랜치입니다.

 

C:\Users\webnautes\project>git branch

* main



Git 상태 확인시  On branch 뒤에 현재 브랜치 이름이 출력됩니다.  

원격 저장소에 업로드가 되었기 때문에 “Your branch is up to date with 'origin/main'.” 메시지가 보입니다. 

main 브랜치 이름 앞에 origin/이 붙어있는 것은 원격 저장소라는 의미입니다. 

 

C:\Users\webnautes\project>git status

On branch main

Your branch is up to date with 'origin/main'.

 

nothing to commit, working tree clean



원격 저장소에서 정보를 다시 가져온 후, 원격 저장소의 브랜치 리스트를 확인해봅니다.  

 

C:\Users\webnautes\project>git remote update

Fetching origin

 

C:\Users\webnautes\project>git branch -r

  origin/main




dev라는 이름의 새로운 브랜치를 생성합니다.

 

C:\Users\webnautes\project>git branch dev



현재 브랜치 상태를 확인합니다. 현재 dev, main 브랜치 2개가 있으며 현재 활성화된 브랜치는 *가 붙어있는 main입니다. 

 

C:\Users\webnautes\project>git branch

  dev

* main



새로 생성한 dev 브랜치로 이동합니다.  Switched to branch 뒤에 이동한 브랜치 이름이 출력됩니다. 

 

C:\Users\webnautes\project>git checkout dev

Switched to branch 'dev'



확인해보면 *가 dev로 이동했음을 볼 수 있습니다. 활성화된 브랜치가 이젠 dev입니다.   

 

C:\Users\webnautes\project>git branch

* dev

  main



참고로 다음 하나의 명령으로 새로운 브랜치 dev2를 생성한 후, dev2 브랜치로  바로 이동할 수도 있습니다. 

git checkout -b dev2



현재 디렉토리를 확인해보면 main 브랜치와 동일한 파일들(newfile.txt, README.md) 파일이 있는 것을 볼 수 있습니다. 

 



newfile.txt 파일을 열어서 다음처럼 수정하고 저장합니다. 

 

수정전 수정후
1234 5678
1111



git 상태를 확인해보면 변경사항이 있습니다. 첫줄을 보면 현재 활성화된 브랜치가 dev 브랜치라는 것을 알 수 있습니다. 

 

C:\Users\webnautes\project>git status

On branch dev

Changes not staged for commit:

  (use "git add <file>..." to update what will be committed)

  (use "git restore <file>..." to discard changes in working directory)

        modified:   newfile.txt

 

no changes added to commit (use "git add" and/or "git commit -a")



변경된 사항을 저장소에 커밋합니다. 

 

C:\Users\webnautes\project>git add newfile.txt

 

C:\Users\webnautes\project>git commit -m "약간의 수정"

[dev 449bcff] 약간의 수정

 1 file changed, 2 insertions(+), 1 deletion(-)



이제는 더이상 변경사항이 없기때문에 커밋할 것도 없습니다. 

 

C:\Users\webnautes\project>git status

On branch dev

nothing to commit, working tree clean



dev 브랜치는 새로 생성한 브랜치이기 때문에 GitHub에는 존재하지 않습니다. 

처음 push시에는 --set-upstream 옵션을 추가해줘야 합니다. --set-upstream 옵션은 -u 옵션으로 대체 가능합니다.  

 

C:\Users\webnautes\project>git push -u origin dev

Enumerating objects: 5, done.

Counting objects: 100% (5/5), done.

Delta compression using up to 8 threads

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 299 bytes | 299.00 KiB/s, done.

Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

remote:

remote: Create a pull request for 'dev' on GitHub by visiting:

remote:      https://github.com/webnautes/example/pull/new/dev

remote:

To https://github.com/webnautes/example.git

 * [new branch]      dev -> dev

Branch 'dev' set up to track remote branch 'dev' from 'origin'.




이후에는 --set-upstream 옵션없이 push만 하면 됩니다. 

C:\Users\webnautes\project>git push origin dev



GitHub에서 확인해보면 브랜치 개수가 2개로 바뀌었고 dev 브랜치가 추가된 것을 볼 수 있습니다. 

 

 



dev 브랜치로 이동하여 수정된 파일도 볼 수 있습니다. 





상단에 초록색 버튼  Compare & pull request가 보입니다. 




8. pull request (PR) 생성하기 

pull request는 깃허브에 있는 저장소 소유자에게 코드 변경을 알리고 싶을때 사용할 수 있는 방법입니다. 

변경사항을 메인 브랜치 main에 반영하기 전에 저장소 소유자가 변경된 코드를 리뷰해볼 수 있습니다.  



상단에 보이는 초록색 버튼  Compare & pull request를 클릭합니다. 

 



다음과 같은 화면이 보입니다. 

커밋한 내용에 대한 제목과 내용을 적은 후, Create pull request를 클릭하면 됩니다. 

 



화면 아래로 스크롤해보면 다음처럼 그동안 변경한 내용들이 보입니다. 

왼쪽이 변경전,  오른쪽이 변경 후입니다.

 

왼쪽에 1234앞에 - 가 보이는데 이 줄을 제거했다는 의미입니다.

오른쪽에 5678, test 앞에 +가 보이는데 이 줄들을 추가했다는 의미입니다. 

 




Create pull request를 클릭하면 다음처럼 보입니다. 

아래쪽에 초록색 버튼 Merge pull request가 보입니다. 이 버튼을 클릭해야 메인 브랜치 main에 수정된 코드가 반영되는 절차가 시작됩니다. 

 

“This branch has no conflicts with the base branch” 라는 메시지가 보이는 것은 main 브랜치와 dev 브랜치에 있는 파일이 충돌(conflict)이 없다는 의미입니다. conflict는 두 브랜치에 있는 코드 중 한쪽을 선택해야 하는 경우가 발생하게 된다는 의미입니다. 이 부분은 추후 해볼 예정입니다. 

 






9. pull request 머지(Merge)하기 

Merge pull request 버튼을 클릭하면 다음처럼 Confirm merge 버튼이 보입니다. 

머지(merge)는 두 브랜치를 하나로 합친다는 의미입니다. 여기에선 dev 브랜치에 있는 파일들을  메인 브랜치인 main으로 가져와 dev 브랜치의 변경사항을 main 브랜치에 반영시킵니다.   

 



Confirm merge 버튼을 클릭하면 머지가 완료되었다고 메시지가 보이면서 dev 브랜치를 지울지 물어봅니다. 

Delete branch 버튼을 클릭하면 GitHub에 있는 저장소의 dev 브랜치가 삭제됩니다. 로컬에 있는 dev 브랜치는 GitHub 저장소의 변경된 사항을 다운로드 받아올때 삭제됩니다. 



어떻게 Git을 사용할지에 때라 여기서 브랜치를 삭제할지 선택하면 될 듯합니다. 

 

새로운 기능을 추가할 때마다 새로운 브랜치를 생성하여 작업한 후, 메인 브랜치에 머지하고 기능 추가시 사용한 브랜치를 삭제할거라면 여기서 삭제하면 됩니다. 

 

그게 아니라 dev 브랜치에서 작업을 계속 진행하고 필요할 때마다 메인 브랜치에 머지할 거라면 여기서 브랜치를 삭제할 필요가 없습니다. 

 

여기에선 Delete branch 버튼을 클릭하여 dev 브랜치를 삭제하고 진행합니다. 

 



다음처럼 dev 브랜치가 삭제되었다는 메시지가 보입니다. 

 



왼쪽 상단에 보이는 저장소 이름(빨간색 사각형 부분)을 클릭하면 GitHub 저장소 메인 페이지로 돌아옵니다.  

 



오른쪽 상단을 보면 5 commits가 보입니다. 커밋이 5개라는 의미입니다. 이 부분을 클릭해보면

 



왼쪽 상단에 main 브랜치라는 이름이 보이고 그 아래에 그동안 커밋한 내용이 보입니다. 

위로 올라갈 수록 최근 커밋입니다. 

오른쪽에 파란색으로 보이는 것은 해쉬 코드(hash code)입니다.  커밋 마다  부여되는 고유 식별 코드로 변경된 사항을 취소할 때 유용하게 사용할 수 있다고 합니다. 

 



10. GitHub 저장소 변경사항을 로컬 저장소에 반영하기 

 

git pull을 사용하여 원격 저장소인 GitHub 저장소의 변경사항을 로컬 저장소에 반영할 수 있습니다.



앞에서 GitHub 저장소의 dev 브랜티를 삭제했기 때문에 브랜치를 main으로 변경했습니다. 

 

C:\Users\webnautes\project>git checkout main

Switched to branch 'main'

Your branch is up to date with 'origin/main'.



GitHub 저장소의 변경사항을 로컬에 반영시켰습니다. 

 

C:\Users\webnautes\project>git pull origin main

remote: Enumerating objects: 1, done.

remote: Counting objects: 100% (1/1), done.

remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0

Unpacking objects: 100% (1/1), 630 bytes | 157.00 KiB/s, done.

From https://github.com/webnautes/example

 * branch            main       -> FETCH_HEAD

   6c5c720..1cac63e  main       -> origin/main

Updating 6c5c720..1cac63e

Fast-forward

 newfile.txt | 3 ++-

 1 file changed, 2 insertions(+), 1 deletion(-)




dev 로컬 브랜치는 아직 삭제 안된 상태입니다. 

 

C:\Users\webnautes\project>git branch

  dev

* main



원격 브랜치 상태를 확인해보니 문제가 생겼습니다. 이미 삭제한 원격 저장소의 dev 브랜치가 보이네요. 

 

C:\Users\webnautes\project>git branch -r

  origin/dev

  origin/main



아래 링크에 나온대로 진행해봅니다.

https://stackoverflow.com/a/5094510

 

C:\Users\webnautes\project>git remote prune origin

Pruning origin

URL: https://github.com/webnautes/example.git

 * [pruned] origin/dev



이제 원격 저장소의 dev 브랜치가 보이지 않습니다. 

 

C:\Users\webnautes\project>git branch -r

  origin/main



이제 로컬 저장소의 dev 브랜치도 삭제합니다. 

 

C:\Users\webnautes\project>git branch -d dev

Deleted branch dev (was 03729c2).



삭제된 걸 볼 수 있습니다. 

 

C:\Users\webnautes\project>git branch

* main




git log 명령으로 그동안의  커밋 기록을 볼 수 있습니다. 

 



반응형

해본 것을 문서화하여 기록합니다.
부족함이 있지만 도움이 되었으면 합니다.


포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. thumbnail
    Favicon of https://pinetwork-petershin.tistory.com BlogIcon 파이채굴러

    안녕하세요. 파이채굴러입니다.
    요기조기 구경다니다가 들어왔는데,
    포스팅 진짜 잘하시는거 같아요.👍👍
    저도 배워갑니다.
    시간되실때 제 블로그도
    한번 들려주세요.🤗🤗🤗🤗