-
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
브랜치를 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관계]
'code > github' 카테고리의 다른 글
git cherry-pick 체리픽 써보기 (0) 2023.10.20