Github에서 issue/commit/PR

뚜비·2023년 7월 14일
1

첫 번째 PR << 여기서 저의 PR을 확인할 수 있습니다.

슬랙에서 갑자기 공지가 올라온 멘토님의 깜짝 지령..

바로 우리가 앞으로 프로젝트를 진행할 Repo에 지정해주신 issue를 수행하고 PR 및 커밋을 수행해보는 것!


어떤 issue인가?


해당 repo의 ISSUE_TEMPLATE 파일에 들어가서 멤버 프로필 업데이트에 들어가보니 위와 같은 지령이 있었다.


🤔지령 요약

  1. 멤버 프로필 업데이트 이슈를 선택하고
  2. 해당 repo를 나의 레포에 fork
  3. 나의 레포에서 users.md[이름].mddocs/user 아래에 추가
  4. PR을 올리고(이슈와 연결)
  5. commit!!

위와 같은 과정을 진행하면 되는데 PR을 날리는 것은 문제가 없으나 키워드를 활용한 PR과 이슈 연결 방법을 참고해서 이슈와 PR을 수동이 아닌 연결을 하라는 부분에서 약간쓰 당황했다.


issue를 해결하기 위한 기본지식

이슈 템플릿?

키워드를 활용한 PR과 이슈 연결 방법

  • PRissue에 연결하는 이유는 참여자가 해당 issue에 작업 중임을 확인할 수 있기_ 때문이다.
  • issue에 연결된 PR을 default branch에 merge하게 되면 해당 issue는 자동으로close된다.

  • Pull Request(PR)과 issue를 연결하기 위한 방법으로 2가지가 존재한다.
  1. pr에 이슈를 수동적으로 연결
  2. keyword를 사용

1. PR에 이슈를 수동적으로 연결

2. keyword를 이용하여 연결

  • PR의 description이나 commit message에 지원되는 keyword를 사용하여 PR과 issue를 연결할 수 있다!
  • 이때 PR은 반드시 default branch에 있어야 한다.

🤔 keyword

close
closes
closed
fix
fixes
fixed
resolve
resolves
resolved


PR의 네이밍 컨벤션

  • Conventional Commits 스펙커밋 메시지를 작성할 때 규약들을 의미한다. 프로젝트와 협업에 있어서 중요한 부분이라고!!
  • 특히 PR title은 일반적으로 conventional commit 스펙을 따르는 것이 좋다. 왜냐하면 release note를 생성하고 release_notes.md file에서 merge 충돌을 예방해주기 때문이다.

PR title

PR의 title은

<type>([optional scope]) : <description>

과 같은 구조로 작성한다.

  • <type> : 여러가지 type keyword가 존재하는데 표를 참고!
type설명
buildChanges that affect the build system or external dependencies (dependencies update)
ciChanges to our CI configuration files and scripts (basically directory .github/workflows)
docsDocumentation only changes 문서변경
featA new feature 새로운 기능 추가
fixA bug fix 버그 수정
choreChanges which does not touch the code (ex. manual update of release notes). It will not generate release notes changes 기타 수정
refactorA code change that contains refactor 리팩토링
styleChanges that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) 스타일 수정
testAdding missing tests or correcting existing tests and also changes for our test app 테스트 코드 추가,수정,삭제
perfA code change that improves performance (I do not think we will use it)
  • [optional scope] : 추가 정보
  • <description> : PR에 대한 설명

DCO 봇의 체크 통과하기 위한 조건?

멘토님의 글을 참고..
DCO 봇
DCO

Developer Certificate of Origin(DCO)라고 개발자 증명을 위한 방식


GPG 서명...?

참고링크


나는 어떻게 수행했나?

1. 이슈 생성하기

먼저 ArgoWorkflows 레포 -> issue에 들어간 후

New issue 버튼을 클릭한다.

그럼 다음과 같은 이슈 템플릿이 여러 개 뜨는데 멤버 프로필 업데이트 Get started를 클릭

title에 이름을 수정해주고 Submit new issue를 누르면~~

짜잔 이슈가 생성되었다~~



2. GPG 설치 및 키 생성(windows 기준)

github 에서 서명된 커밋 (gpg) 사용하기
GPG(GNU PG)를 이용해 git 커밋에 서명하는 방법
GnuPG 사용 하기 윈도우 환경 gpg4win

위의 글이 설명이 더 잘 되어있으나 간단히 설명하자면~

위와 같이 기본 옵션으로 설정하고 다운로드 한 다음 디폴트 값으로 설치해주면~

다음과 같은 화면창이 뜬다. 이때 새 키 창을 누르고

이름 그리고 이메일 주소, 비번을 임력하면~~ 생성 완.. 이후 개인키 저장 및 백업(다시 설치 시 기존 메일의 암/복호화 내용 읽어볼 수 있도록..)을 진행한다~~

인증서의 지문에 확인하면 생성된 키의 이름을 확인할 수 있음!1



3. Repo fork 후 PR을 보낼 준비

원본 repo에서 fork한 후 fork한 레포를 나의 로컬 환경으로 clone 받았다! 이후 원격저장소 remote 설정,, PR 용 브랜치 생성.. 등의 과정을 거치고..

vscode로 전의정.md 파일을 수정해주고~


4. Github에서 gpg key 등록


깃허브의 나의 계정에 settings에 들어간 후 SSH and GPG keys를 클릭!! 여기서 New GPG key를 클릭해준다.


key 부분에 GPG 프로그램에서 해당 key를 더블클릭 후 내보내기 버튼을 클릭하면 나오는 내용을 복붙하면 된다!!

짜잔~


5. 서명된 커밋만 푸쉬 가능하도록 설정 및 내 PC에서 프로젝트 git config 설정


서명된 커밋만 허용할 repo(argoworkflow 레포가 되겠다)의 settings에 들어가서 Branch 메뉴를 클릭

Add branch protection rule 버튼을 클릭한 후

branch rule이 적용될 branch 명 조건에 *(모든 브랜치)로 지정 후 "Require signed commits"에 체크 후 create!


6. git config 설정하기

git bash로 열고 아래 명령어 입력!
git config 명령어로 커밋이 만들어질 때 적용될 각종 환경설정들을 설정할 수 있다.

$ git config --global user.email 내이메일
$ git config --global user.name 이름
$ git config --global user.signingkey 지문? secret key id? 
$ git config --global commit.gpgsign true
$ git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe" // windows 기준! 
  • 순서대로 이메일, 이름, commit에 사용할 서명키, 커밋 시 gpg 서명 사용 옵션 활성화, gpg program 경로 지정

6. DCO에 따른 커밋과 PR


멘토님이 올리신 PR 예시를 잘 확인해보니 흠 잘 알겠다.


PR을 보내기 위한 branch에서 수정한 파일을 staged 파일에 추가해주고(add) commit 메세지를 다음과 같이 작성해주었다.

커밋 이름은 커밋 컨벤션에 따라 지정하고.. 그 아래 description에
Signed-off-by: 이름 <이메일> 을 입력해준다!!
즉 git cli에서는 커밋 메세지의 첫 번째에 Signed-off-by로 시작하는 메시지를 붙여줘야 한다.

cli에서 커밋을 작성하는 경우
$ git commit -s -m "docs: 메세지 내용"
-s 옵션을 통해 커밋 메시지에 자동으로 user.name과 user.email이 추가된다.


그 후 PR 용 branch에 push하고 fork한 나의 레포에 들어간다!!

PR을 날릴 준비가 되었다!!!



PR 메세지에 Closes라는 키워드와 #9 해당 이슈의 번호를 적어준다! 즉 9번 이슈를 닫아줘~ 라는 뜻!!


7. DCO 조건 해결..


아놔 DCO에서 하나 걸렸다..
Details에 확인해보니.. 이름이 잘 못 되었다는데...? 내 이름이 ddubi인데 잘 못 지정되었다는거.. 뭐야.. 나 왜 뚜비야??

확인해보니 gitKraken > preferences > profile의 Author name을 확인해보니 ddubi로 되어있었다.. 이런.. 원래 이름으로 수성해주고..


8. 기존의 PR을 어떻게 수정할까

Git - 이미 올린 Pull request 수정하기
[GIT] 잘못된 Pull Request 머지 하기 전에 수정하기

흠.. 기존 PR에 올린 잘 못된 commit을 어떻게 수정하는지 검색해보니 commit 덮어쓰기를 활용하면 되었다.
git commit -ammend 로 최신 command 업데이트 하고 git push -f origin 기존 push한 branch으로 원격 저장소에 push해준다.

근데 나는 사용자 이름이 잘 못 되었기 때문에 새로운 커밋을 작성해주었고.. 기존에 push한 branch에 push 해주었다!! 흠 이전의 commit 때문에 걸리는 것일까.. 그래서 해당 commit을 삭제(revert)해주고 push해주었다.


저 Merge한 commit에서 계속 에러가 뜬다..


🤔 왜 안 되었을까?


문제를 분석해보니 revert, reset를 하고 push하는 과정에서 강제 push가 안 되어서 계속 기존의 잘못된 commit이 반영된 레포에 추가되어 merge 되는 것이 아닌가.. 해결방법은 아래와 같다.


일단.. 수정된 곳까지 reset hard 옵션(해당 부분까지 이후의 commit들은 다)을 사용하고

branch settings에 가서 강제 push가 가능하도록 설정해두었다..

그리고 내 branch에 push하니 DOC 해결되었다 꺄륵~~!!! 이제 멘토님이 확인해주시면 된다..



9. GPG 다시 생성 했습니다!! ㅠㅠ (원인: 깃크라켄 땜시)

Github GPG 적용 - GitKraken 연동
하놔... 깃크라켄으로 따로 설정해줘야 하는 거냐며.. 커밋 옆에 Verified 뱃지(?)가 없는 것을 보니 GPG가 적용되지 않았나보다.. 터미널 창에 git config --list로 확인해보니 user.signingkey에 아무것도 없었다.. Gitkraken 터미널에 셋팅을 안 해줘서 그런 걸수도..

깃 크라켄에 가서 Preferences > GPG Preferences에 간 후 위와 같은 상태에서 Sign Commits by default, sign tags by default 옵션을 클릭해주고 Generate를 해주고 해당 key를 copy해서 깃허브의 GPG keys에 추가해주었다. 그러곤 git config --list로 확인하니 잘 된다.. 아놔..


edit commit 하니 아주 잘 되었구려~~^_^



PR 공간에서 conflict 해결하고 Merge하는 법


흐아닠... 멘토님의 추가과제가.. PR 상에 일부 파일이 conflict가 일어났는데 이를 잘~ Merge해서 해결하라는 업무!!

Resolve conflicts 버튼을 누르면 위와 같은 그림이 뜨는데
만일 Resolve conflicts가 안 뜨는 경우 https://dodokong.tistory.com/38[Git] Pull request에서 발생하는 충돌 해결하기를 참고하길 바란다!!


일단 만일을 대비해 Resolve Conflicts가 안 뜨는 경우를 가정해서 처리해보자

문제 상황

위와 같이 나의 Fork된 Argoworkflows의 Uijeong branch에서 원본 repo(원본ArgoWorkflows)의 main에 PR을 날렸는데 다른 팀원 분이 미리 원본 repo main에 PR을 날리고 merge되어 원본 repo는 변경이 일어난 상태!! 따라서 user.md에 conflicts가 발생했다.


해결과정1 - merge 하기

먼저 Uijeong branch에 checkout을 하고 원본 main branch를 pull 혹은 'merge' 해준다.


1. Git Kraken 상에서는 UiJeong branch에 checkout 해두면 저렇게 화살표 모양이 체크되어 있는 것을 확인
2. main branch에 우클릭해서 Merge 원본레포/main into Mybranch 를 클릭한다. 원본 repo의 내용이 내 branch에 합쳐진다.
3. 이렇게 충돌이 발생했다는 표시가 뜨고 View conflict를 클릭 충돌된 conflict를 클릭한다.

4. +버튼을 눌러서 코드를 추가해주고 output에 있는 -버튼으로 코드를 제거하면 merge 시켜준다. 그리고 Save 클릭!
5. commit > push 하면 끝!!

다 초록불이구먼... 만족스럽군..



문제상황


지금 UiJeong branch(의정 레포)는 main branch(원본 레포)와 merge가 반영되어 있으나 실제 원본 레포의 main branch는 UiJeong branch(의정 레포)가 반영이 안 되어 있고 다른 팀원들에 의해 변동이 반영된 상황이다.

해결과정2 - rebase를 이용해서 merge하기

Git Merge와 Rebase의 차이, 아름다운고 깔끔한 Git History 만들기.
Git 브랜치 - Rebase 하기
이번에는 단순히 merge만 하는 것이 아닌 rebase를 이용해서 merge하려고 한다.


우선 uijeong branch에서 checkout 된 상태에서 원본 레포의 main branch에서 우클릭하여 Rebase uijeong branch onto remote branch AroWorkflows/main으로 해주었다. (Uijeong branch를 main 위로 rebase해라!?)

이렇게 conflict 해결해주면

위와 같은 형태가 되는데 UiJeong branch에서 변경한 commit을 main branch 위로 UiJeong branch를 두었다.

push 하니 저리 깔끔한 branch가!!!! 진짜 대박이다. commit을 재정렬 해주는 거구나!!


해결과정3 - 멘토님은 Sqaush Merge를 이용

PR 단위로 Merge한다고 함.



PR을 승인 받고 합쳐진 이후


저 docs:전의정 프로필 업데이트(#19)가 나의 PR이고 main에 반영됨을 볼 수 있다. 이제 UiJeong branch는 삭제해주기1


main branch에 checkout 해주고 pull 해주면 뾰로롱~



느낀점

지금까지 충분히 Git에 대해 마스터 했다고 생각했건만...
이 악마같은 git 파고파고 해도해도 헷갈려 죽겄다...
그래도 제법 간단한(?) 과제라고 멘토님이 공지해주셨는데 나는 왜이리 간단하게 느껴지지 않는 것인가..
강해져라!!!!

후후 이건 그냥 올려본다.

profile
SW Engineer 꿈나무 / 자의식이 있는 컴퓨터

0개의 댓글