Git 실무 핵심 치트시트: 브랜치 전략·리베이스와 충돌 해결

💡 핵심 요약 (Executive Summary)

본 가이드는 Git 버전 관리 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents

Concepts

Connection Link
Status
  • untracked
  • 새로 추가된 파일로, Git이 추적하지 않음.
  • git add를 실행해야 staged 상태로 전환됨.
  • tracked
  • 이미 Git에서 추적 중인 파일.
  • 세부 상태:
    • unstaged: tracked 파일에서 변경되었으나 staged 상태로 추가되지 않은 변경사항.
    • git commit -a 명령어로 커밋내용에 포함가능
    • staged: 변경사항이 git add로 준비된 상태. 다음 커밋에 포함됨.

Exec

작업 공간 시작 (참고: git help tutorial)
clone

저장소를 복제해 새 디렉터리로 가져옵니다

bash
git clone ${git_repository}
init

빈 깃 저장소를 만들거나 기존 저장소를 다시 초기화합니다

bash
git init
config

설정 메타데이터 관리

bash
# 기본 편집기를 vim으로 설정
git config --global core.editor "vim" 

# 전체 목록 조회
git config -l

# 현재 config 조회
git config user.name
git config user.email

# 특정 property 수정 (global)
git config --global user.name {{ new name }}
git config --global user.email {{ new email }}

# config 삭제
git config --unset {{ var name }}

# fastfoward 설정
git config merge.ff false    # 브랜치 병합 시 항상 병합 커밋 생성
git config pull.ff only      # pull은 fast-forward로만 (빈 병합 커밋 방지)
git config --get merge.ff    # false
git config --get pull.ff     # only


# edit mode
git config -e
git config --global -e

# credential 삭제
git config --unset credential.helper

# credential 저장
git config --global credential.helper store
git config credential.helper store

# credential 임시저장
git config credential.helper cache
git config credential.helper 'cache --timeout 7200'
remote

업스트림 관리

bash
# remoteName으로 repository 등록
git remote add $remoteName $remoteAddr

# origin에 repository 등록
git remote add -f origin $remoteAddr

# remote url 확인
git remote get-url $remote_name

# git remote 전체정보 확인
git remote -v
update-index
bash
#해당 경로의 변경사항을 지속적으로 추적하지 않음
git update-index --assume-unchanged ${fileDir}

#assume-unchanged 해제
git update-index --no-assume-unchanged ${fileDir}
lfs

large format storage

bash
# .gitattribute에 lfs 추적정보 추가
git lfs track "*.extension"

# lfs에서 로컬로 가져옴
git lfs pull
변경 사항에 대한 작업 (참고: git help everyday)
add

파일 내용을 인덱스에 추가합니다

bash
# 깃 untracked file 전체 tracking
git add -A

# 특정 directory만 tracking
git add ${dir}
mv

파일, 디렉터리, 심볼릭 링크를 옮기거나 이름을 바꿉니다

Reference & Guidelines (NOTE)

mv와의 차이

  • mv ${oldfile} ${newfil}후 git status
bash
deleted:    oldfile
  untracked:  newfile
  • git mv ${oldfile} ${newfile}후 git status
bash
renamed: oldfile -> newfile
bash
git mv ${oldfile} ${newfile}
restore

Restore working tree files

bash
#unstaged to discard changes
git restore $file

#staged to unstaged
git restore --staged $file
rm

파일을 작업 폴더에서 제거하고 인덱스에서도 제거합니다

bash
# git index에서 제거(untracked) 및 파일시스템에서 삭제
git rm -r ${dir}
git rm ${file}

# git index에서만 제거(untracked)
### .gitignore에 추가한 후에 추적중단 등
git rm -rf --cached .
커밋 내역과 상태 보기 (참고: git help revisions)
bisect

이진 탐색으로 버그를 만들어낸 커밋을 찾습니다

bash
# 나쁜(버그가 발생한) 커밋 지정
git bisect bad

# 좋은(버그가 없던) 커밋 지정
git bisect good ${commit_hash}

# --no-checkout 옵션은 워킹 디렉토리를 전환하지 않고 단지 커밋 해시만 추적
# 스크립트나 CI에서 별도의 체크아웃/빌드 없이 커밋 단위 비교
git bisect start --no-checkout
diff

커밋과 커밋 사이, 커밋과 작업 내용 사이 등의 바뀐 점을 봅니다

bash
# 마지막 커밋 <-> 로컬 차이 확인
git diff ${file}

# 브랜치간 파일 차이 확인
git diff ${targetBranch} ${sourceBranch} -- ${file}
grep

패턴과 일치하는 줄을 표시합니다

bash
#검색어와 일치하는 파일 빠르게 출력
git grep ${searchText}

#검색어와 일치하는 파일과 라인넘버를 빠르게 출력
git grep --line-number ${searchText}
log

커밋 기록을 표시합니다

bash
# 현재 브랜치 내 커밋내역 확인
git log

# 요약으로 출력
git log --oneline

# 모든 브랜치 커밋내역 확인
git log --all

# 모든 브랜치에서 해당 머신기준 dir 패스를 포함하는 커밋이력 확인 (디렉토리의 최신커밋 브랜치 찾기)
git log --all -- ${dir_path}

# 브랜치, 병합 흐름을 시각화
git log --graph

# 태그 등을 같이 표시
git log --decorate

# 다 보기
git log --oneline --decorate --graph --all
show

여러가지 종류의 오브젝트를 표시합니다

bash
# commitId로 변경내역 확인하기 (pagered)
git show ${commitId}
status

작업 폴더 상태를 표시합니다

bash
git status
커밋 내역을 키우고, 표시하고, 조작하기
backfill

Download missing objects in a partial clone

bash
# 부분클론으로 인해 발생한 누락 blob을 채워서 업스트림간의 성능저하를 개선함.
git backfill
branch

브랜치를 만들거나, 삭제하거나, 목록을 출력합니다

bash
# 현재 브랜치 확인 (로컬)
git branch

# 브랜치 생성 (로컬)
git branch ${branchname}

# 브랜치 이름 변경 (로컬)
git branch -m ${before_branchname} ${new_branchname}

# 브랜치 삭제 (로컬) -- 병합된 브랜치만 삭제함
git branch -d ${branchname}

# 브랜치 삭제 (로컬)
git branch -D ${branchname}

# 리모트와의 연결을 해제
git branch --unset-upstream

# 리모트(origin)과 연결
git branch --set-upstream-to=origin/$branchname

# 리모트 해제 후 연결 (리모트정보 변경)
git branch -u origin/$branchname

# 추적 remote 브랜치 확인
git branch -vv
commit

바뀐 사항을 저장소에 기록합니다

bash
# commit 메세지 입력
git commit -m "${message}"

# 마지막 커밋메세지 변경 and 현재 status를 기존 커밋에 포함
git commit --amend -m "$message"
revert

지정된 커밋을 네거티브하는 커밋을 만듭니다.

Reference & Guidelines (NOTE)

revert 순서는 커밋순서의 역순: HEAD에 가까운 커밋부터

bash
# 취소커밋 생성
git revert $commitid
# 취소커밋 생성 (여러건의 revert 커밋)
git revert $commitid1 $commitid2 $commitid3

# 커밋 생성하지않고 로컬에 스테이지.
git revert -n $commitid3 $commitid2 $commitid1

# merge커밋 되돌리기
## 일반적인 상황: 부모커밋을 기준으로 자식커밋을 되돌림 (main <- feature 병합 이후 feature revert)
git revert -m1 $merge_commitid
## 예외적인 상황: 자식커밋을 기준으로 부모커밋을 되돌림
git revert -m2 $merge_commitid
merge

여러 개의 개발 내역을 하나로 합칩니다

bash
# 다른 브랜치의 변경사항을 현재 브랜치로 병합하기: history를 공유하는 내용만 가능
git merge $branch
rebase

커밋을 다른 베이스 끝의 최상위에서 적용합니다

bash
## 여러 커밋 한줄로 병합 (상위 2줄)
git rebase -i HEAD~2
>>>
pick c16a048 bitnami charts: prometheus, grafana, rabbitmq
pick 32aea8b dsfsdfsd

->
# 합쳐져서 사라질 메세지를 s로 변경
pick c16a048 bitnami charts: prometheus, grafana, rabbitmq
s 32aea8b dsfsdfsd
<<<



## 커밋 drop (상위 1줄)
git rebase -i HEAD~1
>>>
pick c16a048 bitnami charts: prometheus, grafana, rabbitmq

->
# 사라질 메세지를 drop으로 변경
drop c16a048 bitnami charts: prometheus, grafana, rabbitmq
<<<


# rabase 취소
git rebase --abor
reset

현재 HEAD를 지정한 상태로 재설정화합니다

bash
# 마지막 커밋 제거
git reset HEAD^

# 변경사항 롤백하기 (현재 커밋 기준)
git reset --hard

# 특정 커밋으로 되돌리기 (공유브랜치에서는 위험할 수 있음)
git reset --hard ${commitId}
checkout

브랜치 혹은 특정 커밋 기반 파일 복원

bash
# 해당 브랜치로 변경
git checkout ${branchname}

# 현재 브랜치에서 신규 브랜치 생성성 후 신규 브랜치로 변경
git checkout -b ${new_branchname}

# root 브랜치에서 신규 브랜치 생성 후 신규 브랜치로 변경
git checkout -b ${new_branchname} ${root_branchname}

# commitID를 이용하여 특정 커밋 파일 가져오거나 되돌리기 (현재 브랜치 혹은 다른 브랜치)
git checkout ${commitId} ${file_or_dir}

# 다른 브랜치의 (최신 커밋) 특정 파일 가져오기
git checkout ${otherBranchname} -- ${file}

# 다른 브랜치의 (최신 커밋) 특정 파일 가져오기 (현재경로 기준 명시)
git checkout ${otherBranchname} ${file_or_dir}
cherry-pick

커밋 히스토리를 공유하지 않는 브랜치 간 커밋 복제

bash
# 특정 커밋 변경사항을 다른 브랜치에서 가져오기
git cherry-pick $commitId

# 체리픽 취소
git cherry-pick --abort
stash

커밋 히스토리에 영향가지 않도록 현재 스테이지 임시 저장

bash
# stash 배열에 추가
git stash

# 메세지 적으면서 stash
git stash -m "${message}"

# list 확인
git stash list

# unstash
git stash pop
switch

Switch branches

Reference & Guidelines (NOTE)

checkout이 특정 파일복원이나 커밋ID로 이동 등의 다양한 기능을 포함하고있으므로, 모던한 디자인을 위하여 branch 특화 명령어가 생김.

bash
# 해당 브랜치로 변경
git switch ${branchname}

# 현재 브랜치에서 신규 브랜치 생성성 후 신규 브랜치로 변경
git switch -c ${new_branchname}

# root 브랜치에서 신규 브랜치 생성 후 신규 브랜치로 변경
git switch -c ${new_branchname} ${root_branchname}
tag

태그를 만들거나, 표시하거나, 삭제하거나, GPG 서명을 검증합니다

bash
git tag ${tagname}
worktree

여러 브랜치를 파일시스템으로 관리

Reference & Guidelines (NOTE)

워크트리에 등록된 브랜치로 git switch 불가.

bash
fatal: '${branchname}' is already used by worktree at '${workdir}'
bash
# 등록된 워크트리 목록 조회
git worktree list

# 현재 브랜치 기준으로 해당 경로에 신규 작업경로를 생성하고 워크트리에 저장
git worktree add ${git_root}/../${new_dir}
git worktree add ${new_workdir}

# 워크트리를 생성할때에 현재 브랜치 기준으로 기존브랜치 리셋 혹은 신규브랜치를 생성
git worktree add ${new_workdir} -B ${branchname}

# 워크트리를 생성할때에 현재 브랜치 기준으로 신규브랜치를 생성
git worktree add ${new_workdir} -b ${new_branchname}

# 워크트리를 삭제
git worktree remove ${workdir}
협동 작업 (참고: git help workflows)
fetch

다른 저장소에서 오브젝트와 레퍼런스를 다운로드합니다

bash
git fetch
pull

다른 저장소 또는 다른 로컬 브랜치에서 가져오거나 통합합니다

bash
git pull
push

원격 레퍼런스 및 그와 관련된 오브젝트를 업데이트합니다

bash
# 현재 로컬커밋 기준 push
git push

# 신규로컬 브랜치 upstream에 push
git push --set-upstream origin ${branchname}

# 업스트림 브랜치 삭제
git push origin --delete ${branchname}

# 업스트림에 강제로 PUSH (기존 커밋내역이 Push된 경우)
git push --force-with-lease origin $branch

# 업스트림에 커밋id 동일할 경우 replace
git push --all --force
git push --tags --force


The Git concept guides are

bash
# 가이드 목록 조회
git --help -g

# 개발자를 위한 깃 핵심 따라하기 문서
git --help core-tutorial
# Providing usernames and passwords to Git
git --help credentials
# CVS 사용자를 위한 깃
git --help cvs-migration
# diff 출력 미세 조정
git --help diffcore
# 매일매일 유용하게 사용할 최소한의 깃 명령어 모음
git --help everyday
# Frequently asked questions about using Git
git --help faq
# 깃 용어 사전
git --help glossary
# 깃 네임스페이스
git --help namespaces
# Helper programs to interact with remote repositories
git --help remote-helpers
# Mounting one repository inside another
git --help submodules
# 깃 따라하기 안내서
git --help tutorial
# 깃 따라하기 안내서: 2부
git --help tutorial-2
# 추천하는 깃 활용 작업 순서의 개요
git --help workflows


All Features

주요 사용자용 명령
bash
add                     파일 내용을 인덱스에 추가합니다
am                      메일함에서 연속된 패치를 적용합니다
archive                 지정한 트리에 들어 있는 파일의 아카이브를 만듭니다
backfill                Download missing objects in a partial clone
bisect                  이진 탐색으로 버그를 만들어낸 커밋을 찾습니다
branch                  브랜치를 만들거나, 삭제하거나, 목록을 출력합니다
bundle                  아카이브 형태로 오브젝트와 레퍼런스를 옮깁니다
checkout                브랜치를 전환하거나 작업 파일을 복구합니다
cherry-pick             기존 커밋으로 발생한 변경 사항을 적용합니다
citool                  git-commit의 그래픽 대체 버전
clean                   작업 폴더에서 추적되지 않는 파일을 제거합니다
clone                   저장소를 복제해 새 디렉터리로 가져옵니다
commit                  바뀐 사항을 저장소에 기록합니다
describe                사용 가능한 레퍼런스를 기준으로 오브젝트에 읽을 수 있는 이름을 부여합니다
diff                    커밋과 커밋 사이, 커밋과 작업 내용 사이 등의 바뀐 점을 봅니다
fetch                   다른 저장소에서 오브젝트와 레퍼런스를 다운로드합니다
format-patch            메일 제출 용도로 패치를 준비합니다
gc                      불필요한 파일을 지우고 로컬 저장소를 최적화합니다
gitk                    깃 저장소 살펴보기
grep                    패턴과 일치하는 줄을 표시합니다
gui                     깃의 포터블 그래픽 인터페이스
init                    빈 깃 저장소를 만들거나 기존 저장소를 다시 초기화합니다
log                     커밋 기록을 표시합니다
maintenance             Run tasks to optimize Git repository data
merge                   여러 개의 개발 내역을 하나로 합칩니다
mv                      파일, 디렉터리, 심볼릭 링크를 옮기거나 이름을 바꿉니다
notes                   오브젝트 노트를 추가하거나 살펴봅니다
pull                    다른 저장소 또는 다른 로컬 브랜치에서 가져오거나 통합합니다
push                    원격 레퍼런스 및 그와 관련된 오브젝트를 업데이트합니다
range-diff              Compare two commit ranges (e.g. two versions of a branch)
rebase                  커밋을 다른 베이스 끝의 최상위에서 적용합니다
reset                   현재 HEAD를 지정한 상태로 재설정화합니다
restore                 Restore working tree files
revert                  기존 커밋을 되돌립니다
rm                      파일을 작업 폴더에서 제거하고 인덱스에서도 제거합니다
scalar                  A tool for managing large Git repositories
shortlog                'git log' 출력을 요약합니다
show                    여러가지 종류의 오브젝트를 표시합니다
sparse-checkout         Reduce your working tree to a subset of tracked files
stash                   작업 폴더의 변경 사항을 임시로 다른 곳에 저장합니다
status                  작업 폴더 상태를 표시합니다
submodule               하위 모듈을 초기화하거나, 업데이트하거나, 조사합니다
switch                  Switch branches
tag                     태그를 만들거나, 표시하거나, 삭제하거나, GPG 서명을 검증합니다
worktree                여러 개의 작업 폴더를 관리합니다
보조 명령 / 조작 기능
bash
config                  저장소 옵션 또는 전체 옵션을 보거나 설정합니다
fast-export             깃 데이터 내보내기
fast-import             고속 깃 데이터 가져오기 백엔드
filter-branch           리모트 브랜치
mergetool               병합 충돌 상황에서 병합 충돌 해결 도구를 실행합니다
pack-refs               효율적인 저장소 접근을 위해 헤드와 태그를 묶습니다
prune                   오브젝트 데이터베이스에서 도달할 수 없는 오브젝트를 모두 잘라냅니다
reflog                  reflog 정보를 관리합니다
refs                    Low-level access to refs
remote                  추적하는 저장소 모음을 관리합니다
repack                  저장소의 묶여지지 않은 오브젝트를 묶습니다
replace                 오브젝트를 바꾸는 레퍼런스를 만들거나, 표시하거나, 삭제합니다
보조 명령 / 정보 획득 기능
bash
annotate                파일 줄마다 커밋 정보를 표시합니다
blame                   파일 줄마다 끝에 마지막으로 수정한 리비전과 작성자를 표시합니다
bugreport               Collect information for user to file a bug report
count-objects           묶여지지 않은 오브젝트의 개수 및 그 디스크 사용량을 측정합니다
diagnose                Generate a zip archive of diagnostic information
difftool                일반적인 diff 도구를 사용해 변경 사항을 표시합니다
fsck                    연결을 확인하고 데이터베이스의 오브젝트가 올바른지 확인합니다
gitweb                  깃 웹 인터페이스 (깃 저장소에 대한 웹 프론트엔드)
help                    깃의 도움말 정보를 표시합니다
instaweb                내 작업 저장소를 gitweb에서 즉시 살펴봅니다
merge-tree              Perform merge without touching index or working tree
rerere                  충돌하는 병합의 기록된 해결 방법을 다시 사용합니다
show-branch             브랜치 목록과 그 커밋을 표시합니다
verify-commit           커밋의 GPG 서명을 확인합니다
verify-tag              태그의 GPG 서명을 확인합니다
version                 Display version information about Git
whatchanged             Show logs with differences each commit introduces
다른 사람과 소통
bash
archimport              Import a GNU Arch repository into Git
cvsexportcommit         하나의 커밋을 CVS 체크아웃으로 내보냅니다
cvsimport               다른 소스 코드 관리 시스템에서 데이터 가져오기
cvsserver               깃용 CVS 서버 에뮬레이터
imap-send               표준입력에서 패치 모음을 읽어 IMAP 폴더로 보냅니다
p4                      Perforce 저장소에서 가져오거나 저장소로 제출합니다
quiltimport             현재 브랜치에 quilt 패치 모음을 적용합니다
request-pull            예정된 변경 사항의 요약을 만듭니다
send-email              패치 모음을 메일로 보냅니다
svn                     서브버전 저장소와 깃 사이의 양방향 동작
저수준 명령/ 조작 기능
bash
apply                   패치를 파일 및/또는 인덱스에 적용합니다
checkout-index          인덱스의 파일을 작업 폴더로 복사합니다
commit-graph            Write and verify Git commit-graph files
commit-tree             새 커밋 오브젝트를 만듭니다
hash-object             Compute object ID and optionally create an object from a file
index-pack              기존 묶음 아카이브에 대한 묶음 인덱스 파일을 만듭니다
merge-file              3-방향 파일 병합을 실행합니다
merge-index             병합이 필요한 파일에 대해 병합을 실행합니다
mktag                   Creates a tag object with extra validation
mktree                  ls-tree 포맷의 텍스트에서 tree-object를 만듭니다
multi-pack-index        Write and verify multi-pack-indexes
pack-objects            오브젝트의 묶음 아카이브를 만듭니다
prune-packed            묶음 파일에 이미 들어 있는 오브젝트를 추가로 제거합니다
read-tree               트리 정보를 인덱스로 읽습니다
replay                  EXPERIMENTAL: Replay commits on a new base, works with bare repos too
symbolic-ref            심볼릭 레퍼런스를 읽고, 수정하고, 삭제합니다
unpack-objects          묶음 아카이브에서 오브젝트를 풀어냅니다
update-index            작업 폴더에서 파일 내용을 인덱스에 등록합니다
update-ref              레퍼런스에 저장된 오브젝트 이름을 안전하게 업데이트합니다
write-tree              현재 인덱스에서 트리 오브젝트를 만듭니다
보조 명령 / 정보 획득 기능
bash
cat-file                Provide contents or details of repository objects
cherry                  업스트림에 적용해야 할 커밋을 찾습니다
diff-files              작업 폴더와 인덱스의 파일을 비교합니다
diff-index              트리를 작업 폴더나 인덱스와 비교합니다
diff-pairs              Compare the content and mode of provided blob pairs
diff-tree               두 개의 트리 오브젝트에 있는 내용과 블롭의 모드를 비교합니다
for-each-ref            각 레퍼런스의 정보를 출력합니다
for-each-repo           Run a Git command on a list of repositories
get-tar-commit-id       git-archive로 만든 아카이브에서 커밋 ID를 추출합니다
ls-files                인덱스와 작업 폴더의 파일에 대한 정보를 표시합니다
ls-remote               원격 저장소의 레퍼런스를 열거합니다
ls-tree                 트리 오브젝트의 내용을 열거합니다
merge-base              병합에 사용할 최선의 공통 과거 커밋을 찾습니다
name-rev                주어진 리비전에 대한 심볼 이름을 찾습니다
pack-redundant          중복된 묶음 파일을 찾습니다
rev-list                시간 반대 순서에 따라 커밋 오브젝트를 열거합니다
rev-parse               파라미터를 찾아내서 조정합니다
show-index              묶여진 아카이브 인덱스를 표시합니다
show-ref                로컬 저장소의 레퍼런스를 열거합니다
unpack-file             블롭의 내용으로 임시 파일을 만듭니다
var                     깃의 논리적 변수를 표시합니다
verify-pack             묶음 깃 아카이브 파일을 검증합니다
Low-level Commands / Syncing Repositories
bash
daemon                  깃 저장소에 대한 아주 간단한 서버
fetch-pack              다른 저장소에서 없는 오브젝트를 다운로드합니다
http-backend            깃 HTTP 프로토콜의 서버측 구현
send-pack               오브젝트를 깃 프로토콜을 통해 다른 저장소로 푸시합니다
update-server-info      단순 서버에 도움을 주도록 보조 정보 파일을 업데이트합니다

보조 명령 / 내부 사용 기능

bash
check-attr              gitattributes 정보를 표시합니다
check-ignore            gitignore / 제외할 파일을 디버깅합니다
check-mailmap           연락처의 전체 이름과 메일 주소를 표시합니다
check-ref-format        레퍼런스 이름의 형식이 올바른지 확인합니다
column                  데이터를 여러 열로 표시합니다
credential              사용자 비밀 정보를 가져오고 저장합니다
credential-cache        메모리에 임시로 암호 저장하는 도움 명령
credential-store        비밀 정보를 디스크에 저장하는 도움 명령
fmt-merge-msg           병합 커밋 메시지를 만듭니다
hook                    Run git hooks
interpret-trailers      Add or parse structured information in commit messages
mailinfo                하나의 메일 메시지에서 패치와 작성자 정보를 뽑아냅니다
mailsplit               간단한 유닉스 mbox 쪼개기 프로그램
merge-one-file          git-merge-index와 같이 사용하는 기본 도움 프로그램
patch-id                패치에 대한 유일한 ID를 계산합니다
sh-i18n                 셸 스크립트를 위한 깃의 국제화 준비 코드
sh-setup                공통 깃 셸 스크립트 준비 코드
stripspace              불필요한 공백 문자를 제거합니다
User-facing repository, command and file interfaces
bash
attributes              경로마다 속성 정의하기
cli                     깃 명령행 인터페이스 및 관습
hooks                   깃에서 사용하는 후크
ignore                  의도적으로 추적하지 않는 파일을 무시하게 지정하기
mailmap                 Map author/committer names and/or E-Mail addresses
modules                 하위 모듈 속성 정의하기
repository-layout       깃 저장소 구조
revisions               깃의 리비전 및 범위를 지정하기
Developer-facing file formats, protocols and other interfaces
bash
format-bundle           The bundle file format
format-chunk            Chunk-based file formats
format-commit-graph     Git commit-graph format
format-index            Git index format
format-pack             Git pack format
format-signature        Git cryptographic signature formats
protocol-capabilities   Protocol v0 and v1 capabilities
protocol-common         Things common to various protocols
protocol-http           Git HTTP-based protocols
protocol-pack           How packs are transferred over-the-wire
protocol-v2             Git Wire Protocol, Version 2

Features

SSH 를 통한 Git 작업시 ~/.ssh 외의 파일 지정
bash
GIT_SSH_COMMAND="ssh -i ./opnsense" git clone [email protected]:fredric18/opnsense-backup.git
상위 두번째에 있는 커밋메세지 변경
bash
#1. rebase 명령
git rebase -i HEAD~2
>>>
#before
pick 41737dd Change Dir Structure
pick 602a1c8 Change Manifests

#after
e 41737dd Change Dir Structure
pick 602a1c8 Change Manifests
<<<

#cursor가 아래로 내려옴 확인
git log

#2. 커밋메세지 변경
git commit --amend

#3. 커서 제위치로 변경
git rebase --continue
다른 브랜치에서 변경사항 커밋
bash
git stash
git checkout ${other-branch}
git stash pop
특정 리비전의 directory 가져오기
bash
git log #리비전id 확인
git checkout ${commitId} ${dir}
특정 디렉토리의 최신 커밋을 다른 브랜치에서 찾아 가져오기
bash
git log --all -- ${dir}
git checkout ${commitId} ${dir}
git add ${dir}
git commit
외부 리포지토리에서 가져온 디렉터리 git 종속성 제거
bash
# 깃디렉터리 삭제
rm -rf .git
# 캐시 삭제
git rm --cached . -rf
git add -A
git commit
git pull
git push
외부 리포지토리에서 가져온 디렉터리 다른 리포지토리에 push (히스토리 유지)
bash
#사전에 리포지토리는 생성완료 되어있어야 가능

#기존 origin 확인 및 변경
git remote -v
git remote rename origin origin-old
git remote add origin $new_repository
git remote -v

#새로운 origin에 push (전체 브랜치)
git push -u origin --all
#새로운 origin에 push (태그)
git push -u origin --tag
#새로운 origin에 push (특정 브랜치)
git push -u origin $branch
포크한 리포지토리를 private repository로 재구성
bash
#1. github에서 private repository를 생성

#2. fork한 repository bare clone
git clone --bare $forked_repo_url.git
cd $forked_repo.git

#3. private repository에 mirror push
git push --mirror $private_repo_url.git
포크한 리포지토리를 최신으로 동기화
bash
git remote -v
git remote add upstream $upsteamrepository
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
PR 생성
bash
#포크된 브랜치 생성 후 clone
git remote -v
git remote add upstream $upsteamrepository
git checkout -b features/$mybranch

#수정 작업 후 push
git push origin $mybranch

#github.com에서 pull request 생성
signed off
bash
#commit message 마지막에 지정
"Signed-off-by: Author Name <[email protected]>"

#혹은 자동
git commit -s
git commit -sm "$commitmessage"

#기존 업로드/push한 커밋 강제변경
git rebase HEAD~1 --signoff
git push --force-with-lease origin $branch
기존 PUSH 강제 수정 (브랜치 내 충돌사항이 없을 경우에만 가능)
bash
#수정사항 commit 및 squash
git add $something
git commit
git rebase -i HEAD~2
#1. vim에서 맨 위를 제외하고 아래의 커밋을 pick -> s로 변경
#2. commitmessage 삭제

git push --force-with-lease origin $branch
기존 PUSH 강제 수정 (마지막 커밋대상)
bash
git add $something
git commit --amend 
git push --all --force
git push --tags --force
잘못된 push 삭제
  1. 삭제 push
yaml
git reset --hard HEAD~1
   git push origin HEAD --force
  1. Revert
yaml
git revert HEAD
   git push origin HEAD
브랜치를 rename한 후 리모트에 반영
bash
# 현재 브랜치 변경
git branch -m ${old-branch-name} ${new-branch-name}

# 기존 원격 브랜치 삭제
git push origin --delete ${old-branch-name}

# 새로운 이름으로 원격에 푸시
git push origin ${new-branch-name}
여러건의 커밋을 1건의 revert커밋으로 생성
bash
# 커밋 생성하지않고 로컬에 스테이지.
git revert -n $commitid3 $commitid2 $commitid1
git commit -m "revert \"$commitid3 $commitid2 $commitid1\""
안전하게 Upstream의 메타데이터를 현재 브랜치에 초기화 (로컬 장애 대응)
Reference & Guidelines (NOTE)

git worktree로 인한 장애 대응시 작성됨

bash
target_branch=develop
# 1. target_branch 브랜치로 체크아웃
git checkout ${target_branch}

# 2. 로컬 target_branch을 upstream과 동기화 (리셋)
git fetch origin
git reset --hard origin/${target_branch}

# 4. 필요 시 로컬 reflog/HEAD 로그 초기화
git reflog expire --expire=now --all
git gc --prune=now
브랜치 삭제 장애시 이름변경 후 삭제
bash
git branch -m ${before_branchname} ${new_branchname}
git branch -D ${new_branchname}
Remote origin 주소 변경
bash
git_provider_url=(github.com bitbucket.org ...)
# to https
git remote set-url origin https://${git_user}@${git_provider_url}/${vendor_name}/${repository_name}.git
# to ssh
git remote set-url origin git@${git_provider_url}:${vendor_name}/${repository_name}.git

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *