Git 뿌수기

04. [Git 뿌수기] 4주차 내용 정리 (pull과fetch의 차이점, fetch, ahead, behind, diff, cherry-pick, rebase )

drizzle0925 2021. 9. 8. 23:12
728x90

pull과 fetch의 차이

pull

  • 원격 저장소로부터 필요한 파일을 다운+병합
  • 지역 브랜치와 원격 저장소 origin/master가 같은 위치를 가리킨다.

fetch

  • 원격 저장소로부터 필요한 파일을 다운 (병합은 따로 해야 함)
  • 지역 브랜치는 원래 가지고 있던 지역 저장소의 최근 커밋 위치를 가리키고, 원격 저장소 origin/master는 가져온 최신 커밋을 가리킨다.
  • 신중할 때 사용한다.
  • 사용하는 이유?

     1. 원래 내용과 바뀐 내용과의 차이를 알 수 있다. (git diff HEAD origin/master)

     2. commit이 얼마나 됐는지 알 수 있다(git log --decorate -all --oneline)

     3. 이런 세부 내용 확인 후 git merge origin/master 하면 git pull 상태와 같아진다. (병합까지 완료)

 

 

 

pull

1. fetch 레포지토리를 생성합니다.

 

2. fetch-1, fetch-2 로컬 저장소를 생성하고 fetch 레포지토리랑 연결합니다.

 

3. fetch-1에서 work.txt 파일을 만들고 원격 저장소에 push 합니다.

 

원격 저장소(fetch)

 

4. fetch-2에서 pull 합니다.

pull 하면 work.txt 파일이 생기고 안에 내용은 fetch-1에서 push 했던 내용과 같습니다.


fetch

1. fetch-1에서 새로운 버전을 생성하고 원격 저장소에 push 합니다.

원격 저장소(fetch)

 

2. fetch-2에서 fetch를 합니다.

git fetch

fetch는 pull과 다르게 work.txt 파일에 변동이 생기지 않습니다.

 

3. 로그를 확인해 봅니다.

git log

원래는 origin/master가 표시되는데 표시가 없어졌습니다.

 

4. log에 --all 옵션을 추가해서 다시 확인합니다.

git log --all

원격 저장소의 master 브랜치의 버전이 더 앞서 있는 걸 확인할 수 있습니다.

 

5. merge 명령어를 이용해서 병합하면 pull 한 것과 같습니다. (fast-forward 됩니다.)

git merge origin/master

 

 

파일 수정 > add, commit > fetch > merge를 하는 경우

1. fetch-1에서 work3 버전을 만들어 push 합니다.

 

원격 저장소(fetch)

 

2. fetch-2에서 memo.txt 파일을 생성하고 commit 합니다.

 

log는 아래와 같습니다.

 

3. fetch를 하고 log를 확인합니다.

origin/master가 사라진 모습입니다.

 

4. log에 --all 옵션을 줘서 다시 확인해 봅니다.

work3 버전이 보입니다. 

 

5. 하지만 work.txt 내용에는 반영되어 있지 않습니다.

 

6. git merge 합니다.

git merge origin/master

merge commit이 자동으로 생성됩니다.

 

merge commit이 최상단에 있고 work.txt 내용을 확인해 보니 work 3 버전의 내용이 적용되어 있습니다.


ahead

원격 저장소의 브랜치보다 버전의 앞서 있을 경우

 

아래와 같은 메시지가 나옵니다.

origin/master보다 commit이 하나 앞서있다는 뜻입니다.

 

behind

반대로 늦을 때는

 

behind로 표시됩니다.


diff

파일의 어떤 내용이 변경되었는지 차이점을 비교할 수 있습니다.

Working Derectory와 Staging Area 간의 비교도 가능하고 commit 간의 비교, branch 간의 비교도 가능합니다.

 

관련 명령어

 

# commit된 파일상태와 현재 수정중인 상태 비교
git diff

# commit된 파일상태와 add된 파일 상태 비교
git diff --staged

# commit간의 상태 비교하기 - commit hash 이용
git diff [비교할commit해쉬1] [비교할commit해쉬2]
# ex) git diff 04e16f 0d813c

# commit간의 파일 상태 비교하기 - commit hash 이용
git diff [비교할commit해쉬1] [비교할commit해쉬2] [파일이름]
# ex) git diff 04e16f 0d813c work.txt

# commit간의 상태 비교하기 - HEAD 이용
# 가장 최근의 커밋과 그 전의 커밋을 비교한다
git diff HEAD HEAD^

# branch간의 상태 비교하기 - HEAD 이용
git diff [비교할branch1] [비교할branch2]
# ex) git diff feature/test origin/master
# local의 feature/test브런치와 remote의 master branch 비교

 

삭제된 부분을 빨간색으로 추가된 부분은 초록색으로 표시됩니다.


cherry-pick

수정된 부분만 적용

1. master 브랜치에서 a와 b브랜치 생성

git branch a
git bracnh b

2. a에서 a1.txt / a2.txt 생성 후 add commit

touch a1.txt
git add a1.txt
git commit -m "a1"

touch a2.txt
git add a2.txt
git commit -m "a2"

 

3. b로 브랜치 전환

git checkout b

4. b에서 b1.txt / b2.txt / b3.txt 생성 add, commit

touch b1.txt
git add b1.txt
git commit -m "b1"

touch b2.txt
git add b2.txt
git commit -m "b2"

touch b3.txt
git add b3.txt
git commit -m "b3"

5. a브랜치에 b2.txt 수정 내용을 cherry-pick

git checkout a
git cherry-pick "b2_commit_id"

 

merge의 경우 스냅샷 전체를 가져오기 때문에 b2_commit_id를 입력하면 b1.txt / b2.txt를 동시에 가져옵니다.

 

참고 사이트

https://like-a-drizzle.tistory.com/204

 

26. [Git] cherry-pick 개념과 기본 사용법

cherry-pick 그 버전(commit)이 생성될 때에 변화를 가져오는 것을 cherry-pick(체리 픽)이라고 합니다. merge에서도 commit 아이디를 지정해서 병합하는 것이 가능한데 이것은 그 버전의 스냅샷(snapshot) 전체

like-a-drizzle.tistory.com


rebase

아래는 c에서 master와 topic 브랜치로 나눠지는 그림입니다.

 

c에서 파생된 master를 아래와 같이 이동시키는 기법이 rebase(베이스를 변경한다)라고 합니다.

 

commit history를 깨끗하게 유지할 수 있습니다.

 

 

cherry-pick과 같은 환경을 준비합니다. (4번까지)

 

5. a브랜치에서 rebase 실행

git checkout
# git rebase "브랜치 이름"
git rebase b

 

6. log를 확인해 보면 a1과 a2 commit이 b3 뒤로 이동되어 있습니다.

 

merge와 rebase가 다른 점

728x90