ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Git] 예전에 fork한 repo를 원래 repo의 최신 버전으로 업데이트하기
    공부/Git 2022. 7. 16. 14:31
    반응형

     

    한 달 전에 fork 했었던 repo를 최신 버전으로 업데이트 해야하는데, 아침까지 내가 이전에 보냈던 커밋들과 뒤섞인 상태로 업데이트가 되어 이상한 상태였었다. 옛날에 보낸 커밋(2 commits behind)과 최신 버전으로 merge할 때 추가된 커밋(3 commits ahead)이 있는데,  옛날에 보낸 커밋은 이미 원래 repo에 반영이 됐어서 PR을 날리면 파일은 바뀐게 없지만 5개의 커밋 메시지를 보낼 수 있는 상태였다.


    * 예시 상황

    1. kauKoala라는 유저의 algorithm-study repo에서 내 아이디인 70825에 fork를 한 상황

    2. main 브런치는 바로 최신 버전으로 업데이트하면 된다.

    3. develop 브런치가 꼬인 상황이다. (2 commits behind, 3 commits ahead)

    4. behind 커밋은 repo를 최신 버전으로 업데이트 해야한다.

    5. ahead 커밋은 커밋을 삭제해서 최신 버전으로 돌린다.

     

    1. upstream 설정하기

    $ git remote -v

    위 명령어를 입력하면 아래와 같이 나온다.

    origin  https://github.com/70825/algorithm-study.git (fetch)
    origin  https://github.com/70825/algorithm-study.git (push)

    우리는 최신 버전을 가져와야하므로 원래 repo의 주소를 upstream으로 설정한다.

    $ git remote add upstream https://github.com/kauKoala/algorithm-study.git
    (git remote add upstream <원래 repository git 주소>

     

    이후 다시 git remote -v를 입력하면 upstream으로 새로운 내용이 생겼을 것이다.

    $ git remote -v
    
    origin  https://github.com/70825/algorithm-study.git (fetch)
    origin  https://github.com/70825/algorithm-study.git (push)
    upstream        https://github.com/kauKoala/algorithm-study.git (fetch)
    upstream        https://github.com/kauKoala/algorithm-study.git (push)

    2. main 브런치를 최신 상태로 업데이트하기

    현재 브런치가 main 브런치인지 확인하자 지금 main 브런치가 아니라면 이동을 한다.

    $ git checkout main

    이제 git에서 fetch and merge를 하여 최신 상태로 업데이트한다.

    $ git fetch upstream
    $ git merge upstream/main

    만약 업데이트를 하기 전 마지막 커밋 아이디가 abcdefg이고, 원래 최신 커밋이 1234567이면 아래 메시지가 나왔을 것이다.

    $ git push
    abcdefg...1234567 main -> main

    이렇게 해서 main 브런치는 최신 버전으로 업데이트하였다.


    3. develop 브런치를 최신 상태로 업데이트하기

    2 commits behind를 없애는 방법이다. 이것도 main 브런치때와 비슷하게 적용하면 된다.

    $ git checkout develop
    $ git fetch upstream
    $ git merge upstream/develop
    $ git pull

    이러면 behind가 없어지고 최신 repo로 변경된 상태이다.

    git pull을 하는 이유는 내가 fork한 repo가 원래의 repo보다 3개의 커밋이 추가로 있기 때문이다.

    이제 3 commits ahead만 해결하면 된다.


    4. develop 브런치에 있는 커밋 삭제하기

    해당 커밋은 아예 필요가 없는 것이므로 원래 repo의 커밋으로 돌아가야한다.

    원래 repo의 최신 커밋이 a1b2c3라고 가정하자

    그러면 git reset --hard <돌아가고 싶은 커밋>을 사용하면 된다.

    돌아가고 싶은 커밋 이후에 추가로 생긴 소스 코드를 남기고 싶으면 --hard 대신 --soft를 사용하면 된다.

    $ git reset --hard a1b2c3

    a1b2c3으로 돌아갔으면 force push를 해주면 된다.

    $ git push -f origin develop

    이러면 모든 문제가 해결되었다.

    반응형

    댓글

Designed by Tistory.