티스토리 뷰

TIL

TIL 220807 git command

2021bong 2022. 8. 8. 01:49

git merge

브랜치를 병합하는 명령어이다. merge를 할 때는 합치려고 하는 메인 브랜치에 위치해있는 상태로 합쳐서 끝낼 브랜치를 병합하면 된다. 병합 후에는 더 이상 필요없으므로 합쳐서 끝낸 브랜치를 삭제하면 된다.

// 메인 브랜치로 이동 => 합쳐서 끝낼 브랜치를 병합
git checkout <메인 branch>
git merge <합쳐서 끝낼 branch>
// 머지한 브랜치 삭제
git branch -d <합쳐서 끝낸 branch>

 

3-way merge

메인브랜치에 브랜치가 나뉜 커밋을 기준으로 이후에 커밋이 있을 때 진행된다. 두 브랜치가 합해지면서 새로운 커밋이 생성된다.

3-way merge가 진행되는 경우
3-way merge

fast-forward merge

새로운 브랜치가 생성된 커밋 이후로 메인 브랜치에 커밋이 없을 때 진행된다. 메인 브랜치의 head가 새로운 브랜치의 최신 커밋을 가르키게 된다. 빨리 감기라고 부른다.

fast-forward가 진행되는 경우
fast-forward

 


conflict 발생시

merge를 하려고 할 때 충돌이 발생할 때가 있다. git merge --abort 명령어를 사용해서 merge를 취소할 수 있다.

git merge --abort

 

충돌을 해결하고 merge를 진행할 수도 있다. 두 브랜치에서 같은 파일의 한 부분을 동시에 수정하고 merge하면 Git은 해당 부분을  Merge 하지 못하고 개발자에게 알린다. git status 명령어로 어떤 파일에서 충돌이 발생했는지 확인할 수 있고 해당 파일에 가면 =======를 기준으로 위아래를 비교해 서로 충돌한 내용을 보여준다. <<<<<<<, =======, >>>>>>>`가 포함된 행을 삭제하거나 수정한다. vscode같은 경우에는 충돌한 부분을 오른쪽위에 미리보기에서 빨간줄로 보여준다. 수정은 하고싶은대로 해도 된다. 그리고 git add 명령어로 바뀐 부분을 스테이징하고 커밋하면 된다.

 

 


 

git rebase

merge와 비슷한데 base를 옮기는 명령어이다. merge와는 반대로 합쳐서 끝낼 브랜치로 이동해서 진행한다. 

merge를 사용하면 히스토리 기록이 남아서 여러 브랜치를 사용하는 경우에는 매우 복잡한 히스토리 구조가 될 수 있다. 흔적이 남지 않아서 히스토리를 깔끔하게 관리할 수 있다.

// rebase할 브랜치로 이동 => 메인 브랜치로 rebase
git checkout <합쳐서 끝낼 branch>
git rebase <메인 branch>

 

rabase를 하기 전
rebase를 하고 난 후

rebase를 할 때 주의할 점

이미 공개 저장소에 Push 한 커밋을 Rebase 하지 말 것
Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다. 새 커밋을 서버에 Push 하고 동료 중 누군가가 그 커밋을 Pull 해서 작업을 한다고 하자. 그런데 그 커밋을 git rebase 로 바꿔서 Push 해버리면 동료가 다시 Push 했을 때 동료는 다시 Merge 해야 한다. 그리고 동료가 다시 Merge 한 내용을 Pull 하면 내 코드는 정말 엉망이 된다.

 

rebase의 단점

merge는 충돌이 발생하면 한번만 처리하면 되지만 rebase branch의 각각의 commit마다 충돌처리를 해주어야 한다. 오래전에 수정했던 커밋을 rebase 과정에서 또 다시 conflict를 해결해줘야 할 수도 있다. 충돌을 해결하고 continue로 rebase를 계속 진행하면 된다.

git rebase --continue

명령어를 진행할 때 위치해야하는 브랜치가 다른데 merge는 이사오라고 할 브랜치에 있으면 되고 rebase는 이사갈 준비하는 브랜치에 있으면 된다. merge는 임대인 브랜치에서 rebase는 세입자 브랜치에서 명령어를 입력하면 된다.

 

 


 

git fetch

원격 저장소의 코드를 로컬로 가져오는 명령어이다. pull과 다르게 merge는 진행하지 않는다. git diff 명령어로 다른 점을 확인할 수 있다.

git fetch

+ 추가 공부가 필요

 

 


 

git pull

원격 저장소의 코드를 로컬로 가져와서 병합하는 명령어이다. pull 명령어는 원격 저장소의 코드를 가져오고 원격 저장소의 코드가 더 최신의 코드라면 로컬의 코드를 최신 코드로 변경한다. fetch + merge 인 것이다. remote repo에 권한이 있어야 실행할 수 있다.

pull을 해오는 방법을 정해주지 않아서 pull이 안된다면 어떻게 pull해올지 방법을 정해주는 명령어를 입력하면 된다. 충돌이 발생하면 merge나 rebase때 해결하는 방법대로 진행하면 된다.

git pull [<저장한 리모트 이름> [<원격저장소의 가져올 branch>]]

// merge방법으로 가져오기
git pull --no-rabase
// rebase방법으로 가져오기
git pull --rebase

 

git push -f

커밋하나를 하면 습관적으로 push를 진행하는데 깃헙에 가서 확인해보니 커밋 메세지에 오타가 났다. 로컬에서는 --amend 명령어를 넣어서 커밋 메세지를 수정하고 원격 레포에 푸시하는 방법을 찾다가 발견했다. -f 나 --force 키워드를 넣고 로컬의 커밋을 강제로 푸시하면 된다.

git push -f <저장한 리모트 이름> <원격저장소의 branch>
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함