Version Control/Git

Git 에서 제일 하고 싶은 것, 커밋 되돌리기, 병합(merge)하기

게임이 더 좋아 2021. 4. 13. 23:49
반응형
728x170

깃 응용

 

 

아 이거 망했다 라고 생각했을 때가 있을 것이다. 커밋을 돌리고 싶을 때...

예를 들어 저장했는데 알고보니 ctrl + a 누르고 삭제를 한 후 저장을 했다던가... ㅋㅋㅋ

 

현재 -> 과거 특정 시점

즉, 예전 커밋했던 때로 돌아가기를 해야한다.

 

git log 명령어를 치면 

작업 내역들이 쭉 나온다.

보면

commit이 있다.

 

 

특정 해시값을 가지는 commit이 있다.

 

이를 가지고 과거로 시간여행이 가능하다.

 

git reset --hard (해시값)

을 입력하면

해당 커밋 이후의 작업 내역을 잃어버리며 해당 commit했던 때로 돌아가게 된다.

 

**물론 hard라서 이후의 작업 내용을 없애버린 것이다.

soft, mixed 알아서 사용하자.

 

다시 내 해당 로컬을 보면 해당 시점으로 돌아간 파일들을 볼 수 있다.

 

?????엥 그럼 원격 저장소는?? 얘도 과거로 돌아가나???

 

git push를 해봤자 소용 없다. 

오류가 난다.

 

.git의 데이터가 바뀌어버렸기 때문이다.

 

하지만 안되는 것은 없다

강제 push 명령도 존재한다

git push -f 로 강제로 push가 가능하다.

 

.git 폴더 안에 있는 모든 것들이 지금 현재의 내 local에 있는 것으로 바뀐다는 의미겠다.

원격에 남아있던 commit 내역들도 사라지는 것이다.

 

하지만.. 강제로 하는 것이 있기야 하지만 

강제라는 것은 약간 안되는 것을 되게하는 비정상적인 의미가 있다.

항상 과거로 돌아가려면 비정상적이어야 하는 건가..?

 


 

그러한 경우 branch를 사용할 수 있다.

즉, push를 할 때 내가 만든 임의의 branch에 push를 하면 Master의 혹시 모를 오류를 대비할 수 있다는 것이다.

 

branch를 사용하는 이유가 뭐 그 때문만은 아니지만

branch는 분기점을 만드는 것으로 협업에 아주 주요한 기능을 한다.

-> branch가 다르면 서로 다른 개발 작업을 수행하기 좋다. 영향을 받지 않으니까

 

 

일반적으로 Master는 가장 안정화된 브랜치로 배포 가능한 상태를 유지해야한다.

때문에 다른 브랜치를 만들어서 나중에 Merge를 하는 것이다.

 

버그도 (hot fix) 따로 고치고

기능도 따로 만들고

너무 좋다 ㅎ

 

하지만 Merge가 맨날 잘되느냐???

그것도 아니다. 충돌 맨날 일어난다..ㅎ

나도 몇 번 해봤는데 뭐가 맨날 문제인지 빨간 줄 겁나 뜨더라.내가 아마 실력이 부족한 탓이겠지.

**일반적으로  충돌은 동일한 파일을 2개 이상의 branch에서 수정할 때 발생한다.

 

예를 들어 Master와 hotfix 브랜치가 있다고 하자.

 

Master에는read.txt 파일에

abc//?

 

hotfix의 read.txt파일에는

abc
abc + d //fixed

 

서로 같은 파일명즉, 같은 파일을 수정했지만 내용이 다르다.

이 경우 master에서 hotfix를 merge할 경우 어떻게 될까?

 

 

무야호 같은 경우가 나온다.마스터가 병합하기 그만큼 싫으시단거지

 

하지만 친절하게도 깃은 충돌한 파일을 보여주고충돌난 스크립트 코드를 보여주고 사용자에게 어떤 브랜치의 내용을 쓰겠느냐고 유도해준다

 

해당 스크립트에서 선택하고 저장한 후 다시 커밋을 한 후 merge를 진행하면 된다.

 

하지만 conflict 많이 나면 그걸 일일이 고치려면 화나겠지?

그래서 내가 무엇을 작업했는지 확실히 하는 것이 좋다.

 

 

 

반응형
그리드형