혼자 적어보는 노트

[Git] pull / push / fetch 다루기 + 충돌 해결 본문

기타

[Git] pull / push / fetch 다루기 + 충돌 해결

jinist 2022. 2. 5. 02:08


 

[push / pull / fetch]

 

push

commit한 내용을 원격저장소에 올리기

git push

 

강제 push

원격저장소의 내용을 로컬저장소와 일치하도록 덮어씌우기

*협업 시에는 꼭 상의 후 진행

git push --force
git push -f

 


 

pull

원격 저장소의 커밋들을 로컬로 가지고 올 때 사용.

- 원격 저장소의 최신 커밋들을 로컬저장소로 가지고와서 merge 또는 rebase 할 수 있음

- fetch로 

git pull

* 협업 시 원격에 적용된 새 버전을 pull로 받고 push를 해야한다.

 

📌 협업 시 상황에 따른 pull 사용

 

상황 1.

팀원A가 원격에 push한 상태지만
나는 아무 작업도 하지 않은 상태

git pull

내 로컬에 변화가 없다면 pull을 받은 후 작업하면 된다.

 

상황 2.

팀원A가 원격에 먼저 push를 한 상태 (업데이트 된 상황)에서
내 작업을 commit하고 puch하려는데 에러메세지가 발생

error: failed to push some refs to 'https://github.com/jinist94/git-test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

 

pull을 사용하여 원격의 최신 업데이트 내역으로 맞춤과 동시에
내가 push할 내역들 또한 맞춰주어야 한다.

 

merge를 이용한 방식

git pull // pull 입력 시 merge로 진행
git pull --no-rebase

 

reabse를 이용한 방식 

git pull --rebase

 

❗ 상황3. 충돌 해결

같은 파일의 같은 위치에 변경사항이 있을 경우 충돌 발생

 

팀원A가 friend.txt 파일을 수정하여 push
나도 friend.txt 파일을 전체 수정하여 commit을 한 상태.
push가 되지 않아 pull을 했는데 충돌 발생.

 

충돌이 되던 부분 수정 및 저장 후 해당 파일을 stage에 올린다.

git add [충돌되던 파일명]

 

rebase로 진행했을 경우 아래의 명령어로 REBASE 진행 및 commit

git rebase --continue
// continue진행 시 자동으로 커밋 에디터로 이동

 

merge로 진행했을 경우 commit

git commit

 

커밋 완료 후 push하면 내가 push한 커밋과 원격에 있는 커밋들이 맞춰진다.

 

 


 

fetch

원격저장소에 있는 변경사항들을 로컬 저장소에 가져오기만 하고 merge나 rebase는 하지 않는다.
* 즉 변경한 내용을 가져와서 병합하는게 아닌 변경한 내역들을 확인 할 때 사용

 

📌 fetch 사용상황 예시

다른사람과 원격저장소를 이용할 때 profile.txt 파일을 push를 하고
이후에 profile.txt파일을 누군가가 수정했는지 확인하고 싶을 때.

 

1. fetch를 하여 내용을 확인한다.

git fetch [원격저장소 이름]


//예시
$ git fetch origin
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 697 bytes | 63.00 KiB/s, done.
From https://github.com/jinist94/git-test     
   c87c221..0be77c7  main       -> origin/main

위와 같이 맨 하단에 commit한 내용이 보여진다.

 

 

2. 해당 원격 저장소의 해당 브랜치로 checkout 하기.

git checkout [원격저장소 이름]/[원격 브랜치 이름]

//예시
git checkout origin/main

 

3. 현재 원격브랜치 확인 시 현재 브랜치가 원격 브랜치임을 알 수 있다.

$ git branch -a
* (HEAD detached at origin/main)
  main
  new-branch
  remotes/origin/main
  remotes/origin/new-branch

 

4. 이 상태에서 profile.txt 파일을 확인해보면 원격 브랜치의 profile.txt파일이 연결되어 있으니
해당파일을 확인할 수 있다.

 

5. 해당 원격 브랜치의 커밋상황을 볼 수도 있다.

git log

git log를 통하여 원격 브랜치의 히스토리 정보도 확인할 수 있다.

 

commit 0be77c74e40fa48daa2d582b9e5f975bd315319f (HEAD, origin/main)
Author: jinist94 <81489300+jinist94@users.noreply.github.com>
Date:   Sat Feb 5 04:30:31 2022 +0900

    Update Profile

commit c87c221dd5ae42b666f6050f5ad5350cbb3dffa9 (origin/new-branch, new-branch, main)
Author: jinist94 <81489300+jinist94@users.noreply.github.com>
Date:   Fri Feb 4 03:14:14 2022 +0900

    Add profile

commit의 맨 오른쪽을 보면 fetch한 commit이 어느 브랜치에 적용되어 있는지 확인할 수 있다.
즉, 내가 push한 이후에 누군가가 commit - push를 했는지 알 수 있다.

이렇게 원격브랜치의 파일 및 커밋내역을 확인하여 파일을 병합할 지 말 지 확인을 할 수 있는 것이다.

 

6. 다시 로컬 브랜치로 이동하여 pull을 어떤 방식으로 할 지 결정해준다.

 

git switch main
git pull

 

📌 fetch 사용상황 예시2

 

원격저장소에 누군가가 new-branch를 추가하고 push하였는데

해당 브랜치를 확인하거나 내 로컬 저장소에도등록해야할 때

 

1. fetch를 사용하여 추가된 브랜치를 확인한다.

$ git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 693 bytes | 69.00 KiB/s, done.
From https://github.com/jinist94/git-test
 * [new branch]      new-branch -> origin/new-branch

 

2. 전체 브랜치를 확인하여 원격의 브랜치를 확인한다.

$ git branch -a
* main
  remotes/origin/main
  remotes/origin/new-branch

 

3. 새로 생긴 원격의 new-branch를 확인만 해보고 싶다면 아래의 명령어로 확인.

git checkout origin/new-branch

 

4. 현재 브랜치가 로컬 저장소인 상태에서

아래의 명령어로 원격 저장소에 있는 new-branch를 로컬에 new-branch 추가한다.

git switch -t origin/new-branch

 

❗ 알아야 할 점.

fetch 전에 pull을 해버리면 git fetch를 했을 경우 아무 내용도 나타나지 않는다.

pull에는 fetch의 기능인 "원격 저장소에서 내용을 가져오는 일"이 포함되어 있기 때문에

pull을 했을 경우 2번부터 진행하면 된다.

 

Comments