- 공유 할 필요 없는 파일들을 제외 시키는 .gitignore 을 .git에 등록해야한다.
- github에서 생성 시 언어별/ 프로젝트 별로 적용할 수 있게 제공한다.
- 플랫폼 별 구글링하면 나온다.
- 병합 Merge
// 항상 시작 전 Fetch나 Pull로 원격저장소 내용 로컬에 동기화
git fetch / git pull
git cherry-pick <태그이름> 커밋만 가져와야할때 해당 라인이 문제가 있을때 매우
// 기억해야할 것은 병합할 브랜치로 checkout 가서 작업 진행 main에 jobA, jobB를 merge할 경우 main으로 가기
git checkout main
//merge 해서 충돌 시 선택해 처리
git merge origin/jobA
git merge origin/jobB
//머지할때 commit massage 안남게 할경우 --no-commit 해야함
git merge --no-commit
//머지할때 상대 브랜치에 있는 커밋에 checkout 안하고 머지하고 싶을 때
git merge commitHash코드 4글자 쓰면됨 ex)git merge cad3
cad39992d 이면 cad3 안 될때 전체 hash 값 쓰면 됨.
//Push 하기
git push origin main
- 충돌 Conflict
일단 용어
Current 기존꺼 (내가 수정한거)
Incomming 머지하러 가져온거 (남이 수정한거)
Combination/Both 둘 다 모두 적용하기
충돌 시 GUI 같은 경우 editor를 열어서 충돌 난 부분을 선택하는 과정을 거치면 됨.
이때 소통이 필요할 수 있다.
- 현재 로컬(Local)을 원격저장소(Origin)으로 온전히 동기화 시키고 싶을 때
git fetch --all --prune
// fetch --all 원격 저장소에 있는 모든 변경사항을 가져오는 거
// --prune 원격 저장소에 없는 내용을 지워버리는 기능
- 마지막에 올린 Commit이 잘못 된 경우
- [CASE 1] push는 안했고(Origin적용 No) commit을 했는데 파일을 더 추가하고 싶은 상황 혹은 커밋 메시지만 바꾸고 싶을 떄
파일 ADD 후git commit --amend -m "수정된 메시지"
- [CASE 2] push가 이미 된 파일을 수정해야할 경우
git rebase HEAD~[거슬러 올라가고 싶은 커밋 수] -i
git rebase HEAD~1 -i // 예를 들어, 바로 전 커밋의 메세지를 재작성하길 원한다면
화면에 나오는 pick -> reword로 변경 (i키 누르면 입력가능)
:wq로 편집기를 빠져나옴
reword로 바꿨던 커밋들이 순서대로 나옴 메시지 수정
:wq로 저장
pick 7c65355 Task 1/3
squash 2639543 Task 2/3
squash d442427 Task 3/3
squash로 커밋내용 합칠수도 있다.
-- git push -f / git fetch && git merge --squash
// github에 강제 push (내 원격저장소 내용으로 덮어쓰기 때문에 조심해야함)
git push -f
// 특정 브랜치에 올릴때
git push origin [브랜치명] -f
※ 주의사항: rebase로 커밋 내용을 바꿀경우 commit id와 시간이 달라짐.
직전에 올린 경우는 크게 문제가 되지 않지만 만약 5개전 커밋내용을 바꾼다고 했을때 1~5번까지 commit id와 시간이 바뀌기 때문에 다른사람들과 협업시에는 문제가 생길수 있음.
직전 커밋정도가 아니면 최대한 사용을 피하는게 좋음.
-
모든 id를 볼 수 있는 거 이상한 브랜치에 커밋 했던거 찾을 때 필요
git reflog -
이미 다 push한 파일이 원격저장소에 남아있을경우 .gitignore에 적어도 계속 업데이트 된다. 따라서 원격저장소에 올라간 파일 제거하는 방법
// 원격 저장소와 로컬 저장소에 있는 파일을 삭제한다.
$ git rm [File Name]
// 원격 저장소에 있는 파일을 삭제한다. 로컬 저장소에 있는 파일은 삭제하지 않는다.
$ git rm --cached [File Name]
따라서 아래와 같이 git rm –cached [File Name] 명령어를 이용하여 원격 저장소에서 잘못 올라간 파일을 삭제해야 한다.
// .idea/modules.xml 파일 삭제
$ git rm --cached .idea/modules.xml
// .idea 폴더 하위의 모든 파일 삭제
$ git rm --cached -r .idea/
- 매우 유용한 팁!! 보통 merge conflict 시 한쪽으로 하는 경우가 많음
[Accept All Incoming Change] 변경된 커밋 부분으로 모두 대체 (점도 찍어야함)
git checkout --theirs .
git add .
[Accept All Current Change] 기존 커밋 내용으로 모두 대체 (점도 찍어야함)
git checkout --ours .
git add .
-
VSCode 에서 git 사용 시 팁
;
이거 쓰면 cmd 커맨드 라인에서 커맨드 연결해서 쓸 수 있음.ex) git pull ; git merge
깃 풀한다음 머지하기 -
git checkout -
git checkout -
- 마지막으로 접속한 branch로 이동 - 의 의미가 바로직전이므로 다른 커맨드에서 응용 가능
- 스마트 병합 적용하기
- Unity는 씬과 프리팹 파일을 구문상 올바르게 병합할 수 있는 UnityYAMLMerge라는 툴을 내장
//.gitignore 에 추가
# Smart Merge
[merge]
tool = unityyamlmerge
[mergetool "unityyamlmerge"]
trustExitCode = false
cmd = '<path to UnityYAMLMerge>' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
//<path to UnityYAMLMerge>는 UnityYAMLMerge의 경로로 바꿔줘야 한다. (\\ 이거 두개 써야하는거 인지)
//Unity Hub를 쓴다면 C:\\Program Files\\Unity\\Hub\\Editor\\(유니티 버전)\\Editor\\Data\\Tools\\UnityYAMLMerge.exe, Unity Hub를 안 쓴다면
//C:\\Program Files\\Unity\\Editor\\Data\\Tools\\UnityYAMLMerge.exe일 것이다.
//EX) cmd = 'C:\\Program Files\\Unity\\Hub\\Editor\\2021.3.9f1\\Editor\\Data\\Tools\\UnityYAMLMerge.exe' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
// 이부분 안해도 됨
// root에 아래 내용대로 .gitattributes 파일 만들기
// *.cs diff=csharp text
// *.cginc text
// *.shader text
// *.unity merge=unityyamlmerge eol=lf
// *.prefab merge=unityyamlmerge eol=lf
// *.mat -merge eol=lf
// *.anim -merge eol=lf
// *.physicMaterial -merge eol=lf
// *.physicsMaterial2D -merge eol=lf
// *.asset -merge eol=lf
// *.meta -merge eol=lf
// *.controller -merge eol=lf
// *.spriteatlas -merge eol=lf
유니티 Project Settings > Editor와 Version Control에서 체크
- Asset Serialization mode : Force Text
- Version Control mode : Visible Meta Files
- 유니티 내에서 제공하는 Plastic SCM을 사용하는것도 방안
- SourceTree
- Git Desktop
- VS Code Extension [Only 개발자 추천]