🦁멋쟁이사자처럼 백엔드 부트캠프 13기 🦁
TIL 회고 - [102]일차
🚀102일차에는 Git 협업과 관련해 히스토리를 남기는 것과 브랜치 관리에 대해 배움 (2025.05.09)
Git 추적 파일 지우기
- git에 원치않게 추적되고 있는 파일 지우기
git rm -r --cached .
git add .
git commit -m "gitignore 적용"
git push origin main
- 팀원들이 이 상태에서 다시 pull을 받으면 사라진 상태에서 최신화가 되므로 사라진 상태가 원격 브랜치에 적용되어있을 것
브랜치 생성 및 이동
1. 브랜치를 만들면서 바로 이동하는 방법
git checkout -b enhancement/#1
2. 브랜치를 먼저 생성 후 checkout으로 이동하는 방법
git branch enhancement/#1
git checkout enhancement/#1
git log
- 커밋 확인하는 방법의 명령어

- 위 Log에서 표시된 "HEAD →" 의 의미는 현재 가리키고 있는 브랜치를 의미
- 그 뒤 "develop" 은 어느 원격 브랜치와 연결되어있는지를 표시
- ⭐HEAD 부분이 중요 (현재 로컬에서 어딜 가리키는지 중요)
협업에서의 코드 리뷰 및 Merge 과정
1) 개발: 팀원은 develop 브랜치에서 분기한 자신의 기능 브랜치(ex. feature/기능명 또는 feature/#이슈번호)를 생성
2) 개별 브랜치에서 기능을 개발하고 커밋
3) 푸시: 기능 개발이 완료된 후
git push origin feature/기능명
- 자신의 기능 브랜치를 원격 저장소에 푸시
4) Pull Request 생성: GitHub에서 자신의 기능 브랜치(feature/기능명)를 develop 브랜치로 병합하겠다는 Pull Request 생성
5) 자동화된 확인 (CI/CD): PR이 생성되면 설정된 CI 워크플로우가 자동으로 코드 빌드, 테스트, 린트 검사 등 수행
결과는 PR 페이지에 상태 체크(Status Checks) 로 표시
6) 코드 리뷰 (동료 검토): 팀원들이 해당 PR 페이지에서 코드 변경 내역을 확인하고 리뷰 댓글을 남기거나 수정 사항을 제안
필요한 경우 코드를 로컬로 가져와 테스트
7) 수정 및 업데이트: 리뷰를 통해 수정 요청이 있으면, 개발자는 로컬 기능 브랜치에서 코드를 수정하고 커밋한 후 다시 푸시
푸시하면 PR이 자동으로 업데이트되고, 자동화된 확인(CI)이 다시 실행
8) 승인 (Approval): 코드에 문제가 없고 리뷰어들의 요청 사항이 반영되었다면, 리뷰어들은 PR에 'Approve' 승인 클릭
9) 병합 조건 충족: Ruleset에 설정된 모든 병합 조건 (ex. 최소 승인 수 충족 (4명 이상), 모든 상태 체크 통과 등)이 충족
⚠️팀장의 경우 Bypass 권한을 설정하여 승인 수와 상관없이 바로 병합 가능
10) 병합 (Merge): 병합 조건을 만족하거나, Bypass 권한이 있는 사용자(ex. 팀장)가 'Merge pull request' 버튼을 클릭
11) 브랜치 정리: 병합이 완료되면 기능 브랜치는 더 이상 필요 없으므로 삭제
(GitHub 설정에서 PR 병합 시 자동으로 기능 브랜치 삭제 옵션을 켤 수도 있음
결론 : [기능 브랜치 푸시] -> [PR 생성] -> [자동 검증(CI)] + [동료 리뷰] -> [승인] -> [조건 충족 시 병합] 순으로 진행
로컬에서 직접 코드 리뷰
- 팀원의 기능개발 코드를 로컬로 가져와서 직접 테스트
- 해당 팀원의 기능 브랜치를 가져옴
# 기능 브랜치 : feature/#5
# 1. 원격의 최신 정보를 가져옴 (각자의 환경에서 생성되었던 브랜치가 가져와짐)
git fetch origin
# 2. 해당 팀원이 생성했던 기능 브랜치로 이동
git checkout feautre/#5
- 이렇게 checkout을 해보면 해당 팀원이 작성했던 코드의 브랜치로 이동하여 본인의 환경에서 로컬로 테스트할 수 있음
CI 구축하기

Google AI Studio
The fastest path from prompt to production with Gemini
aistudio.google.com
- 구글 AI 스튜디오 접속 후 에서 API Key 발급받기

- 발급받은 Google AI Studio API Key를 기억해놓기 (⚠️클라우드 저장 금지)
- Settings > Secrets and variables > Actions > "New repository secret" 버튼 클릭
- 이처럼 Github에 적절한 이름으로 API Key를 추가
코드리뷰 CI 파일 등록
- .github/workflows/gemini-code-review.yml
name: Gemini Code Review
on:
push:
branches: [ feature/gemini ]
paths:
- 'backend/**'
pull_request:
types: [opened, synchronize]
jobs:
code-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Node
uses: actions/setup-node@v3
- name: Install GoogleGenerativeAI
run: |
npm install @google/generative-ai
# PR 이벤트에서의 변경사항 처리
- name: Get git diff for PR
if: github.event_name == 'pull_request'
run: |
git fetch origin "${{ github.event.pull_request.base.ref }}"
git fetch origin "${{ github.event.pull_request.head.ref }}"
git diff --unified=0 "origin/${{ github.event.pull_request.base.ref }}" > "diff.txt"
echo "EVENT_TYPE=pull_request" >> $GITHUB_ENV
# Push 이벤트에서의 변경사항 처리
- name: Get git diff for Push
if: github.event_name == 'push'
run: |
git diff --unified=0 HEAD^ HEAD > "diff.txt"
echo "EVENT_TYPE=push" >> $GITHUB_ENV
# Gemini를 사용한 코드 분석
- name: Run Gemini-1.5-flash
id: gemini_review
uses: actions/github-script@v7
with:
script: |
const fs = require("fs");
const diff_output = fs.readFileSync("diff.txt",'utf8');
const { GoogleGenerativeAI } = require("@google/generative-ai");
const genAI = new GoogleGenerativeAI("${{ secrets.GEMINI_API_KEY }}");
const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash"});
// PR과 Push에 따라 다른 프롬프트 사용
let prompt;
if (process.env.EVENT_TYPE === 'pull_request') {
prompt = `Explain in korean. You are a senior software engineer and need to perform a code review based on the results of a given git diff. Review the changed code from different perspectives and let us know if there are any changes that need to be made. If you see any code that needs to be fixed in the result of the git diff, you need to calculate the exact line number by referring to the "@@ -0,0 +0,0 @@" part. The output format is \[{"path":"{ filepath }", "line": { line }, "text": { review comment }, "side": "RIGHT"}\] format must be respected.\n<git diff>${diff_output}</git diff>`;
} else {
prompt = `Explain in korean. You are a senior software engineer and need to perform a code review based on the results of a given git diff. Provide a detailed review of the code changes, focusing on code quality, readability, performance, and security. Format your response in Markdown with clear headings for each file reviewed.\n<git diff>${diff_output}</git diff>`;
}
const result = await model.generateContent(prompt);
const response = await result.response;
const text = response.text();
fs.writeFileSync('review_result.txt', text);
console.log('Review results saved!');
# PR 이벤트: 라인별 리뷰 코멘트 추가
- name: Format and add PR review comments
if: env.EVENT_TYPE == 'pull_request'
id: store
run: |
COMMENT=$(sed '/^```/d' review_result.txt | jq -c .)
echo "comment=$COMMENT" >> $GITHUB_OUTPUT
- name: Add Pull Request Review Comment
if: env.EVENT_TYPE == 'pull_request'
uses: nbaztec/add-pr-review-comment@v1.0.7
with:
comments: ${{ steps.store.outputs.comment }}
repo-token: ${{ secrets.GITHUB_TOKEN }}
repo-token-user-login: 'github-actions[bot]'
allow-repeats: false
# Push 이벤트: 액션 로그에 리뷰 결과 출력 및 아티팩트 업로드
- name: Display review results in workflow log
if: env.EVENT_TYPE == 'push'
run: |
echo "===== Gemini Code Review Results ====="
cat review_result.txt
echo "======================================"
- name: Upload review results as artifact
if: env.EVENT_TYPE == 'push'
uses: actions/upload-artifact@v4
with:
name: gemini-code-review
path: review_result.txt
🚀회고 결과 :
코드리뷰 과정을 협업을 통해 직접 경험해보고 팀원들과 적절한 규칙 및 기능 개발 분담을 수행해볼 수 있었음
CI 구축에 대해 더 공부해봐야겠다는 생각을 함
'Recording > 멋쟁이사자처럼 BE 13기' 카테고리의 다른 글
| [멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_108일차_"DB 마이그레이션 및 중간 피드백" (0) | 2025.12.06 |
|---|---|
| [멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_103일차_"Git Projects 이슈 관리 및 게시판 Board" (0) | 2025.11.18 |
| [멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_101일차_"2차 팀 프로젝트 : 공유 공간 매칭" (0) | 2025.08.19 |
| [멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_100일차_"2차 팀 프로젝트 시작" (0) | 2025.05.22 |
| [멋쟁이사자처럼 부트캠프 TIL 회고] BE 13기_99일차_"1차 블로그 프로젝트 마무리" (0) | 2025.05.22 |