다른 사람 깃 등록 제거 방법

아래는 저의 생생한 경험담을 바탕으로 작성한 것 입니다.


Github 관리 폴더의 이름을 실수로 변경하고 삭제해버렸다.

작업 후 commit 하려고 아무리 찾아봐도 폴더가 보이지 않았다.

나의 피땀눈물 그 자체의 폴더가 휴지통에 가 있는 걸 발견하고,

바탕화면으로 다시 정중히 모셔와서 commit 하려고 봤을 땐,

해당 폴더 이름이 예전 이름이 아니었기 때문에,

순간 당황하고 하위 폴더로 git add를 해버렸다.

당연히 깃허브에 올라가있던 파일들의 경로가 바뀌었기 때문에, git add . 후 status를 조회했을 때는

전체 파일들이 'renamed' 로 되어있었다.

다른 사람 깃 등록 제거 방법

미래의 나에게 미안할 과거의 나는 '파일 이름'만의 변경은 대수롭지 않다 생각하고,

아주 cool하게

매우 지나치게 cool하게

그대로 commit, push를 했버렸다.

결과는...

다른 사람 깃 등록 제거 방법

지난 날의 나의 이력들이 오늘 날짜로 전체 대통일을 이루었다...

물론 다행히도 commit이력은 살아있었지만,

나는 그날그날 나의 피땀눈물 노력의 흔적들을 보고 싶었다.


그래서 push를 되돌리기 위한 방법을 공유해보려고 합니다.

먼저 2가지 방법이 있는데, reset과 revert입니다.

reset: 되돌리고 싶은 시점의 commit이력으로 돌아가는 것(시간여행)

revert: 현재까지 남긴 이력들을 유지한 채 되돌리고 싶은 commit을 원상복귀시키는 것(복구commit이 추가됨)

저는 혼자 사용하는 원격 저장소이기 때문에 reset을 사용했습니다.

하지만 누군가와 공유를 하고 있다면, 다른 사람이 그 사이에 pull을 받았을 수도 있기 때문에,

그러면 내가 되돌리기를 했을 때 문제가 생일 수 있으므로, reset 하기 전에 충분한 커뮤니케이션이 필요하다고 합니다.

그래서 revert를 많이 사용한다고 합니다.

1. commit 이력 조회하기

git log --oneline

해당 명령어로 그동안의 commit들을 확인해볼 수 있습니다.

다른 사람 깃 등록 제거 방법

HEAD가 있는 곳이 현재 브랜치(마스터)를 가리키는 포인터입니다.

그리고 이 브랜치는 가장 최근의 commit을 가리킵니다.

2. 돌아가고 싶은 commit 이후의 commit 삭제하기

여기에서 돌아가고 싶은 commit을 찾아서 git reset를 실행합니다.

reset hard를 쓰면 돌아가려는 이력 이후의 모든 내용은 지워버리겠다는 것입니다.

과거 이력만 지우고 이후에 무대에 올려놓은 것으로 바로 commit 하고 싶다면, reset soft를 쓰면 됩니다.

git reset --hard "해당commit"

그러면

다른 사람 깃 등록 제거 방법

좀 전의 commit이 사라지고 되돌리고 싶은 commit으로 돌아왔습니다.

이제 이 commit에는 그 당시 제가 무대에 올라온 파일들을 묶어서 제 로컬에 저장해 놓은 '기억'이 있습니다.

3. github 원래대로 돌려놓기

따라서 아래 명령어로 push를 해주면,

git push -f origin master
다른 사람 깃 등록 제거 방법

쨘! 깔끔하게 원래 날짜들로 돌아간 모습을 보실 수 있습니다.

저는 이렇게 해결했지만,  -f는 절대 함부로 쓰면 안 된다고 합니다. 대참사가 일어날 수도 있습니다.

이상 저의 삽질일기를 마칩니다!


여기저기 삽질도 해보고

날려도 먹으면서

배우는 게

결국 남는거다

- Z.Sabziller


'쫄보의삽질' 블로그에 대한 TMI: 

저는 5살 때부터 비행기를 타고,

어려서부터 놀이공원에 가면 회전목마는 눈길도 주지 않은 채 범퍼카만 주구장창 탔으며,

스무살 되던 해 바로 면허를 땄고,

제일 좋아하는 영화는 fast&furios(분노의 질주)입니다.

제 20대 버킷리스트 1번에는 스카이다이빙이 입주해 있을 정도로

원래 겁도 없고 그렇게 쫄보도 아니며 나름 강심장(?)이라고 생각했는데

이번 일을 통해 저의 이전 작업 내역들을 다시는 못 돌릴까 봐

조마조마해하고 무서움에 떨고 있는 제 자신에게서

너무나도 낯선 '쫄보'의 모습을 볼 수 있었습니다.

그렇게 해서 이 블로그는 탄생했습니다.

왜냐하면 개발을 하는 데 있어 이러한 쫄보 기질은 별로 도움이 안 된다고 생각합니다.

여기저기 삽질도 해보고 날려도 먹으면서 배우는 게 결국 남는거라고 생각합니다.

비록 쫄보이지만, 열심히 삽질하며 삽질일기 를 남기는 쫄보삽질러의 블로그 입니다.

Problem

깃헙 원격 저장소에 커밋을 push했는데, 이후에 해당 커밋을 잘못 올린걸 알게 되어서 원격 저장소에서 삭제하고 싶다.
Github에 커밋을 올리기 전과 완전히 동일한 상태로 되돌려 놓으려면 어떻게 해야할까?

Solution: 로컬에서 커밋을 되돌린 후 Github에 강제로 푸시

원격 저장소에서 삭제하고 싶은 커밋을 로컬 저장소에서도 삭제해서 이전 커밋히스토리로 되돌리고, 이 커밋 히스토리를 원격 저장소에 강제로 push하면 된다.

  1. 로컬에서 내가 되돌리고 싶은 커밋으로 되돌린다. HEAD1는 최신 커밋 1개, HEAD2는 최신 커밋 2개이다.

    git reset --hard HEAD~1
  2. force push로 깃헙에 강제로 push한다.

    git push -f origin master

원격 저장소의 커밋보다 뒤쳐져있는 과거의 로컬 저장소의 커밋 히스토리를 푸쉬하게 되므로 만약 그냥 git push origin master을 하면 에러가 발생한다. 하지만 우리는 이 뒤쳐져 있는 로컬 저장소의 커밋 히스토리를 원격 저장소의 커밋 히스토리로 강제로 덮어씌워야 하므로 강제를 의미하는 -f 또는 --force를 명령어에 추가해야 한다.

하지만 이 방법은 원격 저장소에 내가 만들었던 커밋을 깔끔하게 삭제할 수는 있지만, 원격 저장소에서 삭제되기 전에 다른 사람이 해당 브랜치의 커밋을 pull로 땡겨갔다면 그 사람의 로컬 저장소에는 내가 삭제한 커밋이 남아있다게 된다는 문제가 있다. 그 커밋들이 원격 저장소에서 삭제된걸 모르는 상태에서 내가 삭제한 커밋에 그 사람이 새로 작업한 커밋들을 추가해서 함께 push를 하면 내가 삭제했던 커밋까지 다시 원격 저장소에 올라오게 된다.

그러므로 이 방법은 해당 브랜치를 나 혼자 작업할 때만 사용하는 것이 좋을 것이다.