출처: 코드잇 git강의(강추)
git reset file_name
a = 1
을 적은뒤 add, commit한다.b = 2
코드를 추가하고 add까지 한다.b = 2
부분을 커밋에서 제거해야 한다고 치자.git reset git_practice.py
명령어를 친다. 이렇게 하면 staging area에서 b = 2
부분이 사라진다.b = 2
부분을 지워주면 된다.git log
: 깃 로그 보기git log --pretty=oneline
: 깃 로그 간략하게 한 커밋 당 한 줄로 보기git show <commit id>
: 해당 커밋에 어떤 변화가 있었는지 상세하게 보여줌.커밋 아이디
값은 엄청 긴데, 이걸 전부 다 쓸 필요는 없다. 앞 몇자만 써도 (중복만 없다면) 잘 인식한다.git commit --amend
a = 1
이라고 쓴 뒤 add a = 1
이라는 커밋 메세지를 남겼다.a = 2
로, 커밋 메세지는 add a = 2
로.a = 2
로 수정하고 add까지 한다음 git commit --amend
명령어를 실행해서 새로운 커밋메세지를 남기면, 새로운 커밋이 가장 최신 커밋을 대체한다!(1) 커밋을 한 사용자 아이디
(2) 커밋한 날짜, 시간
(3) 커밋 메시지
Add multiply function
caculator.py supports 3 functions now
-import numpy as np
처럼 git 커맨드도 별명을 지어줄 수 있다.
git log --pretty=oneline
에 git history
라는 별명을 지어준다. 긴 깃 명령어를 줄이고 싶을 때 유용.git config alias.history 'log --pretty=oneline'
git diff <더 오래된 커밋 아이디> <더 최신 커밋 아이디>
git diff <branch a> <branch b>
git reset --hard 과거 커밋 아이디
git tag [태그 이름] [커밋 아이디]
: 특정 커밋에 태그 부여git tag
: 태그 리스트 확인git branch -d <브랜치 명>
git merge main
: main브랜치의 내용은 현재 위치한 브랜치에 반영.git merge --abort
merge취소.git remote add origin https://github.com/blahblah.git
git remote add banana https://github.com/blahblah.git
로 해도 무방.git push -u origin master
--set-upstream
옵션의 약자로컬 레포지토리에 A라는 브랜치가 있고,
리모트 레포지토리에 B라는 브랜치가 있을 때
이런 tracking connection이 서로 맺어진 경우,
B 브랜치를 A 브랜치의 upstream branch라고 합니다.
지금은 구별하기 위해서 A와 B라고 표현했지만 보통은 같은 이름인 경우가 대부분입니다.
이렇게 tracking connection이 한번 설정되고 나면,
사용자가 현재 master 브랜치에 위치해있을 때,
git push
라고만 써도 자동으로 리모트 레포지토리의 master 브랜치를 대상으로 git push가 동작하고,
git pull
라고만 써도 리모트 레포지토리의 master 브랜치를 대상으로 git pull이 동작합니다.
사실 --set-upstream(-u) 옵션을 주지 않아도 그 후에 git push와 git pull을 할 수 있기는 합니다. 하지만 맨 처음에 이 옵션을 주지 않으면 tracking connection이 없기 때문에 나중에 git push를 하고 싶을 때git push origin master:master
이런 식으로 적어줘야 합니다. 여기서
origin은 리모트 레포지토리를 나타내고,
master:master에서 더 먼저 나오는 master는 로컬 레포지토리의 master 브랜치(~에서)/더 뒤에 나오는 master는 리모트 레포지토리의 master 브랜치(~으로)를 나타냅니다.
그러니까 tracking connection이 없으면 매번 이런 식으로 git push를 해줘야 합니다. git pull도 마찬가지로 이런 식의 복잡한 표현이 필요하게 됩니다.
그러니까 그냥 처음부터 tracking connection을 설정하고 그 이후부터는 git push, git pull이라고만 써서 편하게 푸시와 풀을 하는 게 좋겠죠? 이게 바로 제가 맨 처음에 로컬 레포지토리의 내용을 리모트 레포지토리로 보낼 때 -u라는 옵션을 썼던 이유입니다.
git reset
한다고 그 이후의 커밋이 사라지는 것은 아니다. 계속 남아있다.git reset
은 과거 커밋 뿐만 아니라 현재 HEAD이후의 커밋으로도 할 수 있다.git reset
시 HEAD가 가리키는 branch가 특정 커밋으로 이동하는 것이다.git checkout 9033
을 하면 HEAD가 직접 움직인다.Detached HEAD
라 부른다.git branch premium
명령어로 9033에서부터 새 브랜치를 만들 수 있다.(아래 그림 참고)git checkout premium
으로 HEAD가 premium브랜치를 가리키게 된다. detached HEAD에서 정상으로 돌아오는 것(아래 사진 참고)git checkout master
의 뜻은 아래와 같다.= master 브랜치로 이동하라
= HEAD가 master 브랜치를 가리키도록 하라
= HEAD가 master 브랜치가 가리키던 커밋을 간접적으로 가리키게 됨으로써
= working directory의 내부도 그 커밋에 맞게 변함으로써
= master 브랜치로 이동한 것을 사용자는 실감하게 됨
git merge premium
을 하면 fast-forward merge가 일어난다.그럼 언제 git fetch를 사용할까요? 업스트림 브랜치의 신규 커밋들을 현재 브랜치에 바로 머지하기보다는 일단 한번 살펴볼 필요가 있을 때 git fetch를 사용합니다.
만약 살펴봤는데 괜찮다면 로컬 레포지토리의 브랜치에 바로 머지하면 되죠.
괜찮지 않다면
(1) 그 작업을 한 다른 개발자와 상의해서 리모트 레포지토리의 내용을 수정해달라고 부탁하거나
(2) 일단은 내가 머지를 하고 제대로 수정해서 커밋한 다음에 git push를 하면 되구요.
git fetch
로 내용 가져옴. (premium 브랜치라고 가정)git diff premium origin/premium
으로 달라진 내용 비교.git blame <파일명>
: 어떤 파일의 각부분이 어떤 커밋에서 생겼는지 확인 가능.git show <commit_id>
로 누가 작성한 커밋인지 확인.git revert <변경사항 A의 커밋 아이디>
명령어는 A의 변경사항을 제거한 뒤 커밋까지 해주는 명령어다. 이렇게 revert한 뒤 다시 push해주면 된다.git revert 5번 커밋 id
를 한다. 이렇게 하면 5내용이 사라진 6번 커밋이 생기고, 이를 push하면 된다.git revert facdd05..eea5349
명령어를 치면 된다.git reset
명령어로 과거 커밋으로 돌아간 후 다시 최신 커밋으로 돌아오고 싶을 때 최신 commit id를 치면 된다. 다만 git log
로 최신 커밋의 아이디를 볼 수 없는데, 이때 git reflog
명령어로 커밋 아이디를 볼 수 있다.git rebase <branch>
->(conflict) git add .
-> git rebase --continue
git stash
: 작업 내용 저장. 최근 커밋 이후로 작업했던 내용은 모두 stack에 옮겨지고, work dir는 최근 커밋 상태로 초기화됨.git stash list
: stash stack에 있는 작업 내용 조회git stash apply [작업 내용의 아이디]
: 작업 내용 적용git stash drop [작업 내용의 아이디]
: 작용 내용 삭제git stash pop [작업 내용의 아이디]
: 작업 내용 적용 + 삭제git cherry-pick [커밋 아이디]
git reset --soft <1의 커밋 아이디>
로 해주면 된다.git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정
하고 그 안에 레포지토리(.git 디렉토리) 생성
git config user.name 'codeit' : 현재 사용자의 아이디를 'codeit'으로 설정(커밋할 때 필요한 정보)
git config user.email 'teacher@codeit.kr' : 현재 사용자의 이메일 주소를 'teacher@codeit.kr'로 설정(커밋할 때 필요한 정보)
git add [파일 이름] : 수정사항이 있는 특정 파일을 staging area에 올리기
git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기
git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기
git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기
git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음)
git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기
git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력
git push -u origin master : 로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용합니다.(-u origin master가 무슨 뜻인지는 'Git에서 브랜치 사용하기' 챕터에서 배울 거니까 걱정마세요!)
git push : 로컬 레포지토리의 내용을 리모트 레포지토리에 보내기
git pull : 리모트 레포지토리의 내용을 로컬 레포지토리로 가져오기
git clone [프로젝트의 GitHub 상 주소] : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기
git log : 커밋 히스토리를 출력
git log --pretty=oneline : --pretty 옵션을 사용하면 커밋 히스토리를 다양한 방식으로 출력할 수 있습니다. --pretty 옵션에 oneline이라는 값을 주면 커밋 하나당 한 줄씩 출력해줍니다. --pretty 옵션에 대해 더 자세히 알고싶으면 이 링크를 참고하세요.
git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지 확인
git commit --amend : 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦
git config alias.[별명] [커맨드] : 길이가 긴 커맨드에 별명을 붙여서 이후로 별명으로 해당 커맨드를 실행할 수 있도록 설정
git diff [커밋 A의 아이디] [커밋 B의 아이디] : 두 커밋 간의 차이 비교
git reset [옵션] [커밋 아이디] : 옵션에 따라 하는 작업이 달라짐(옵션을 생략하면 --mixed 옵션이 적용됨)
(1) HEAD가 특정 커밋을 가리키도록 이동시킴(--soft는 여기까지 수행)
(2) staging area도 특정 커밋처럼 리셋(--mixed는 여기까지 수행)
(3) working directory도 특정 커밋처럼 리셋(--hard는 여기까지 수행)
그리고 이때 커밋 아이디 대신 HEAD의 위치를 기준으로 한 표기법(예 : HEAD^, HEAD~3)을 사용해도 됨
git tag [태그 이름] [커밋 아이디] : 특정 커밋에 태그를 붙임
git branch [새 브랜치 이름] : 새로운 브랜치를 생성
git checkout -b [새 브랜치 이름] : 새로운 브랜치를 생성하고 그 브랜치로 바로 이동
git branch -d [기존 브랜치 이름] : 브랜치 삭제
git checkout [기존 브랜치 이름] : 그 브랜치로 이동
git merge [기존 브랜치 이름] : 현재 브랜치에 다른 브랜치를 머지
git merge --abort : 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감
git fetch : 로컬 레포지토리에서 현재 HEAD가 가리키는 브랜치의 업스트림(upstream) 브랜치로부터 최신 커밋들을 가져옴(가져오기만 한다는 점에서, 가져와서 머지까지 하는 git pull과는 차이가 있음)
git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력
git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성
git reflog : HEAD가 그동안 가리켜왔던 커밋들의 기록을 출력
git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력
git rebase [브랜치 이름] : A, B 브랜치가 있는 상태에서 지금 HEAD가 A 브랜치를 가리킬 때, git rebase B를 실행하면 A, B 브랜치가 분기하는 시작점이 된 공통 커밋 이후로부터 존재하는 A 브랜치 상의 커밋들이 그대로 B 브랜치의 최신 커밋 이후로 이어붙여짐(git merge와 같은 효과를 가지지만 커밋 히스토리가 한 줄로 깔끔하게 된다는 차이점이 있음)
git stash : 현재 작업 내용을 스택 영역에 저장
git stash apply [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용
git stash drop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 스택에서 삭제
git stash pop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용하면서 스택에서 삭제
git cherry-pick [커밋 아이디] : 특정 커밋의 내용을 현재 커밋에 반영