ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Pull Request, Merge, git pull 전략(--rebase, --ff-only)
    code/github 2023. 7. 22. 01:58

    Pull Request 

    : 내가 수정한 내용을 main(원래의 레파지토리)에 반영해달라고 요청

     

    Merge

    : 요청(PR)받은 내용을 반영하겠다. 

     

     

    원격 저장소의 브랜치 확인

    git branch -r

     

     

    - git pull [remote] [branch]

    git pull origin main

    : 원격 저장소에서 데이터를 가져오고 로컬 저장소의 현재 변경 사항이 자동으로 저장된다.

     

    "--rebase" 옵션을 사용하지 않고 git pull을 할 경우 Merge Commit(C와 D를 포함)이 만들어진다.

    • 즉, 원격저장소와 로컬 저장소의 Commit 이력이 전부 유지됨을 뜻한다.

     

    ex)

    second > git pull origin main

     

    second에 remote의 main브랜치의 내용을 가져온다. 

     

     

     

     

    git pull 속성

    1) --ff-only

    git pull origin main --ff-only

    fast-foward 관계

    : 한마디로 말해서 정방향인 관계

    • 커밋A의 히스토리: X -> A
    • 커밋B의 히스토리: X -> A -> Y -> B

    커밋B의 히스토리에 커밋A의 히스토리가 모두 포함되어 있다.

     

    non fast-foward 관계

     

    • 커밋A의 히스토리: X -> Y -> A
    • 커밋B의 히스토리: X -> Y -> Z -> B

    커밋B의 히스토리에 커밋A의 히스토리가 포함되어 있지 않다.(A의 커밋이 포함되어 있지 않다.)

     

     

    2) --rebase

    second >

    git pull origin main --rebase

    (현재 브랜치인 second를 main과 같게 만든다. )

    어떤 문제가 발생함? 

    강제로 history를 임의로 변경시킬 수 있음.

     

    원격 저장소의 commit이력을 로컬 저장소에 합치겠다. 로컬 저장소의 변경 사항은 재 반영된다. 

     

     

     

     

    [오류 메세지]

    자동 병합: hello.txt
    충돌 (내용): hello.txt에 병합 충돌
    error: 다음을 적용할(apply) 수 없습니다: 90e83aa... 5th 추가

    새로 5th를 commit 했음. (main 에는 없는 commit 추가됨)
    힌트: Resolve all conflicts manually, mark them as resolved with
    힌트: "git add/rm <conflicted_files>", then run "git rebase --continue".
    힌트: You can instead skip this commit: run "git rebase --skip".
    힌트: To abort and get back to the state before "git rebase", run "git rebase --abort".
    Could not apply 90e83aa... 5th 추가

     

     

    git add hello.txt
    git rebase --continue

    [HEAD 분리됨 cd02b67] 5th 추가

    : 최신 commit이 cd02b67가 아니게 된다. 

     

     

    (참조)

    https://velog.io/@nittre/Git-git-checkout-%EA%B3%BC-detached-HEAD

     

     

    [Git] git checkout 과 detached HEAD

    페어 프로그래밍을 하다가 특정 파일만 pull 해야하는 상황이 생겨서 구글링을 하던 중 다음과 같은 방식을 발견했다.

    velog.io

     

     

    브랜치를 checkout 한다는 것

    git checkout 명령어는 때때로 git clone과 혼동될 수 있다. git clone은 리모트 저장소에서 코드를 가져오고(fetch code from remote), 반면 git checkout은 이미 로컬에 있는 코드의 버전을 전환한다(switch version of code on local).

     

    새로운 브랜치를 만들어 전환하기

    # 현재 브랜치에서 feature1이라는 브랜치를 만든다
    $ git branch feature1
    
    # 현재 브랜치에서 feature1이라는 브랜치를 만들고 해당 브랜치로 전환
    $ git checkout -b feature1

    checkout -> 특정 커밋이나 브랜치를 가리킨다. 

    브랜치를 가리킬 때에는 최신 커밋을 가리킨다. 

     

    특정 커밋을 가리킬 때는 최신 커밋이 아닐 수 있기 때문에, 이때는 HEAD가 최신이 아니게 된다. 

    우리의 작업 공간이 커밋 b이기 때문에, 기존 브랜치에 commit할 수가 없다. 이미 커밋 c가 있기 때문이다.

    그래서 Git은 HEAD가 특정 커밋을 가리키는 이 상태를 detaced HEAD(분리된 머리) 상태라고 명명했다.

    detached HEAD 상태에서 작업은 할 수 있다. 커밋도 할 수 있다. 다만 그것을 다른 작업과 merge하거나 리모트에 pull 할 수는 없다. detached HEAD 상태에서 작업한 내용물들은 어느 브랜치에도 속해있지 않기 때문이다. 따라서 detached HEAD 상태에서 다른 브랜치로 checkout 하면 다시 detached HEAD 상태 때 했던 작업으로 돌아갈 수 없다. (detached HEAD 일 때 했던 커밋 ID를 알면 돌아갈 수는 있긴 하지만 어렵다.)

    만약 특정 커밋에서 했던 작업을 살리고 싶다면 어떻게 해야 할까? 간단하다. detached HEAD 상태일 때 했던 작업을 브랜치로 만들어주는 것이다.

    $ git checkout -b <new branch name>

     

    [ff관계]

    https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=parkjy76&logNo=220308638231&categoryNo=73&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView 

     

    'code > github' 카테고리의 다른 글

    git cherry-pick 체리픽 써보기  (0) 2023.10.20
Designed by Tistory.