Learn Git Branching
Learn Git Branching
An interactive Git visualization tool to educate and challenge!
learngitbranching.js.org
최소한의 Github(원격 저장소) 규칙 설정
Settings > Roules > Rulesets > New ruleset > New branch ruleset
Enforcement status를 Active로 설정
Add target > Include default barnch 선택, 그리고 Include by patten > Branch naming pattern에 main 패턴 추가


Restrict deletions: 삭제 제한
Require a pull request before merging: 병합 전 풀 요청 필요 > Require review from Code Owners: 코드 소유자의 컴토 필요Block force pushes: 포스 푸시 막기 (git push --force 막기)
remote
원격 저장소를 연결한다.
# origin은 원격 저장소의 별명이다. 다른 이름으로 지정도 가능하다.
git remote add origin [원격저장소 URL]
add
git은 내용을 바로 커밋하지 않는다. <작업 디렉토리 - 스테이징 영역 - 커밋>의 단계를 거치는데, add는 작업 디렉토리의 변경을 스테이징 영역으로 복사하는 역할을 한다.
한마디로 "이 변경을 커밋에 포함한다"는 표시다.
git add 파일명
git add .
restore
# 수정한 파일을 마지막 커밋 상태로 되돌리기 (수정 내용 사라짐)
git restore 파일명
# add 한 걸 취소 (스테이징 영역에서 내리기)
git restore --staged 파일명
# 특정 시점의 파일로 되돌리기
git restore --source=[커밋] 파일명
clone
원격 저장소의 복사본을 로컬에 생성
git clone [원격저장소 주소]


로컬 저장소에 main과 o/main(origin/main, 원격 브랜치)이라는 새로운 브랜치가 생겼다. 대부분 개발자들이 자신의 주 원격 저장소를 origin이라고 하기 때문에 git clone 시 자동적으로 원격 저장소 이름을 origin으로 설정하게 된다.
원격 브랜치(origin/main)는 원격 저장소의 상태를 반영한다. 이를 통해서 로컬에서 작업과 (원격 저장소에) 공개된 작업 상태 차이를 이해할 수 있다.
아래 그림처럼 원격 브랜치는 체크 아웃 시에 HEAD 모드로 들어간다. 이 원격 브랜치에서는 (원격 저장소 상태를 나타내므로) 직접 작업할 수 없기 때문이다.
git checkout o/main
git commit


원격-추적
clone을 진행하면 모든 원격 저장소의 브랜치에 대해 로컬 브랜치(origin/main)를 생성한다. 그래서 clone을 진행하면 아래와 같은 메시지를 볼 수 있다.
local branch "main" set to track remote branch "origin/main"
이걸 직접 설정할 수도 있다.
방법 1. checkout -b
git checkout -b [추적할] [원격]
git checkout -b foo o/main
git pull


동일하게 push에도 적용이 된다.
git checkout -b foo o/main
git commit
git push


방법 2. branch -u
git branch -u [원격] [추적할]
git branch -u o/main foo # foo 브랜치가 o/main을 추적
# 현재 작업 중인 브랜치가 foo라면 생략 가능
git branch -u o/main
git branch -u o/main foo
git commit
git push


fetch
원격 저장소에는 있지만 로컬에는 없는 커밋들을 (git://, http:// 프로토콜을 통해)다운로드 한다. 그리고 원격 브랜치가 가리키는 곳을 업데이트 한다. 로컬과 원격 저장소의 상태를 동기화하는 것이다.
fetch는 로컬의 상태는 전혀 바꾸지 않는다.
git fetch [[remote] [place]]
git fetch
인자 없이 수행하면 원격 저장소의 모든 원격 브랜치와 커밋을 내려받는다.


place인자 사용
git fetch origin foo
foo 브랜치만 내려받고 로컬 o/foo 브랜치에만 적용 (fetch는 작업 브랜치는 건들지 않으므로 foo가 아닌 o/foo에 적용된다. 즉 위 명령어는 "git fetch origin foo:o/foo"라고 생각할 수 있다.)


git fetch origin [source]:[destination]
git fetch origin C2:bar
origin에서 C2(source)를 내려받아 bar에 추가


source가 없다면?
git fetch origin :bar
로컬에 bar 브랜치가 생성된다.


pull
git pull [[remote] [place]]
git fetch
git merge o/main
fetch 후 원격 브랜치를 로컬 main에 merge한 것과 동일하다.
git pull
또는 (아래 상황에서는 두 개의 결과가 동일하다.)
git pull origin main


fetch나 push와 마찬가지로 pull도 다음처럼 사용 가능하다.
git pull origin main:foo
# 아래와 동일
git fetch origin main:foo
git merge foo


fackTeamwork
이 명령어를 사용하면 원격 저장소에 새로운 커밋을 생성할 수 있다.
git fakeTeamwork [[원격 저장소 브랜치] [커밋 수]]
# 원격 저장소 main에 커밋 1개 추가
git fakeTeamwork
git fakeTeamwork foo 3
원격 저장소 foo 브랜치에 3개의 커밋 추가


push
pull의 반대로 원격저장소에 업로드 하고 그 원격 저장소가 새 커밋을 합치고 갱신하게 한다. 매개변수 없이 사용하는 디폴트행동은 push.default라는 git 설정에 따라 결정된다.
git push [[remote] [place]]
git push origin main
이 명령어를 해석하면, 내 저장소에 있는 main 브랜치로 가서 모든 커밋을 수집하고 -> 다음으로 "origin"의 "main" 브랜치로 가서 이 브랜치에 부족한 커밋을 푸쉬한다. (이때 git은 어디서 오고 가야하는 지 알려줬기 때문에 체크 아웃한 브랜치(또는 HEAD 위치)와 관련 없이 동작한다. )
git push


다음과 같이 지정할 수도 있다.
git push origin <sourse>:<destination>
git push origin foo^:main


만약 목적지(destination)가 없다면?
git push origin main:newBranch
newBranch를 생성하고 로컬 main을 원격 newBranch로 push한다.


source가 없다면?
git push origin :foo
null을 푸쉬 했기 때문에 foo 브랜치가 삭제된다.


만약 원격 저장소와 로컬의 작업이 엇갈리면 (충돌) 어떻게 해야할까?
히스토리가 서로 엇갈리면 push 하지 못하게 된다.
아래 문제 상황은 로컬에는 C3가 있고 원격에는 C2가 있는 상황이다.
방법 1. fetch / rebase
git fetch
git rebase o/main
git push
또는
git pull --rebase
git push


방법 2. fetch / merge
git fetch
git merge o/main
git push
또는
git pull
git push



방법3. 깃허브에서 해결
깃허브에서 main에 충돌이 일어나는 브랜치를 New Pull Request를 하게되면 "Resolve confilcts" 버튼이 생성된다.
둘 중 필요한 내용 하나만 남기고 지운다. (====와 >>>> 사이 내용만 지우면 된다.) 그리고 "Accept current change"를 클릭하고 Mark as resolved로 적용하면 된다. 마지막으로 Commit Merge 버튼으로 커밋하면 된다.



원격저장소 거부 상황 (Remote Rejected)
보통 원격 저장소의 main 브랜치는 잠겨 있다. 그래서 변경을 저장하려면 Pull Request 과정을 거쳐야한다.
# main 브랜치에서 커밋을 push 하려고 하면 다음과 같은 오류가 발생한다.
! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted;
you must use a pull request to update this branch.)
main에 직접적인 커밋을 제한하고 있는 경우에는, 브랜치를 따로 만들어 작업하고 push하고 Pull Request 해야한다.
위 과정을 생략하고 main 브랜치에 직접 커밋한 경우는 어떻게 해야할까?

새로운 브랜치를 만들어 원격 저장소에 push하고 로컬 저장소의 main은 reset을 통해 원격 저장소와 동일한 상태를 만들어 동기화 한다.
git branch feature
git reset HEAD^
git checkout feature
git push
# 또는
git push origin feature
git checkout feature
또는
git checkout -b feature
git push
git branch -f main C1



브랜치 병합하기
원격저장소의 새 커밋들로 리베이스 후 작업을 원격 저장소에 push
git pull --rebase
git push


방법 1. rebase
git fetch origin main
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git checkout -B main side3
git push


리베이스를 하게 되면 보기는 좋지만 히스토리를 수정하게 된다. 히스토리를 보존하려면 merge를 이용하는 게 좋다.
방법2. merge
git checkout main
git pull --rebase
git merge side1
git merge side2
git merge side3
git push


'Deployment > GitHub' 카테고리의 다른 글
| Github Actions (1) | 2026.05.05 |
|---|---|
| GitHub Skills (0) | 2026.04.30 |
| Learn Git Branching (1) main (0) | 2026.04.30 |
| 버전 관리와 깃(Git) (0) | 2025.12.01 |
| Git 기본 사용법 (CLI) (0) | 2025.04.09 |