코딩,해볼까

04.12. Git과의 전쟁 / 풀 리퀘스트(Pull Request)와 git add, commit, push 되돌리기의 모든 것 + 원 저장소의 브랜치를 가져오는 방법 해결! 본문

Back/TIL

04.12. Git과의 전쟁 / 풀 리퀘스트(Pull Request)와 git add, commit, push 되돌리기의 모든 것 + 원 저장소의 브랜치를 가져오는 방법 해결!

떠굥 2023. 4. 12. 23:58

0.  오늘 한 일

장고 초급 2~3강 복습하면서 views.py와 urls.py 수정.

html url 구조 생각하기.

base.html 수정.

깃허브 풀 리퀘스트 연습.

 

👩‍💻 풀 리퀘스트(Pull Request) 방법

  1. 기여하려는 저장소를 내 계정으로 포크(fork)
  2. 나의 리포지토리에 있는 포크(fork)한 저장소를 클론( $ git clone - )
  3. $ git checkout -b [생성하고자 하는 브랜치 이름] 
    새로운 브랜치 생성 후 이동
  4. 작업 후 git diff 로 작업 내역 확인 가능
  5. $ git push origin cheese origin
    원격 저장소에 (새로 만든) cheese 브랜치를 푸시
  6. 깃허브에 가면 cheese had recent pushes ~ Compare & Pull request 버튼이 생겼다. 클릭. 브랜치 —> 브랜치 선택을 잘 해준 후 create pull request 누르면 끝!

 


1.  문제점

풀 리퀘스트 중에 오류가 꽤 발생했다. 

내가 포크(fork) 해왔던 우리 팀 프로젝트 원본 저장소에서 팀장님이 새 브랜치를 생성하였다.

이 브랜치를 내가 포크한 저장소에도 가지고 오려고 synk fork를 통해 업데이트를 시켰으나 브랜치는 나타나지 않았다.

 

 

 

 

 


2. 시행착오

💻 블로그를 찾아보니 upstream 을 하면 된다고 하여 시작된 시행착오.

 - upstream을 시도하니 터미널에서 새로운 브랜치까지 조회되었다. 

 - 내가 원래 하던 작업물을 병합하지 않은 상태에서 upstream을 시도하였더니 충돌이 일어난 것으로 보인다. upstream 도 push 까지의 과정을 거쳐야 하는데, 이미 스테이징된 나의 작업물들이 있었기 때문.

- 이전 커밋 삭제, 커밋 되돌리기, 브랜치 삭제, 브랜치 강제 삭제 등을 진행하였는데, 이전에 있었던 작업물을 없애지 못했다. pull request를 보내서 close 해보기도 했다. 하지만 나의 깃에서는 해결이 되지 않았다.

 

🚫 풀 리퀘스트(Pull Request) 취소하는 방법

  1. 풀 리퀘스트를 받은 관리자가 close를 눌렀더니, 나에게 되돌아오지 않았다. 
    (단, 관리자는 나의 풀 리퀘스트를 살려서 merge 시킬 수도 있다.)
  2. git checkout [브랜치 이름]
    git push origin --delete [브랜치 이름]
    git push origin [브랜치 이름]
    풀 리퀘스트 취소를 시도하였는데 (브랜치가 원격 저장소에서 삭제..?)
    아무것도 없는 풀 리퀘스트가 하나 더 생겼다. 아무튼 이 방법은 못쓸 듯 하다.

🚫 git add, git commit, git push 취소하는 방법

  1. git add 되돌리기 :  $ git reset HEAD 파일명
  2. git commit 되돌리기
    [방법 1] commit을 취소하고 해당 파일들은 staged 상태로 워킹 디렉터리에 보존
    $ git reset --soft HEAD^
    [방법 2] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에 보존
    $ git reset --mixed HEAD^
    $ git reset HEAD^
    $ git reset HEAD~2
    [방법 3] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에서 삭제
    $ git reset --hard HEAD^
  3. git push 취소하기
    가장 최근의 commit을 취소 ( --mixed)

    $ git reset HEAD^
    목록 확인 후 원하는 시점으로 되돌리기
    $ git reflog
    $ git log -g
    $ git reset HEAD@{number}
    $ git reset [commit id]

** git status : 상태 체크 / git log commit : commit 목록 확인 / git commit -amend : 커밋 메시지 변경

 

더보기

TIP.  git reset 명령은 아래의 옵션과 관련해서 주의하여 사용해야 한다.

reset 옵션

–soft : index 보존(add한 상태, staged 상태), 워킹 디렉터리의 파일 보존. 즉 모두 보존.

–mixed : index 취소(add하기 전 상태, unstaged 상태), 워킹 디렉터리의 파일 보존 (기본 옵션)

–hard : index 취소(add하기 전 상태, unstaged 상태), 워킹 디렉터리의 파일 삭제. 즉 모두 취소.

 

TIP.  만약 워킹 디렉터리를 원격 저장소의 마지막 commit 상태로 되돌리고 싶으면, 아래의 명령어를 사용한다. 단, 이 명령을 사용하면 원격 저장소에 있는 마지막 commit 이후의 워킹 디렉터리와 add했던 파일들이 모두 사라지므로 주의해야 한다. 

워킹 디렉터리를 원격 저장소의 마지막 commit 상태로 되돌린다.

$ git reset --hard HEAD 

원격 저장소에 강제로 push 한다.

$ git push origin [branch name] -f 또는 $ git push origin +[branch name]

// Ex) master branch를 원격 저장소(origin)에 강제로 push $ git push origin +master

 

TIP.  경고를 무시하고 강제로 push 하기

[방법 1] -f 옵션 –force 옵션과 동일하다.

[방법 2] +[branch name] 해당 branch를 강제로 push한다.

untracked 파일 삭제하기 git clean 명령은 추적 중이지 않은 파일만 지우는 게 기본 동작이다. 즉, .gitignore 에 명시하여 무시되는 파일은 지우지 않는다.

$ git clean -f // 디렉터리를 제외한 파일들만 삭제

$ git clean -f -d // 디렉터리까지 삭제

$ git clean -f -d -x // 무시된 파일까지 삭제

 

TIP.  option -d 옵션 디렉터리까지 지우는 것

-x 옵션 무시된 파일(.DS_Store나 .gitignore에 등록한 확장자 파일들) 까지 모두 지우는 것

// Ex) .o 파일 같은 빌드 파일까지도 지울 수 있다.

-n 옵션 가상으로 실행해보고 어떤 파일들이 지워질지 알려주는 것

 

💻 upstream 관련 블로그

[git] github 협업을 위한 fork 부터 upstream 설정까지.

[Git] Fork 한 repository 최신으로 동기화하기

 


3. 해결방법

결국은 브랜치를 삭제하고 다시 만들었으며, 이 문제의 해결방법은 찾지 못했다.

내일 튜터님에게 질문하려고 한다.

 

+ 4월 13일 포크한 저장소의 새로운 브랜치를 가져오는 방법.

 

git remote add upstream [오리지널 저장소]
// 오리지널 저장소를 upstream 으로 추가

git remote -v
// 추가가 잘 되었는지 확인. 터미널에 브랜치 이름들이 나열된다.

git fetch upstream
// 새로운 브랜치들을 [upstream/브랜치 이름(1)] 으로 가져온다.

git checkout [브랜치 이름(1)]
// 가져온 브랜치로 이동

git push origin [브랜치 이름(1)]
// 내 리포지토리에 반영

 

 

"git checkout feed" 명령어 실행 시 오류 : git checkout --track origin/feed 으로 해결

더보기
git remote add upstream / git remote -v / git fetch

 

git checkout feed를 해야하는데 git checkout upstream/feed를 했다.

 

그러자 브랜치 이름이 이상하게 들어갔다.

 

이는 브랜치를 찾을 수 없거나 여러개의 원격 추적 브랜치와 일치하는 경우에 발생하는 오류라고 한다. git checkout --track origin/feed 로 해결하였다.

$ git checkout --no-guess feed

feed가 정상적으로 찾아지는 모습!!

 

 

+ 추천해준 다른 방법들

1. checkout.defaultRemote 설정 변경하기: Git 구성에서 checkout.defaultRemote 값을 변경하여 원격 추적 브랜치의 기본 원격 리모트를 설정할 수 있습니다. 예를 들어, "origin" 리모트를 기본 원격 리모트로 설정하려면 다음과 같이 입력합니다 : git config --global checkout.defaultRemote origin 

 

2. 원격 추적 브랜치명 변경하기: 만약 여러 개의 원격 추적 브랜치와 일치하는 경우, 각 원격 추적 브랜치의 이름을 변경하여 충돌을 해결할 수도 있습니다. 예를 들어, "feed"라는 이름의 원격 추적 브랜치 중 하나를 "origin/feed"로 변경하고 싶다면 다음과 같이 입력합니다 : git branch -m feed origin/feed

 

 

 


4. 알게된 점

풀 리퀘스트에 조금씩 익숙해지고 있다.

깃허브 오류는 대부분 오류를 차근차근 읽어나가면 방향이 있다. (하지만 이 오류를 처음 마주하게 되면 빠르게 서치하여 빠져나가기는 힘들었다.)

 

 

 

 

 

 

Comments