인텔리제이 프로젝트를 깃허브에 연동하자!
Untracked File
인텔리제이에서 Git의 모든 것 (1) 에서 말했다시피 Git이 관리하는 모든 파일은 Tracked 파일과 Untracked 파일로 나뉜다.
이 중 Untracked 파일은 좀 특이한 파일이라고 생각하면 된다.
새로 생긴 파일
"git init" 명령어로 생긴 .git 파일은 프로젝트 파일의 전체 범위를 워크스페이스로 지정한다. 이 워크스페이스 안에 폴더 혹은 파일이 새로 생긴다면, 이 파일은 Untracked 상태이다. 따라서 이 폴더 혹은 파일은 따로 add를 해 주어야 Git의 관리 하에 들어가게 되는 것이다.
.gitignore 가 관리하는 파일
git에 올라가길 원하지 않는 파일이 있을 수 있다.
프로젝트를 intelliJ로 여는 순간 그 경로에 .idea 라는 폴더가 생기는데, 이 폴더는 컴퓨터마다 다르게 생성되기 때문에 Git에 push하고 pull할 때마다 충돌이 일어나기 부지기수이다. 또한 개인정보가 올라가는 경우도 있을 수 있다. 이런 경우는 막아야 한다.
따라서 프로젝트를 생성하자마자 gitignore를 적절히 만들어주는 것이 중요하다. 다행히 이 것을 알아서 만들어 주는 사이트가 있다. https://gitignore.io
이 사이트에 들어가 자신과 관련된 모든 운영체제, IDE, 언어 등을 검색한다. 필자는 windows, macOS, IntelliJ, Java, Gradle이 필요했다. 이렇게 입력하고 생성버튼을 누르면 코드가 나온다. 해당 코드를 그대로 내 프로젝트의 .gitignore 파일에 복붙해주면 된다.
필자는 여기에 추가로 위에 말한 이유로 .idea 는 추가했다. 또한, DB에 연결할 때 필요한 개인정보가 application.properties에 들어가 있어서 일단 추가해두었다.
만약 gitignore가 특정 폴더에 적용되지 않는 현상이 있다면, 해당 파일을 이미 commit한 적이 있어서, git이 만들어놓은 cache파일이 문제인 경우일 것이다. 이 경우는 다음을 참고하자.
https://stackoverflow.com/questions/11451535/gitignore-is-ignored-by-git
PULL
원격 저장소의 커밋 내역을 받아오는 것을 pull이라고 한다. 예를 들어보자.
참고로 origin/main 은 원격 저장소 main 브랜치의 이름이고 그냥 main 이면 로컬 저장소 main 브랜치의 이름이다.
이와 같은 상황은 어떤 상황일까? 원격 저장소에는 c라는 커밋 내역이 있는데, 로컬 저장소에는 해당 커밋 내용이 없다. 즉 최신화가 안 되어 있는 상황인 것이다. 업데이트를 해야 한다! 로컬 저장소 커밋 내역과 원격 저장소 커밋 내역을 이렇게 동기화 시키는 과정을 pull이라고 한다. 명령어는 "git pull origin main" 이다.
(참고!! pull은 fetch + merge로 쪼갤 수 있다. fetch는 원격 저장소의 브랜치가 어떤 것이 있는지 볼 수 있게 현황을 가져오는 정도이고, 실제로 커밋 내역을 합치는 것은 merge 과정이다.)
PUSH (local repository vs remote repository)
지금까지 잘 따라왔으면 commit이 됐을 것이다. 이제 이 commit 내역들을 github에 올려보자. 이를 push 라고 한다.
많이들 헷갈리는데, 현재 내 코드를 원격 저장소에 보내는 게 아니라 commit 내역을 보내는 것이다.
원격 저장소에는 main 이라는 브랜치만 있을 것이다. 또한 로컬 저장소에도 main 이라는 브랜치만 있을 것이다. (master로 되어있으면 직접 이름 바꾸기)
참고로 origin/main 은 원격 저장소 main 브랜치의 이름이고 그냥 main 이면 로컬 저장소 main 브랜치의 이름이다.
첫 번째 경우 (가장 보통의 경우 )
원격저장소의 a 라는 커밋을 받아온 채로 main 에서 작업한 뒤, b 커밋을 했다. 이 경우 그냥 b 커밋을 origin/main에 push하면 된다. 이를 하는 명령어는 "git push origin main" 이다.
두 번째 경우 (중간에 누가 커밋한 경우)
내가 a 커밋이 되어 있는 상태로 누군가가 c 커밋을 push 해버렸다. 이 때 "git push origin main" 을 입력하면 어떻게 될까..? b가 원격 저장소에 어떻게 입력 되어야 할 지, c가 로컬 저장소에 어떻게 입력 되어야 할 지 생각해보자. 맘대로 새로운 branch를 만들 수도 없는 노릇이다... 따라서 git은 오류를 낸다.
이 때는 내가 a 커밋 상태로 작업한 게 아니라 c 커밋 상태에서 작업한 것으로 만들어야 한다. 따라서 pull을 한 번 해서 c 커밋을 받아와야 한다. 그 후 다시 b 커밋을 해야 한다.
굉장히 중요하다!!! 커밋을 해도 원격 브랜치와 맞는 상태가 아니라면 커밋을 할 수가 없는 것이다. 따라서 커밋 전에 항상 원격 저장소와 로컬 저장소의 커밋 내역이 같은지 봐야 한다. 같지 않다면 이런 경우가 발생하는 것이다.
세 번째 경우 (다른 branch가 있는 경우)
팀 협업을 할 경우 대부분 개인 branch를 갖고 있어야 한다. 만약 원격 저장소에 morenow 라는 브랜치를 생성했다고 하자. 그러면 로컬 저장소에 같은 이름인 morenow라는 브랜치를 생성해야 한다.
이제 로컬 저장소에 여러 branch를 갖고 있는 건데, 각 branch를 옮겨다니면서 작업을 해야 하는 것이다. 이렇게 옮겨 다니는 것을 checkout 이라고 한다.
현재 머물고 있는 branch에 책갈피 표시가 뜨게 된다.
이제 모든 작업은 morenow 에서 해야한다. main branch에서 작업을 직접 하는 것은 안된다고 보면 된다.
morenow 에서 작업 후 이 데이터를 origin/morenow 즉 원격 저장소 브랜치에 push, 저장해야 한다. 그 후 main과 merge하는 방식이 되어야 한다. 예를 들어 보자.
정상적으로 작업했다면 이와 같은 상황이어야 한다. 내가 작업하는 morenow branch를 제외하고 main, origin/main, origin/more branch는 같은 상태이어야 한다. 그 위에 새로운 커밋 내역을 올리고 싶은 것이다.
main, origin/main, origin/more branch에 다 c 커밋 내역을 동기화시키면 된다. 이 과정은 다음과 같다.
- origin/morenow branch 에 push (git push origin morenow)
- main으로 이동(checkout)해서 morenow 브랜치와 merge
- main branch에서 origin/main 에 push (git push origin main)
2번 과정을 자세히 보자.
1번을 완료하고 main으로 이동(checkout)한 상태이다. 이제 c 커밋을 morenow 로부터 받아오기 위해 morenow branch에 우클릭해 Merge 'morenow' into 'main' 을 하면 c 커밋을 main 에 받아온다.
3번과정까지 마쳤다면 모든 branch에 c 커밋 역시 들어갔다!! 이제 방금 작업한 내용은 안전하게 저장되었다.
'Spring Boot' 카테고리의 다른 글
JWT 총정리 (2) - Access Token, Refresh Token (1) | 2024.03.08 |
---|---|
Oauth 2.0 & JWT 의 두 가지 흐름, 그리고 OIDC (1) | 2023.10.11 |
JWT 총정리 (1) - JWT의 원리와 흐름 (1) | 2023.10.09 |
Git in IntelliJ - 인텔리제이에서 Git의 모든 것 (1) (0) | 2023.01.27 |
[Spring Boot] Unit Test (단위 테스트) vs Integration Test (통합 테스트) (0) | 2023.01.20 |