TIL (2020.06.03)

Awesome·2020년 6월 3일
0

TIL

목록 보기
10/46

Git과 github

Git & github

Git은 소스코드의 버전을 관리하는
버전 컨트롤 시스템(Version Control System)

Github은 git 을 관리할 수 있는 중앙 시스템이며, 개발자 간의 협업 시에 사용되는 repository(저장소)를 제공해주는 중앙 서버 역할을 한다.

즉, git 은 개개인의 로컬 pc내 소스 코드를 추적하는 시스템이며 github은 그러한 소스 코드들이 모여 있는 곳이라고 생각할 수 있다.

github에 있는 코드를(remote 환경) git clone 을 통해서 local 로 복제할 수 있다. 최초에 소스를 받을 때만 사용한다.
로컬에서 작성한 코드는 다시 중앙 서버로 보낼 수 있다. 이것을 push 라고 한다. 하지만 push에 앞서 세 가지 단계를 거친다.

  1. modified
  2. staged
  3. committed

Modified 단계는 로컬에서 수정이 일어난 단계이다. 최초 코드를 수정하고 나면 modified 단계가 된다.
Staged 단계는 중간 save 단계로 곧 commit 될 것이라고 마크된 상태이다. 추가 수정사항이 있거나 잘못된 부분이 있는 경우 되돌리기 위한 임시 저장 상태이다. git add 를 통해서 staged 단계로 만들 수 있다.
마지막으로 committed 는 commit이 된 상태이다. 즉, 수정 사항이 git에 저장된 상태라고 볼 수 있다. git commit -m "설명" 방식으로 commit 할 수 있다. Commit 까지 완료되면 push 작업을 통해 github(중앙 서버)에 밀어 넣는다.

문제가 없다면, push 후에 github에서 pull request 한다. 이는 수정된 소스를 master 에 merge 해줄 것을 요청하는 것을 말한다.


이미지 출처

Master & branch

대부분의 경우, 완성된 결과가 있는 저장공간과 작업을 진행 중인 저장공간을 분리한다. 전자는 master branch(보통 master라고 함) 이고, 후자는 branch라고 한다. Branch 명은 일반적으로 feature/이름 방식으로 작성한다. Branch에서 작업이 완료되면 다시 add, commit, push 단계를 통해 github으로 올리고 pull request, merge 의 순서로 진행된다.

한 번 사용한 branch는 재사용하지 않고 또다른 작업을 위한 branch를 새로 생성하는 것이 좋다.

Process

git과 github을 활용한 프로세스는 다음과 같이 진행된다.

  1. local working directory를 생성한다.(mkdir)
  2. 해당 directory로 이동하여 git init 으로 local repo를 생성한다.(ls -a 로 .git 생성 확인)
  3. git clone 하여 최초 remote repo 에 있는 파일을 로컬로 가져온다.
  4. git branch 로 branch 를 생성한다.
  5. git checkout branch명 으로 해당 branch로 이동한다.
  6. 파일을 수정한다.
  7. git add 를 통해 staged 상태로 전환한다.
  8. 더 이상의 수정 사항이 없는 경우 git commit 을 통해서 committed 상태로 전환한다.
  9. git push를 통해 remote repo로 수정 파일을 보낸다.
  10. pull request를 통해 merge를 요청한다.

위와 같이 순조롭게만 진행되면 좋겠지만, 내가 작업을 하는 사이에 master가 변경된 경우 conflict 가 발생할 수 있다. 이런 경우에는 다시 pull origin master 를 통해 파일을 로컬로 가져와서 HEAD(내가 만든 부분)와 MASTER 간의 차이를 조정하면 된다.

이 때, local master에서 pull origin master를 해야 한다. 그리고 다시 내 local branch로 이동한 뒤, git merge master 를 통해서 local master의 파일을 local branch로 merge하여 최신화 한 후에 수정한다.

Git 명령어

  • git init : 최초 git local repo 생성
  • git clone : remote 환경의 소스를 복제(최초) / 자동으로 remote repo 를 origin 이라는 이름으로 저장한다.
  • git config user.name : username 설정
  • git config user.email : email 설정
  • git branch : branch 생성
  • git checkout : branch 간 이동
  • git add : staged 상태로 전환
  • git commit -m "설명" : committed 상태로 전환
  • git push origin branch_name(local) : remote 환경으로 push
  • git pull origin master : remote master 에서 소스 복제
  • git merge master : local master 소스를 branch로 최신화
  • git log : commit log 확인
  • git rm : git에 등록된 파일 삭제
  • git diff : modifed 상태에서 수정사항 확인
  • git status : 상태 확인 (modified or staged)
  • git mv : git 에서 파일 이동 혹은 rename에 사용
  • tig(plug-in) : git 히스토리 확인 가능
  • git log --pretty=oneline : 로그 한줄로
  • git show {commit_id} : 해당 commit 상세 변경사항
  • git remote add origin {url} : origin 이라는 이름으로 remote repo 추가
  • git fetch : pull 하면 merge 까지 하게 되는데 단순히 코드만 가져오고 싶은 경우 사용
  • git blame {file_name} : 특정 파일, 특정 코드 작성자가 누구인지 확인
  • git revert {commit_id} : commit 을 취소하고 다시 commit
  • git revert {commit_id}...{commit_id} : 앞 commit_id 는 초과 개념임(초과,이하)
  • git reflog : HEAD 가 가리키는 commit 의 history 를 보여줌. commit history 를 모른채 reset(--hard) 한 경우, 이를 되돌리고 싶을 때 참조
    • reference log 줄임말임
    • git reset 을 한다고 해서 commit 이 전부 사라지는 것은 아님
  • git rebase {branch_name} : git merge 와 결과는 같지만 merge commit 이 생기지 않음
    • conflict 발생하면 해결 후에 git rebase --continue 실행

  • git stash : working directory 내용들을 임시로 스택에 저장하고 최근 commit 기준으로 초기화
    • git stash list : 임시 저장된 작업 리스트 확인
    • git stash apply : 스택에서 임시 저장된 내용을 working directory 로 다시 가져옴
    • git stash apply stash@{n} : 가장 최근 작업이 아닌 특정 작업을 불러오고 싶은 경우 사용
    • git stash drop stash@{n} : 스택에서 작업내용 삭제
    • 잘못된 브랜치에서 작업한 경우, 해당 내용을 stash로 저장하고 올바른 브랜치로 이동해서 apply 하면 된다.
    • git stash pop : 최근 작업내용을 불러오는 동시에 스택에서 삭제함
    • git stash pop stash@{n} : 특정 작업내용을 불러오면서 스택에서 삭제함
  • git cherry-pick {commit_id} : 특정 commit 만 가져와서 merge 하고 싶은 경우

Tips

git log --pretty=oneline --all --graph : 로그를 보기 좋게 그래프 형식으로 표현

git add 후에 다시 unmodified 로 돌아가고 싶을 때(git add 취소)

  • git reset 파일명

최신 커밋을 수정하고 싶은 경우

  • 우선 수정을 한다.
  • git add . && commit --amend : 최근 커밋을 업데이트 함

commit 을 한다고 staging area 파일이 지워지는 것은 아니다.

git cli alias

  • git config alias.history 'log --pretty=oneline'
    • git history = git log --pretty=oneline

HEAD : HEAD는 branch를 통해서 commit 을 바라보기 때문에 brach를 이동하면 결국엔 HEAD 가 이동하는 것으로 볼 수 있음

  • git reset --hard {commit_id} : 해당 commit 기준으로 이동
  • git reset --hard HEAD^ (현재 HEAD의 바로 이전 commit)
  • git reset --hard HEAD~n (현재 HEAD의 n단계 전 commit)
  • 반드시 과거 commit 으로만 이동할 수 있는 것은 아니며 이후 commit 으로도 이동할 수 있다.

  • git checkout {commit_id} : HEAD 가 직접 commit 을 가리키게 함. 보통 특정 시점에 새로 branch 를 만들기 위해서 사용 (Detached HEAD 상태)

  • 이후에 git branch {branch_name}
  • git checkout {branch_name}

하게 되면 아래와 같이 된다.

Tag

  • git tag {tag_name} {commit_id}
  • git show {tag_name}

Branch

  • git branch -d {branch_name}
  • git checkout -b {branch_name} : 만들고 동시에 이동
  • git merge --abort : merge 취소

일반적으로 push 할때,

  • git push origin master = git push origin master:master
    • origin : remote repo name
    • master:master : local master brach/remote master branch
    • git push -u origin master
      • -u : --set-upstream 약자
      • 자동으로 remote mater branch 를 추적하는 tracking connection
      • master branch 가 없으면 새로 생성하고 push
      • 한 번 설정되면 그 다음부터는 local master branch 에 위치해 있을 때git push/git pull 만 해도 됨
profile
keep calm and carry on

0개의 댓글