# file을 Staged 상태로 변경
git add <filename>
# file을 Commit 상태로 변경
git commit -m "message"
# file을 변경사항을 확인하고, Commit Message를 적은 뒤 Commit
git commit -v
# remote repository 로 push
git push
# origin이라는 remote repository에 master를 생성하고, local repository의 master의 내용을 remote repository의 master 브랜치에 보내라.
git push origin master
# --set-upstream 의 줄임말. local의 master 브랜치가 remote의 master를 항상 추적하도록 설정. 이 이후로, remote master 브랜치는 local master 브랜치의 upstream branch가 된다.
git push -u origin master
# --set-upstream이 안된 상태에서 push하기. 첫번째 master는 src의 master(로컬), 두번째 master는 dst의 master(리모트)를 의미함.
git push origin master:master
# remote repository의 가장 최근 상태를 local로 가져온 후, 나의 local branch를 가장 최신코드와 합친다.
# 아래 두 명령어의 순차적 실행과 완전히 동일하다(fetch와 merge는 나중에 설명).
# git fetch
# git merge
git pull
# 현재 git의 상태를 알려준다.
git status
# !!!주의!!! local 코드를 변경시킴.
# add의 반대버전. restore는 commit object의 file 상태로 local file을 원상복귀한다.
git restore <filename>
# 로컬과, Staged(add된 버전)를 비교
git diff
# Staged(add된 버전)과, CommitObject를 비교
git diff --cached
# Commit Hash마다 Commit Message와 년월일 확인
git log
# branch 생성
git branch <branch_name>
# 현재 HEAD를 <branch_name> 커밋위치로 옮기기
git switch <branch_name>
# 동일
git checkout <branch_name>
# <branch_name> 이름의 branch를 현재 내 branch에 합치기
git merge <branch_name>
# file_name의 file을 ____의 버전으로 변경
git checkout <file_names>
# dir_name 이하의 file들 모두를 ____의 버전으로 변경
git checkout <dir_name>
# 만약 강제 옵션을 넣는다면, local 변경될 수 있음.
# 특정 commit 버전으로 돌아가기
git checkout <hash_id>
# 브랜치 생성 + 그 브랜치로 이동
# 아래 2개 명령어를 순차적으로 수행한 것과 같음.
# git branch <branch_name>
# git checkout <branch_name>
git checkout -b <branch_name>
# git clone을 했다면, origin이 자동으로 등록되므로 쓸 일이 없다.
# 특정 이유로 origin이 등록이 안되었다면, 수동으로 등록해줄 수 있다.
git remote add origin https://github.com/John/gitTest
# 다른 remote를 등록할 수도 있다.
git remote add origin2 https://github.com/Peter/gitTest
# remote 현황 파악
git remote -v
# remote에 있는 <branch_name> 브랜치를 로컬에 가져오기
git checkout -t origin/<branch_name>
# remote repository의 가장 최근상태를 내 local로 가져온다.
# 다른 사람들이 어떤 부분을 수정했고 push했는지를 확인만 하고싶을 때 사용.
# 내 local에는 영향을 미치지 않는다.
# merge말고 rebase를 쓰고싶을 때 쓰기도 한다.
git fetch
#
git merge
# git status를 성실히 안했거나
# 코드 dependency 때문에 다른 사람의 코드 위에서 작업해야 하는 경우
# ex) 다른 사람이 버그를 고쳐줘서 push해줬고, 내가 그 버그를 고친 상태에서 다음 무언가를 구현해야 할 때.
git cherry-pick <hash_id>
# 참고) hash_id는 7자리만 입력해도 됨.
# add 취소하기
# mixed reset: 전체 add 취소. add된 local file들은 Modified 된채로 그대로 있다.
git reset HEAD
# mixed reset: 특정 filename만 add 취소. add된 local file은 Modified 된채로 그대로 있다.
git reset HEAD <filename>
# !!!주의!!! 아래 명령어는 local file 변경가능성있음
# hard reset: add가 취소되면서, add된 local file도 지워버리거나 이전버전으로 덮어씌워버린다.
git reset HEAD <filename> --hard
# commit 취소하기
# soft reset: commit은 취소되고, add된 단계로 돌아간다.
git reset HEAD^ --soft
# mixed reset: commit은 취소되고, commit된 내용물은 add 이전단계로 돌아간다(unstaged)
# 직역: HEAD^ 상태로 돌아가겠다.
git reset HEAD^
# hard reset: commit은 취소되고, commit된 내용물을 전부 삭제함.
git reset HEAD^ --hard
# Last Commit 이후의 변경사항이 전부 stash 스택에 저장된다. 저장되는 파일은 add되지 않은 Modified 상태의 file도 포함한다.
# 주의) Untracked 상태의 파일은 당연히 저장되지 않음(git에서 아예 인지하지 못한 파일이므로). => 다만, 이 file은 conflict낼 일도 없기에(git에서 아예 인지하지 못한 file이므로), 문제없음.
git stash
# 저장한 stash 목록을 확인할수있다.
git stash list
git checkout feature/logout
작업완료후
git checkout feature/login
# 아래 두 명령어의 순차적 실행과 완전히 같다.
# git stash apply
# git stash drop
git stash pop
cp login.py login(1).py
cp login_data.py login_data(1).py
...(싹다 cp로 수동백업)
git reset HARD --hard
git checkout feature/logout
작업완료후
git checkout feature/login
cp login(1).py login.py
cp login_data(1).py login_data.py
...(싹다 cp로 수동복원)
# 새로 filename을 add한 뒤, Latest Commit을 "바꾸기(덮어쓰기)"
git add <filename>
git commit --amend
# Latest Commit의 커밋메시지를 바꾸기
git commit --amend -m "NewCommitMessage"
# merge 안쓰고 branch 합치는 법
# 내가 feature1 브랜치에서 작업하고있고, master 브랜치의 Latest Commit 이후에 feature1 브랜치의 Commit들을 쌓아올리고 싶을 때.
# 장점: 불필요한 merge commit을 생성하지 않을 수 있음.
# 단점: 기존 feature 1의 Commit Hash가 0001이라고 쳤을 때, rebase 이후의 동일 Commit Object의 Hash는 새로운 값을 가지게 됨.
git rebase master
# interactive 하게 rebase 하겠다.
# Commit History의 변경/삭제를 하고싶을 때 사용.
git rebase -i
# rebase 이후, 달라진 commit Hash 때문에 push 거부가 발생할 때.
# !!!주의!!! remote의 Commit가 덮어씌워져서, 복구불가능하게 될 수 있음. History가 남지 않음.
# remote branch의 Commit Hash를 덮어씌워버릴 수 있고, 이렇게되면 다른 모든 사람이 push할때 ERROR가 발생하게 됨. 따라서, 미리 말을 해주자.
git push --force
# ~/.gitconfig
[alias]
ll = log -U -n 1
co = checkout
# 아래와 같다.
# ~/.bashrc
alias gb = "echo 'git branch' && git branch"
# WORKING_DIRECTORY/.git/config
# ...
[alias]
s = status -s
co = checkout
ci = commit
br = branch
l = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%C(bold blue)<%an>%Creset' --abbrev-commit
# 현재 config들 확인가능.
git config --list