본문 바로가기

웹 개발 프로젝트

Github 좀 더 정확하게 이해 및 에러 해결

더보기

일단 방금 있었던 일을 좀 적어볼까 한다...

내가 아직 branch에 대해 잘 몰라서 있었던 상황인데

내가 올린 코드를 clone으로 받아와서 add를 해주었다.

그런데 commit을 해주려니 오류가 발생하는것이었다. 그래서 찾아보니 수정이 안되어서 commit할게 없다는 뜻이였는데,

도저히 뭔지 모르겠어서 "아 그냥 clone으로 가져와서 수정한걸 push하지 말고, 새로운 파일을 하나 올리자!" 했다.

그래서 새로운 디렉토리를 만들어서 코드를 짜놓고 init, add, commit을 하고 push를 하려는데 main으로 안된다는거다.

main이 아니라 새로운 브랜치인 master로 해주면 된다는 글을 봐서 되긴 했다.

왜냐면 아직 master라는 브랜치에는 아무것도 들어가있지않아서 여기엔 뭔짓을 해도 다 반영이 되었던 것이었다.

 

그래서 찾아보니,

일단 내가 모르던게 있었다. 

그래서 내 바탕화면에는 그 파일이 들어가있는 디렉토리가 존재한다. 그런데 나는 한번한번 수정할때마다 디렉토리를 만들어줘야된다고 생각해서 계속 만들었는데, 그럴 필요가 없었다.

 

아래에는 내가 직접 겪은 에러들을 고치면서 깨달은 정보


1. 내가 올린 것을 내가 수정하고싶을 때 

: 그냥 원래 있던 디렉토리를 들어가서 코드를 수정하고, add, commit, push를 해주면 된다.



2. 다른 사람이 수정한 것을 내가 가져와서 수정하고싶을 때

: 이 때도 원래 있던 디렉토리를 들어가서 pull로 수정한 코드를 불러온 다음에 코드를 수정해주고 똑같이 add, commit, push를 해주면 된다!



3. 가끔 내가 모르고 수정을 해놓으면, git pull origin main을 했을 때 오류가 발생한다.

: 이럴 때는 reset hard를 사용하는 방법도 있지만, git stash + git stash save를 사용하여 .git디렉토리에 '임시저장'을 함으로써 pull로 가져올 수 있다!



4. 내가 파일을 pull로 받아와서 수정을 하고 push를 하려는데, 에러가 뜬다?

: 이때는 한 번 깃허브 새로고침을 해보자. 이 때 다른 사람이 내가 수정한 파일을 수정해서 올렸다면 다시 pull로 받아와서 수정을 해줘야한다. 왜냐면 내가 들고왔던 파일이 지금 바뀌었는데 난 바뀌기 전 파일에 수정을 하고있었으니까 에러가 발생한거다. 이 상황에서는 마찬가지로 git stash를 이용해보자!



5. 방금 push한 commit을 깃허브에서 없애는 법!

: git reset --hard HEAD~1
  git push -f origin main  



HEAD~1: 한 커밋 전으로 되돌리기
--hard: 파일 상태까지 원래대로 복원
-f: 강제로 푸시해서 GitHub 내용도 덮어쓰기
6. 커밋은 유지하되, GitHub에만 반영하지 않게 롤백하고 새 커밋 만들기 ! (안전 버전) 

: git revert HEAD
  git push origin main



이건 "방금 커밋을 취소하는 커밋"을 새로 만드는 방식이라 안전하고, 협업 시에도 괜찮다.
기존 커밋 히스토리를 보존하면서 되돌리는 방법!


7. 브랜치명 바꾸기!

: git branch -m master main
  git push -u origin main
+ 그리고 GitHub에서 기본 브랜치 설정 변경

좀 나중에 있었던 일도 추가로 적어볼까한다.

우선, pull로 최신것을 받아오고 내가 수정을 진행하고있었다. 

수정을 마친 후에, push를 하려는데 에러가 난것이였다.

찾아보니, 내가 건든 부분을 다른 분이 수정을 하고 방금 올리신 거였다.

사실 똑같은 부분을 수정한 것이 아니라면, git stash를 이용하여 에러를 고칠 수 있었지만,

이번 경우는 '똑같은 구간'을 수정을 한 것이여서 수정된 코드와 내가 수정한 코드와의 충돌이 발생하여 생긴 에러였다.

 

그래서 충돌된 곳에는 이런 문구가 적혀있을 것이다.

<<<<<<< HEAD
<!-- 너의 로컬에 있던 코드 -->
=======
<!-- 원격 저장소에 있던 코드 -->
>>>>>>> origin/main

 

만약, 내가 수정한 부분을 아예 없애고 다른 분이 수정한 내용을 그대로 가져오고싶다면,

git fetch origin
git reset --hard origin/main

을 입력해주자. 하지만 단점은 내가 수정한 부분이 '전부' 덮어쓰기 되기 때문에 상황에 맞게 사용하는 것이 중요하다.

 

만약, 내가 수정한 부분도 어느정도 살리고싶다면, 

=====을 기준으로 아래있는 원격 저장소에 있던 코드를 삭제해주고

똑같이 add, commit, push를 해주면 된다.