commit - 버전(타임캡슐) 담아 묻기
git add .
git add 파일
git commit
git commit -m ""
## add 와 커밋 메시지와 함께 커밋 (새로 추가한 파일은 포함 안되므로 git add 해야 함)
git commit -am ""과거로 돌아가기
- reset: 과거의 커밋으로 되돌아가는데, 과거의 커밋 이후의 커밋들은 전부 삭제
- revert: 과거의 커밋의 변경사항만을 현재로 가져오는 것
# reset
git reset --hard {commit}
# 아직 커밋하지 않은 내용을 전부 지움. 즉 마지막 커밋 상태로 되돌아감
git reset --hard
# revert
git revert {commit}
# no commit revert
git revert --no-commit {commit}
# revert 충돌 시
git rm/add 파일
git revert --continuebranch
# branch 목록 보기
git branch
# branch 만들기 (전환은 안함)
git branch 브랜치명
# branch 전환
git switch 브랜치명
# branch 만들기와 전환
git switch -c 브랜치명
# branch 삭제하기
git branch -d 브랜치명
# branch 강제 삭제하기 (지울 브랜치에 다른 브랜치로 적용되지 않은 커밋 있을 시)
git branch -D 브랜치명
# branch 이름 변경
git branch -m (기존 브랜치명) (새 브랜치명)
# 여러 브랜치의 로그 편리하게 보기
# (그러나 여러 브랜치 작업 내용 볼 때는 '소스 트리'로)
git log --all --decorate --onelone --graphbranch 를 합치는 두 가지 방법
- merge
- 두 브랜치의 최종 커밋을 하나의 새로운 커밋으로 합치는 작업!
- 브랜치의 사용 내역들을 남겨둘 필요가 있을 경우에 사용하자.
- rebase
- 한 브랜치의 커밋을 다른 브랜치의 최상단에 다시 적용하는 과정.
- 이를 통해 마치 두 브랜치가 순차적으로 개발된 것처럼 히스토리를 재정렬할 수 있음.
- 히스토리를 깔끔하게 만드는 것이 중요할 경우 사용하자
- 그러나 이미 공유된 브랜치에 대해서는 협업 시 주의해서 사용해야 함.
merge로 합치기
git switch main
git merge 브랜치명
# :wq 로 자동입력된 커밋 메시지 저장하여 마무리.
# 소스트리에서 확인해주기.
# 필요 시, merge 가 끝난 브랜치는 삭제merge 되돌리기
merge 도 하나의 커밋이므로, reset 으로 되돌리기 가능
rebase
# 1. 업데이트 하고자 하는 작업 브랜치로 switch 후,
# 2. 작업 브랜치의 커밋들을 main 브랜치로 가지 붙이기 한 다음에(이 과정에서 충돌 발생 시 해결해야 함),
# 3. main 브랜치가 뒤쳐져 있는 상황이기에( rebase를 통해 작업 브랜치의 변경 사항이 main의 최신 상태 위에 재배치되었기 때문에), main 브랜치시점에서 작업 브랜치와 merge 하면 됨.
git switch 작업-브랜치
git rebase main
git switch main
git merge 작업-브랜치
# 필요 시, merge 가 끝난 브랜치는 삭제merge - 충돌 해결하기
# 당장 충돌 해결이 어려운 경우에 merge 중단
git merge --abort
# rebase도 충돌 해결 어려운 경우에 중단 가능
git rebase --abort
# 해결 가능하면, 충돌 부분 수정한 뒤,
# git add .
# 그리고 git rebase --continue
# rebase 충돌 해결은 CLI 로 진행 권장원격 저장소 사용하기
# 로컬의 git 저장소에서 원격 저장소로의 연결 추가
git remote add origin (원격 저장소 주소)
# 원격 저장소 이름: origin (이것은 바꿀 수도 있음)
# github 권장 - 기본 브랜치명을 main 으로
git branch -M main
# 로컬 저장소의 커밋 내역들 원격으로 push (업로드)
git push -u origin mainpush (원격으로 커밋 업로드)
git push # 이미 git push -u origin main 으로 대상 원격 브랜치가 지정되었기 때문에 가능pull (동료가 한 작업을 로컬로 가져오기)
git pullpull 할 것이 있을 때 push 를 할 경우.
로컬에서 작업하다가 원격 저장소에 push 할 수 있으려면, 로컬이 원격의 최신 내역대로 맞춰져 있어야 함. 안 그러면 충돌 발생
해결 방법.
1. merge 방식
- git pull --no-rebase
- 원격 저장소의 최신 변경 사항을 현재 로컬 브랜치로 가져오는데, merge를 수행합니다.
예시
상황: 원격 저장소에는 다른 사람이 작업한 커밋이 있고, 로컬에는 내가 작업한 커밋이 있다.
실행: git pull --no-rebase
결과: 원격 저장소의 변경 사항을 로컬에 가져와 자동으로 merge합니다. 필요한 경우 수동으로 충돌을 해결합니다. 이제 로컬 브랜치는 원격 저장소의 상태와 동기화되었고, 추가적으로 내 로컬 변경 사항을 원격 저장소에 push할 수 있습니다.
2. rebase 방식
- git pull -rebase
- 원격 저장소의 최신 변경 사항을 현재 로컬 브랜치로 가져오지만, merge 대신 rebase를 사용합니다. 이는 원격 저장소의 변경 사항을 기반으로 로컬에서 작업한 커밋들을 재적용하는 방식입니다. 상대방껄 먼저 가져옴.
- 로컬 브랜치의 히스토리가 더 깔끔하게 유지되며, 마치 로컬에서의 변경 사항이 원격 저장소의 최신 변경 사항 위에 순차적으로 이루어진 것처럼 보이게 됩니다.
예시
상황: 로컬 브랜치에 내가 추가한 커밋이 있고, 원격 저장소에는 다른 커밋이 이미 push되어 있다.
실행: git pull --rebase
결과: 원격 저장소의 최신 상태를 기준으로 로컬의 커밋들이 재정렬됩니다. 충돌이 발생하면 해결 후, 작업을 계속합니다. 최종적으로 로컬 브랜치는 원격 저장소의 최신 상태에 내 변경 사항이 순차적으로 적용된 형태로 업데이트됩니다.
위 둘 중 하나의 해결 방법으로 해결 후, 내 작업 내역을 원격 저장소에 push 하자.
로컬에서 무언가를 작업하고, 이미 공유된 커밋(이미 push된 커밋)을 rebase 하여, main 브랜치위에 올리는 것을 협업 시 지양하라는 것이다. (커밋의 기존 히스토리를 변경하기 때문)
그러나, pull 할 때 사용하는 rebase 는 괜찮다. 이 때의 rebase 는 원격 저장소의 변경 사항을 로컬로 가져온 뒤, 로컬에서 진행한 작업을 원격의 최신 변경 사항 위에 재적용하는 것이다.
3. 강제 push
- 원격에 있는 내용들이 잘못되어서, 내 로컬의 작업 내용으로 원격에 덮어씌어야 할 경우 사용한다.
- 원격의 내역들이 내 작업으로 덮어씌어져서 사라질 수 있기에, 미리 합의하고 사용하자.
git push --force
원격의 브랜치 다루기
로컬에서 브랜치를 새로 만들고, 원격으로 해당 브랜치를 업데이트 시키고 싶은 경우.
git push --set-upstream origin 브랜치명
git push -u origin 브랜치명
# 둘 중 아무거나 사용 가능로컬 + 원격의 모든 브랜치 목록 확인
git branch --all
git branch -a