기본적인 git 사용 패턴 정리
git

기본적인 git 사용 패턴 정리

예전에 멋사 운영진을 할때 github 세션을 했었는데 관련 내용을 공유합니다.

git과 github의 차이

  • git
    • 오픈 소스 버전 관리 시스템(Version Control System)
    • 로컬에서 버전 관리
    • 소프트웨어 개발 및 소스 코드 관리
    • 인터넷이 필요 없다
  • github
    • git을 사용하는 클라우드 서비스
    • git repository를 위한 웹 기반 호스팅 서비스

repository : 저장소

local : 자신의 컴퓨터

origin : 원격 저장소(깃허브 페이지)

  • 첫번째 자신의 repository만들어 보기
  • 자신의 프로필에서 [repository]→ [New]버튼

 

레포지토리를 만들어봅니다.

 

그리고 바탕화면에 폴더하나를 만들겠습니다. 저는 웬만하면 repository와 같은 이름으로 만드는걸 추천 드릴게요.

그리고 Vscode를 연 다음 파일을 눌러서 새로만든 파일을 열어줍니다.

git init                                                    # git 초기화
git remote add origin <https://github.com/Hellol77/test.git>  # 원격 레포지토리 연결
git branch -M main                                          # 메인브랜치 main으로 초기화

	# 폴더안에 파일을 하나 만든후 commit까지 보낸후 

git push -u origin main       

하시면 이제 github페이지에 자신의 변경사항이 올라간 것을 보실 수 있습니다.

 

github 시작하기

일단 repository를 fork 하는 방식과 clone 하는 방식 두가지가 있는데 저희는 clone으로 해보도록 하겠습니다.

 💻 fork: 다른 사람의 repository를 내 github repository로 그대로 복제하는 기능입니다. clone:다른 사람의 repository를 내 컴퓨터에 복사하여 새로운 저장소를 만드는 기능

git clone http://...

 

브랜치 만들기

브랜치를 통해서 하나의 프로젝트를 여러 갈래로 나누어서 관리 및 개발 가능

git branch 만들브랜치이름 뻗어나올브랜치이름   # 브랜치 생성
git checkout 만든브랜치이름               # 내가 사용할 브랜치를 지정
																			# (내 컴퓨터가 이제 만든브랜치의 정보를 보여줍니다)

새로 만든 브랜치를 사용하여 어떤 작업을 수행하려면, git checkout 으로 만든 브랜치를 사용 하겠다고 명시적으로 지정해 주어야 합니다.

좌측 아래에 보면 자신이 보고있는 브랜치 이름이 나와있습니다. 눌러서 checkout 할 수도 있지만

vscode 동기화가 좀 잘 안되어서 만든 브랜치 이름이 안보일 수 있으니 명령어를 사용하는 것이 좋습니다.

(참고) checkout 할 때는 이미 존재하는 파일의 변경사항을 전부 commit하거나 아니면 stash로 저장후 checkout 해야합니다.

지금까지 브랜치를 만들어서 checkout 까지 완료했는데요. 이제 원격(remote) repository에도 내가 만든 브랜치를 알려줘야겠죠?

	git push # push 는 원격 repository에 내 컴퓨터와 같은 상태를 만든다(복사 된다) 
					 # 라고 생각하시면 됩니다. 

그러니까 원격repository에도 내가 컴퓨터에서 만든 브랜치가 똑같이 만들어지는거죠

를 하시면

요런 메시지가 나올텐데요. 복사해서 다시 쳐줍니다.

git push —set-upstream origin branchTest

 

publish branch 누르시면 사실 끝납니다.

 

파일 수정하기

파일을 수정하면 변경 사항에 변경한 파일명이 뜹니다.

빨간 박스의 왼쪽 버튼 부터 설명하면 파일 열기, 변경 내용 취소하기, staged 상태로 만들기(git add 하기)

 

파일 staged 상태로 만들기

staged 상태라는 것은 쉽게 말하면 앞으로 commit 할 파일을 정하는 것이라고 생각하면 됩니다.

+버튼을 누르시거나

 

git add . # 변경한 전체 파일 staged상태로 변경하기
# 혹은
git add 파일이름 # 파일 staged상태로 변경하기

를 입력해서 변경된 파일을 staged상태로 변경합니다.

 

commit 보내기

이제 staged 했던 파일들을 commit 할겁니다!

커밋을 보내면 staged 했던 파일들만 commit이 됩니다.

변경 이력을 남긴다고 생각 하시면 됩니다.

커밋을 보내려면 필수로 메시지를 입력해야합니다.

git commit -m 커밋메시지

(참고) 커밋 컨벤션 예시

어떤 기능을 추가했는지 버그 수정을 했는지.. 커밋메시지로 무엇을 변경했는지 편하게 알기 위해서 정하는 일종의 커밋메시지 규칙입니다. 이 규칙은 사용하는 그룹마다 다 다릅니다.

  • feat : 새로운 기능 추가
  • fix : 버그 수정
  • hotfix : 급하게 치명적인 버그 수정
  • docs : 문서 수정
  • style : 코드 포맷팅, 세미콜론 등의 스타일 수정(코드 자체 수정 X)
  • refactor : 프로덕션 코드 리팩토링
  • test : 테스트 코드, 테스트 코드 리팩토링
  • chore : 빌드 과정 또는 보조 기능(문서 생성 기능 등) 수정
  • rename : 파일 혹은 폴더명을 수정하거나 옮기는 작업만인 경우
  • remove : 파일을 삭제하는 작업만 수행한 경우
  • comment : 필요한 주석 추가 및 변경

 

원격 repository에 push 하기

git push --force-with-lease  # push 를 해줍니다. 항상 push --force..를 할때는 조심

—force-with-lease 를 사용하면 혹시나 원격 repository에 다른사람의 커밋이 새롭게 추가된 경우 덮어쓰기 작업을 취소시키기 때문에 안전합니다. 그냥 —force 대신 이거 쓰시는 것을 추천드립니다.

입력을 완료하시고 깃허브 페이지를 가셔서 pull request 쪽을 들어가보시면 자신이 push 했다고 알림이 옵니다.

 

원격 repository에 자신의 변경사항 적용시키기 (깃허브에 업로드하기)

원격 repository에 자신의 변경사항을 적용시키려면 pull request 를 보내야합니다.

  1. compare & pull request 버튼을 눌러줍니다! (만약 compare & pull request)버튼이 안생긴다면 new pull request 버튼을 눌러줍니다.
  2. 자신의 편집한 브랜치 이름과 base 브랜치를 확인합니다.

지금 이미지를 보시면 main 브랜치에 branchTest브랜치에 있는 수정사항을 추가한다라고 보시면 됩니다.

  1. 혹시나 합치는 과정에서 알아야할 참고사항이나 특별한 특이사항들을 적어줍니다.
  2. create pull request를 눌러줍니다.

(참고) https://im-developer.tistory.com/182

merge (합치기) 에는 세가지 방법이 있는데요

rebase 를 한 후 merge 하는 방법

그냥 일반적인 merge 가 있습니다. (한가지는 몰라도 됩니다. 잘 안써서요 squash merge라나..)

저희는 그냥 일반적인 merge를 하는것으로 하겠습니다.

merge버튼을 누르시고

이제 main 브랜치를 보시면

**git checkout main**

네 맞습니다 아무것도 안바뀌어 있습니다

원격 repository에서 데이터 받아오기(동기화하기)

일단

git branch -D 자신이만든브랜치이름   # 이제 merge를 했으니 로컬에서의 브랜치를 지워줍니다.
																

로 로컬(컴퓨터) 에 있는 브랜치를 지워줍니다.

(주의 : 자신이 만든 브랜치에 checkout 되어있으면 삭제가 안됩니다. main이나 다른 브랜치에 checkout 후 삭제하세요!)

원격 repository에서는 merge후 자동으로 브랜치를 지우게 설정했습니다.

pr(pull request) 보내고 merge 까지 했는데 왜 안바뀌어있죠??

네 우리 컴퓨터는 똑똑하지 않아서요 직접 그 정보를 가져와야합니다.

항상 fetch 를 하시기 전에 지금은 없겠지만 작업하시고 있는 것이 있다면

git stash        # staged 된 변경사항이나 staged 안한 변경사항들을 전부다 임시저장합니다.
								 # 파일들은 전부 변경하지 전 상태로 돌아갑니다.

git stash pop    # 제일 마지막에 stash 한 사항들을 다시 컴퓨터로 불러옵니다.

git stash를 해주신 후 fetch 를 하는것을 추천드립니다. (사실은 아무상관이 없지만… 제 징크스입니다.)

기존에 있던 파일을 수정한것들은 stash가 되는데

새로 만든 파일은 stash가 안됩니다!!

(git rebase main을 추천 드립니다)

git fetch --all   # 원격 repository에서 데이터 동기화

이제 fetch 를 하시면 네 맞습니다. 또 아무것도 변하지 않습니다.

fetch는 원격 repository의 최신이력을 내 컴퓨터에 가져온다 라고 생각하시면 됩니다. 절대 내 컴퓨터에 저장하는 것이 아니라 그냥 데이터만 가져온다. 그래서 내 컴퓨터에 저장 할지 아니면 저장을 안할지 선택 할 수 있습니다.

이제 fetch를 했으니 원격 repository의 정보를 컴퓨터에 저장시켜 보겠습니다.

첫번째는 git pull을 사용한 방식입니다. 

git pull

 

두번째는 제가 급할때 썼던 방식입니다. (별로 추천드리지는 않습니다.)

변경사항이 현재 없는 상태라면 다음의 명령어로 불러올 수 있습니다.

git reset --hard origin/main  # 강제로 원격 repository의 main 브랜치의 
															#	정보를 컴퓨터에 저장합니다.

 

—hard 가 붙은 명령어는 항상 조심하셔야 합니다.

이제야 main 브랜치에 여러분이 변경한 내용들이 보일 겁니다.

 

충돌작업 해보기

그냥 웃겨서 넣어봤어요..

 

일단 이 화면을 목격하시면…

로컬(자신의 컴퓨터)에서의 main 브랜치를 업데이트 해줍니다!

git checkout main
git fetch --all
git reset --hard origin/main

이렇게 하시면 main 이 최신으로 업데이트 되겠죠?

git checkout 자신이작업한브랜치

를 해서 자신의 브랜치로 이동한후

다시 자신의 브랜치(git checkout 자신이 작업한 브랜치)로 가서 git merge main(git rebase main)

을 쳐줍니다.

(참고) git rebase(merge) main 이라는 뜻은 지금 로컬 환경에 있는 main 브랜치에 합쳐주겠다 라는 뜻입니다.

그래서 main을 최신화하지 않으면 예전 버전의 main에 합쳐주는게 되겠죠.. 그래서 main을 최신화 하고 rebase 를 해줍니다.

친절하게도 어떤 것을 수정사항으로 받아드릴지 알려줍니다.

바보가 아니니까 수신 변경 사항으로 바꿔야겠죠?

노란색 글씨 버튼을 눌러줍니다.

혹은 직접 다 지우고 고칠 수도 있습니다.

수정하셨으면

변경 사항 병합에 있는 + 눌러 병합 해주고

계속을 눌러줍니다.

로컬 컴퓨터로 병합을 해주었으니까 원격 repository의 브랜치에도 그 정보들을 알려줘야 합니다.

git push --force-with-lease

를 해서 우리가 병합했던 내용들을 알려줍니다.

그러면 우리는 다시 github페이지에 가서 merge 할 수 있게됩니다.

(merge했으니까 항상 로컬에서 branch 지우는 건 잊지말아주세요)

 

자신이 push 한 제일 최근 커밋 되돌리기

 

test 브랜치에 2개의 commit있습니다. 지금 Pull request를 보낸 상황이구요.

제일 최근 커밋인 ‘삭제할 커밋입니다.’ 를 취소해보겠습니다.

가장 최근 커밋을 취소하는 것은 아주 간단합니다.

git reset HEAD^   # 가장 최근의 commit을 취소합니다.

을 입력해주면 로컬(컴퓨터)에서는 다시 커밋메세지를 보내기 전으로 돌아옵니다. 아예 수정하기 전 상태가 아닌, 수정은 되어있지만 커밋을 보내지 않은 상태입니다. (add도 안되어있음)

로컬 컴퓨터에서 커밋이 취소되었으니 원격 repository에도 로컬 컴퓨터의 상태를 복사해줍니다.

git push --force-with-lease

커밋이 취소된 모습입니다.

이와 똑같이 특정커밋으로 돌아가기도 이와 같은 방식으로 해결 할 수 있습니다.

 

내가 커밋하지 않았는데 다른 사람의 커밋이 나의 pull request에 있을때

git checkout main   # main으로 가준다음
git fetch --all     
git reset --hard origin/main  # main을 최신화 시켜준뒤
git checkout 자신의브랜치   
git rebase main         					
git push --force-with-lease  # 이제 중복된 커밋을 로컬에서 제거했으니 원격에도 업데이트 시켜줍니다.

자신의 브랜치로 간다음 내 pull request에 있는 다른사람의 커밋은 보통 main에도 똑같이 있습니다. 그래서 git rebase main을 해서 중복된 커밋을 없애줍니다. 

이렇게 하면 다른사람의 커밋이 사라지고 내가 커밋했던 기록만 남게 됩니다.

만약 다른사람의 커밋이 내 pull request에 있는데 이 작업을 안하고 merge를 누르면

다른사람의 커밋이 2번 나오게 됩니다. 언제 다른사람이 커밋을 했는지 알기가 어려워집니다.