📥 Github 설치하기
- Git SCM에 접속하여 설치 파일 다운로드
- https://git-scm.com/
1. Github 기본 명령어
1) local repository용
git init
: 새로운 저장소 만들기git clone [원격 저장소 URL]
: 저장소의 모든 파일들을 가져오기만 함git clone -b [브랜치명] [원격 저장소 URL]
: 특정 브랜치를 clone
git add [추가할 파일명]
: 커밋할 파일을 stage(커밋하기 위한 준비 상태에 돌입) 시켜줍니다- -update : 추적하고 있는 파일만 add
git rm [삭제할 파일명]
: 제거 관련 명령어- -cached : 해당 파일을 working directory 상태로 되돌림
(Git 저장소에서만 삭제하고 실제 파일은 남겨두고 싶은 경우)
- -cached : 해당 파일을 working directory 상태로 되돌림
git commit -m "[커밋 메시지]"
: commit 메시지와 함께 commitgit commit --ammend
: commit 메세지 변경git status
: git 상태 확인git log
: commit 목록 확인
2) local repository ↔ remote repository
git remote
: local repository에 연결된 remote repository를 확인git remote add [별칭] [remote repository URL 주소]
: 원격 저장소 등록git remote show [원격 저장소명]
: 원격 저장소 정보git push [원격 저장소명] [원격 branch명]
: branch 명에는 master 혹은 develop 등의 본인이 만든 branch의 이름을 넣어 주세요git push [원격 저장소명] [원격 branch명]
: branch 명에는 master 혹은 develop 등의 본인이 만든 branch의 이름을 넣어 주세요git pull [원격 저장소명] [원격 branch명]
: local repository와 비교하여 병합을 하고, local repository에 저장( add )까지 수행- git pull = git fetch + git merge
3) master ↔ branch
git branch
: 브랜치의 목록과 현재 사용하고 있는 브랜치를 확인git branch [branch]
: 브랜치 생성-r [branch]
: remote repository 브랜치 목록 확인-a [branch]
: local / remote repository 모두의 브랜치 목록 확인-D [branch]
: local repository 브랜치 삭제
git checkout [branch]
: 브랜치를 이동git checkout -b [branch]
: 브랜치 생성 후, 그 브랜치로 이동git fetch
: local repository에서 remote repository와 동기화하는 역할(업데이트)git merge [브랜치]
: 현재 checkout 하고 있는 branch로 [branch]에서 병합git checkout master git merge develop # develop --merge-> master
branch를 merge 할 때는 같은 파일을 수정할 경우 생길 수 있는 충돌 발생을 항상 주의해야 합니다.
2. Github 취소 명령어
1) git add 취소하기
git reset HEAD [파일명]
: git add 한 [파일] 취소, 수정된 워킹 디렉터리의 파일은 보존
git reset HEAD
: git add한 [파일 전체] 취소, 수정된 워킹 디렉터리의 파일은 보존
2) commit 취소하기
git reset HEAD^
: commit 취소 (위와 동일)git reset HEAD~2
: 마지막 commit 2개 취소.git reset [commit_id]
: git add를 한 상태에서, 변경된 staging area를 무효화 (수정된 내용은 유지)git reset --soft [commit_id]
: [commit_id
]으로 되돌림. staged 상태, 워킹 디렉터리의 파일 보존.git reset --soft HEAD^
: 직전 commit 취소. staged 상태, 워킹 디렉터리의 파일 보존.git reset --mixed [commit_id]
: [commit_id
]으로 되돌림. unstaged 상태, 워킹 디렉터리의 파일 보존git reset --mixed HEAD^
: 직전 commit 취소. unstaged 상태, 워킹 디렉터리의 파일 보존(기본 옵션)git reset --hard [commit_id]
: [commit_id
]으로 되돌림. unstaged 상태, 워킹 디렉터리의 파일 삭제. 즉 모두 취소.git reset --hard HEAD^
: 직전 commit 취소. unstaged 상태, 워킹 디렉터리의 파일 삭제. 즉 모두 취소.
3) git push 취소하기
주의 사항
- local의 내용을 remote에 강제로 덮어쓰기를 하는 것이기 때문에 주의.
- 되돌아간 commit 이후의 모든 commit 정보가 사라지기 때문에 주의.
- 협업 프로젝트에서는 동기화 문제가 발생할 수 있으므로 주의
- 방법 1
- 과정
- 워킹 디렉터리에서 commit을 되돌린다 →
- 되돌려진 상태에서 다시 commit을 한다 →
- 원격 저장소에 강제로 push 한다.
- 명령어 순서
git reset HEAD^
/git reset [버전명]
git commit -m "변경한 메시지"
git push origin +[branch]
: 해당 branch를 원격 저장소에 강제로 push ('+' 붙여야 함)git push origin [branch ] -f
: 해당 branch를 원격 저장소에 강제로 push
- 과정
- 방법 2
git revert [commit_id]
: 해당 커밋만을 되돌림git revert [commit_id1..commit_id2]
: 해당 범주의 커밋을 모두 되돌림
4) git merge 취소하기
git reset -merge ORIG_HEAD
- master와 child 두 브랜치가 있을 때, master 브랜치에서 child 브랜치를 병합하려고 했는데 병합을 하면 안 되는 작업이었던 것이 었다면, 이 경우에 병합을 한 후, 바로 병합을 취소
- 병합은 위험한 작업이기 때문에 Git은 병합을 하기 전에, 최신 커밋에 포인터를 지정( ORIG_HEAD )합니다.
- 따라서 방금 병합한 것을 되돌리려면 -merge 옵션과 ORIG_HEAD 포인터를 지정하여 reset 명령어를 실행하면 됩니다.
git revert --mainline 1 {취소할 병합 커밋 ID}
- revert의 --mainline 옵션을 사용해서 병합을 취소할 수 있습니다.
- mainline이란 병합을 취소한 후에, 어느 라인을 기준으로 되돌아갈 것인지 기준을 정하는 것입니다.
- 명령어를 실행하면 편집기 창이 나오면서 커밋 메시지를 작성하라고 합니다.
5) git reset VS git revert
- 단순하게 되돌릴 시점 이후의 commit을 전부 날리고 remote repository에 강제로 push 하여 되돌리려면 reset을 사용하면 된다 - commit history를 단순하게 만들어 준다
이미 원격 리파지토리에 push를 한 상태라면 reset을 사용하면 reset 하기 이전으로 되돌리기 전까지는 push 할 수 없게 됩니다. (물론 force라는 무시무시한 옵션이 있기는 합니다. )
따라서, 여러 문서들에서는 이미 push 한 코드에 대해서는 revert를 사용할 것을 추천하고 있네요...ㅎㅎ (정확하지 않습니다.)
- 하지만 이력 중간에 로그 출력하도록 한 커밋이 있고 그 커밋만을 취소하려고 한다면 revert를 사용하여 해당 커밋의 내용만 되돌릴 수 있다.
3. 협업용 github 사용
1. upstream에 대한 이해
git remote add upstream [remote repository URL 주소]
: upstream [주소] remotegit branch -r
: -r 붙이면 원격 저장소의 branch list 확인git branch -v
git fetch upstream
: upstream 저장소에 있는 변경사항들을 로컬로 가져오면서 새로운 branch 생성git checkout [master]
: [내 브랜치]로 현재 가리키는 branch 업데이트git merge [upstream/develop]
:[upstream/develop]
을 내 현재 branch로 merge(동기화)git push [origin] [branch]
: 내 원격 repo로 push 해주면 끝
2. PR (Pull Request)
- upstream repository를 내 repository에 동기화하는 경우
- 이렇게 upstream repository와 동기화 한 내 레포를 upstream 레포로 PR을 보냄
- upstream에서 conflict가 없을 시 PR 승인
- 다른 협업자들은 본인의 변경사항으로 PR 하기 전에 다시 1. 의 과정을 통해 본인의 레포를 upstream의 레포와 동기화한 후 PR
- upstream repository에 내 변경사항만 추가하고 싶은 경우
- upstream과 동기화를 하지 않고, 협업자와 다른 파일만을 건든다면 fetch, merge 없이 PR 가능
더 알고 싶은 분은...
- https://learngitbranching.js.org/index.html?demo
- https://goodtogreate.tistory.com/entry/GIT-tip-정리?category=440231
참고 및 출처:
[전체적인 git 명령어 참고](https://victorydntmd.tistory.com/category/Git/%EA%B0%9C%EB%85%90%EA%B3%BC%20%ED%99%9C%EC%9A%A9?page=2)
[reset, revert 사용하는 시점 참고](https://medium.com/nonamedeveloper/%EC%B4%88%EB%B3%B4%EC%9A%A9-git-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0-reset-revert-d572b4cb0bd5)