git을 활용한 협업 기능 정리
Git의 branch 관리
1. branch 만들기, branch 확인하기
브랜치 만들기 : git branch [원하는 브랜치명]
브랜치 리스트 확인 : git branch
또는 git branch —list
$ git branch yoonkie
$ git branch
* master
yoonkie
2. 만들어진 branch로 이동
git switch [브랜치명] 또는 git checkout [브랜치명]
$ git checkout yoonkie
Switched to branch 'yoonkie'
switch vs checkout ??
기존에 git을 사용하면서 checkout으로 브랜치를 이동했는데 최근 switch 명령어를 많이 사용(?)한다고 한다.
알고보면, switch는 checkout의 분리된 기능이다.
switch : 브랜치를 변경한다
switch를 통해 브랜치를 변경할 수도 있고, 기존에 없는 브랜치를 생성하면서 변경도 가능
( master → yoonkie)
$ git switch yoonkie
Switched to branch 'yoonkie'
restore : 작업중인 파일을 되돌린다 (복원)
작업중인 파일 중 기존 마지막 커밋의 상태로 되돌리고자 할 때 restore를 사용한다
$ git restore README.md
3. 브랜치 병합하기 Merge
git merge 명령어를 통해 다른 브랜치와 병합할 수 있다.
-
matser 브랜치에서 git merge yoonkie 수행
: yoonkie 브랜치를 master 브랜치에 병합한다는 뜻
-
yoonkie 브랜치에서 git merge master 수행
: master 브랜치를 yoonkie 브랜치에 병합한다는 뜻
Merge 충돌 관리
여려명이 같은 기능, 파일을 수정하면 merge 하면서 충돌이 쉽게 발생한다.
두 명이서 같은 파일을 작업한다면 기존의 내용이 서로 다를 수 있으며, 이를 한쪽에서 merge 하면 git은 어떤 코드를 반영해야할지 모른다면서 충돌이 나게 되는것이다.
예시
- master 브랜치에서 수정한 README.md 파일을 commit한 상태
- yoonkie 브랜치에서 수정한 README.md 파일을 commit한 상태
- master 브랜치에서 yoonkie 브랜치 merge 수행
충돌이 발생했다고 표시되며, 브랜치 표시가 **(master | MERGING)**으로 변경된 것을 확인할 수 있다. |
(master | MERGING) : 충돌을 해결하기 위한 임의의 브랜치라고 보면 된다. |
«««HEAD : 현재 브랜치의 이력
[HEAD]의 코드
=========== : 현재 브랜치와 병합 브랜치의 구분선
[병합 할 브랜치]의 코드
»»»[브랜치 명]
실제로 README.md파일을 확인하면 위와같이 어떤 변경이 있었는지 확인할 수 있다.
해당 부분을 프로젝트 관리자가 수정 후 다시 commit 하면 된다.
- git diff : 병합 전 어떻게 바뀌었는지 확인할 수 있는 명령어
$ git diff
diff --cc README.md
index aa7a1fc,10703ad..0000000
--- a/README.md
+++ b/README.md
@@@ -1,3 -1,3 +1,7 @@@
# literate-engine
- 마스터가 쓴 텍스트
++<<<<<<< HEAD
++마스터가 쓴 텍스트
++=======
+ <p>윤기가 만진 p태그</p>
++>>>>>>> yoonkie
두 주석 모두 변경사항으로 반영하기로 하고 commit 하기
그러면 (master | MERGING)에서 다시 (master)브랜치로 돌아오게 된다. |
Merge 취소하기
merge 중에 발생한 충돌을 해결하는 또 다른 방법은 merge 전으로 다시 되돌리는 것이다.
git merge —abort
공백 무시하고 Merge 하기
공백때문에 충돌이 나는 경우도 있는데, 해당 충돌이 단순한 공백으로 인해 충돌났을 경우엔 Merge를 취소한 다음에 해당 옵션을 주어 다시 Merge하면 된다.
git merge -Xignore-space-change [병합할 브랜치명]
또는
git merge -Xignore-all-space [병합할 브랜치명]
$ git merge -Xignore-space-change yoonkie
Auto-merging README.md
Merge made by the 'recursive' strategy.
hello.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Git fetch와 pull의 차이
fetch
는 로컬 Git에게 원격 저장소에서 최신 메타데이터 정보를 확인하라는 명령을 전달하는 것이다.
즉, fetch
는 원격 저장소에 변경사항이 있는지만 확인하고, 변경된 데이터를 로컬에 실제로 가져오지는 않는다.
pull
은 원격 저장소에서 변경된 메타데이터 정보를 확인하고 최신 데이터를 복사하여 로컬에 가져온다.
fetch
후 merge
를 수행하면 pull
명령을 실행했을 때와 같은 이력이 만들어진다.
Fetch로 변경 사항 먼저 확인하는 법
- fetch 한 후에 FETCH_HEAD의 변경 사항을 확인하면 된다.
- git diff로 변경사항 확인
- git fetch
$ git fetch origin master
From https://github.com/minyoongi96/SSM-Project
* branch master -> FETCH_HEAD
- git diff
Pull로 원격 저장소의 최신 내용을 가져오기
$ git pull origin master
From https://github.com/minyoongi96/SSM-Project
* branch master -> FETCH_HEAD
Updating 85b7a2f..ceda8cd
Fast-forward
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
LF will be replaced by CRLF in - Git 경고 메시지 뜰 경우
txt, md 파일 등에서 개행문자(줄바꿈 : \n 등)가 운영체제마다 인식하는 방법이 달라서 git이 이 부분을 어떤 운영체제에 맞게 인식처리 할 지 몰라서 나는 오류이다.
- LF (Line-Feed)
- Mac, 리눅스 (Unix 계열) 줄바꿈 문자열 : \n
- CRLF (Carriage-Return + Line-Feed)
- 윈도우, DOS 줄바꿈 문자열 : \r\n
- CR(\r) + LF(\n) 두 동작을 합친것임
해결방법 : git config 설정을 변경해주기
- 윈도우, DOS인 경우 : git config –global core.autocrlf true 입력
- Linux, Mac인 경우 : git config –global core.autocrlf input 입력
댓글남기기