오픈소스 개발 참여에 필요한 Git 명령어 정리

이대현·2021년 8월 14일
2

GIT

목록 보기
11/13

2021 오픈소스 컨트리뷰션 아카데미의 오픈소스 101 교육을 듣고 정리한 내용입니다.

  • 버전관리용으로 혼자서 git을 사용할 때 배웠던 add 취소 (reset) / commit 수정 (amend) 명령어는 이 글에서 정리했었다.
  • branch를 만들고 작업한 뒤 PR을 날리는 자세한 과정은 이 글에서 정리했었다.

1. branch와 commit - 소스파일 수정 작업

  • branch 란? 같은 폴더 다른 세상

  • 기여할 때 branch 명칭은 어떤 작업을 하는지에 대한 요약 명칭으로 짓는다.

    • git checkout -b fix-mnist
  • 왜 새 브랜치에서 작업한 내용이 master 브랜치에서도 바로 적용되나요?

    • master 브랜치에서 git status를 해보면 그 파일은 untracked file 임을 확인할 수 있다. 새 브랜치에서 소스파일을 수정하고 commit을 통해 해당 브랜치에 적용을 해줘야지만 git이 관리하는 소스가 된다. 새 브랜치에서 꼭 commit을 통해 히스토리를 만들어주자.
  • commit 메세지는 유의미한 설명이 될 수 있도록 작성한다.

    • Correct, Fix : 잘못된 값을 정정했을 때
    • Add : 없던 내용을 추가할 때
    • Remove, Delete : 파일 혹은 폴더를 지울 때
  • 라이센스 서명 넣어서 commit 메세지 적기

    • -s 옵션 포함시 라이센스 서명을 의미하는 Signed-off-by 내용을 commit message 안에 포함하게 된다.
    • 모든 기여 내역 권한을 이 프로젝트에 부여한다는 의미다.

2. diff - 소스파일 수정 후 최신 히스토리와의 차이점 확인하기

이 포스팅에서 말한 수정 이란 표현은 add, commit으로 history를 만들기 전 상황을 의미한다.

git diff
  • 빨간 - 표시로 지워진 내용, 초록 + 표시로 추가된 내용이 보여진다.

3. stash - 수정 내용 잠시 저장하기

# 수정한 파일 확인하기
$ git status

# 수정한 내용 잠시 저장(stash) 하기
$ git stash

# 현재 소스폴더 상태 확인하기: 아무 수정분 없음을 확인 
$ git status

# 잠시 저장(stash)해둔 내용 복구
$ git stash pop

# 복구된 수정한 파일 확인하기
$ git status

4. checkout - 수정한 파일 복구하기

git checkout -- 파일명
  • checkout 의미: "가져오다 / 대출받다"라는 뜻
  • local git 저장소에서 최신 히스토리 상태를 가져온다 라는 느낌으로 생각하면 된다.

5. amend - commit 내용 수정하기

# 최신 commit 수정이전 commit ID 확인하기
$ git log --oneline -1
106d167 (HEAD -> fix-mnist) Add import requests  

# 수정한 내용 commit 할 준비 하기
$ git add mnist/main.py

# 최신 commit 수정하기
$ git commit --amend

# 최신 commit 수정 이후 commit ID 확인하기
$ git log --oneline -1
9786c82 (HEAD -> fix-mnist) Add import requests
  • 커밋 메세지를 잘못 적은 상황 등에서 커밋을 수정하고 싶다면, 새 커밋을 쌓는 것보다 이미 올린 커밋의 내용을 수정하는 것이 협업의 관점에서 옳은 방식이다.
    • 원래 있는 커밋에 수정 내용을 흡수 시키는 느낌이다.
  • amend 명령어는 최신 커밋에 대해 메세지 등을 수정할 수 있도록 에디터를 띄워준다.
  • amend 명령어 이후 commit ID는 변경된다.

6. Rebase - 오픈소스 프로젝트 개발 참여 중 Rebase가 필요한 상황

base란? 내가 작업하기 전의 최신 히스토리를 말한다.

내 PR이 Merge되기 전, 다른 사람의 PR이 먼저 프로젝트에 반영될 수 있다. 그러면 내 PR base에 팀프로젝트의 최신 히스토리를 업데이트 하는 작업이 필요하다.

base를 업데이트 하는 작업을 해야하고 이를 rebase라고 부른다.

git 명령어는 fetch 를 사용한다.

fetch

rebase

force push

# 1. 공식 upstream 저장소에서 최신 commit history 가져오기    
$ git fetch upstream master

# 2. 최신 commit history 기준으로 베이스 갱신 (rebase)
$ git rebase upstream/master

# 3. Fork 한 저장소(GitHub)도 수정하기 (PR 자동 갱신) 
$ git push --force origin fix-mnist
  1. 공식 프로젝트 upstream 저장소의 base를 가져온다.
    - pull 은 fetch + merge 기 때문에 fetch를 사용한다.
  2. 가져온 base를 내 upstream 리모트에 rebase 명령어로 적용한다.
  3. fork 한 내 원격저장소에 force push 한다. 이때 PR은 자동 갱신된다.
    • 오픈소스 프로젝트 매커니즘에서는 force push를 필수로 사용한다.
    • force가 무조건 안 좋다는 말은 상황을 고려하지 않은 말이었네!
profile
삽질의 기록들 👨‍💻

0개의 댓글