[Upstage AI Lab] Git

라을·2024년 8월 8일

Upstage AI Lab

목록 보기
10/28

현재 V2라는 폴더가 있다고 했을 때

  • Reset : V2 폴더 삭제
    • 용량, 복잡 ↓
    • 히스토리 X

  • Revert : V3 폴더 생성
    • 용량, 복잡 ↑ ↓
    • 히스토리, 불변 O

  • 충돌해결

<회원가입.txt in EX06 folder>
terminal에
$ git commit -m "회원가입"

<로그인.txt in EX06 folder>
$ git add .
$ git commit -m "로그인"

branch를 만들고 checkout하기

<Git Graph"> 에 들어가서
$ git checkout -b topic
이렇게 하면 branch를 만들면서 checkout을 한 번에 한다

<로그인.txt>를
"--------
로그인 버튼
--------"
으로 수정한다

그 다음 터미널에서
$ git commit add .

$ git commit -m "로그인버튼"

main으로 이동하기 위해
$ git checkout main

그러면 로그인.txt에 아무것도 없는 상태가 됨
이번에는 로그인.txt를
"---------
로그인 체크박스
------" 로 수정한다

$ git add.

$ git commit -m "로그인 체크박스"

그런다음 다시 graph를 봐보자

충돌

같은 파일을 두 명 이상의 사람이 변경을 할 경우, 변경사항의 순서나 선택을 Git은 스스로 하지 못한다. 이럴 때 충돌이 발생하고 사용자가 직접 충돌을 해결해줘야 한다

어떤 변경사항을 선택하고, 어떤 순서로 변경할 것인지 마음대로 바꿔도 괜찮을까? 절대 아니겠죠~

topic branch를 관리하는 개발자와, main branch를 하는 개발자와 소통을 통해 정해야한다

충돌 상황을 재현해보자

위의 상황에서
$ git merge topic을 해보면 충돌이 발생한다

그럼 충돌을 "fix"하고 "commit" 해야한다

5번을 찾아야 한다 (원래 ========가 있었음)

두 개 다 사용을 한다고 하면 다음과 같이 수정할 수 있다

$ git add .
$ git commit -m "충돌해결"

을 진행해주면 merge가 완료된다!

$ git checkout topic을 해보자
로그인.txt는 "로그인버튼"이라고 되어있고
$ git checkout main을 하면
"로그인체크박스 \n 로그인버튼" 이라고 되어있을 것이다

reset

$ git log
$ git reset --soft a084를 하면
a084가 지워지고

$ git commit -m "로그인버튼"
을하면 수정이 된다

근데 reset을 하고 다시 commit을 해야 하니 복잡할 수 있다

이때 amend를 사용하면 더 편리하다!

$ git commit --amend -m "로그인버튼444"

을 하면 마지막 로그를 쉽게 변경할 수 있다

정리를 해보자면,,,,
1. Merge 충돌(3 way일때만)

  • 직접 해결 (커뮤니케이션)
  • 해결후 add, commit
  1. 마지막 로그 변경
  • soft reset
  • commit --amend

실습

topic3 -> f3의 내용을 30000원
topic4 -> f3의 내용을 33000원

-> topic3 먼저 merge하고 (main)
-> topic4 후에 merge하면 (충돌)
-> 해결 (commit명 충돌해결)

-> git commit --amend -m "충돌해결"


풀이

  1. 5개 파일 생성(f1~5.txt)

$ git commit -m "init"

  1. checkout하기
    $ git checkout -b topic1
    이렇게 하면 topic1이 생성됨

$ git checkout main
해서 main으로 돌아오기

$ git checkout -b topic2

  1. topic1에서 10000원으로 수정
    $ git checkout -b topic3

해당 브랜치 안에서는 그 브랜치 삭제 불가
$ git checkout topic1
$ git branch -D topic3
로 진행해야 한다

rebase

EX07 folder 생성
A.txt

$ git init

$ git add .

$ git commit -m "A"

  • B 만들고 branch D로
    $ git add .
    $ git commit -m "B"

$ git checkout -b topic

  • D.txt 만들고
    $ git add .

$ git commit -m "D"

  • E.txt 만들고
    $ git add .
    $ git commit -m "E"

  • main 으로 돌아가기
    $ git checkout main

  • C.txt 만들고
    $ git add .
    $ git commit -m "C"

📍 1. 가지(branch) 선택 기준
어떤 로그를 뒤에 둘 것인가!

📍 2. 뒤에 둘 가지로 이동
rebase 하기

$ git checkout topic

$ git rebase main

실습

  • A.txt 만들고
    $ git init
    $ git add .
    $ git commit -m "A"

  • B.txt 만들고
    $ git add.
    $ git commit -m "B"
    $ git checkout -b topic (topic만들면서 main에서 topic으로 이동)

E.txt 만들고
$ git add .
$ git commit -m "E"

$ git checkout main (main으로 이동)

  • C.txt 만들고
    $ git add .
    $ git commit -m "C"

  • D.txt 만들고
    $ git add .
    $ git commit -m "D"

  • topic로 이동
    $ git checkout topic
    $ git rebase main


Github

$ git init

$ git remote add origin "url"

$ git pull origin main


협업 과정을 고려해보자
한 명이 topic1을 만들고, 다른 한 명이 topic2를 만든다고 생각해보자

가장 안전한 방법은 동기화를 먼저 하는 것이다!
왼쪽을 A, 오른쪽은 B라고 하면,

A는 다음 절차를 거쳐야 한다
1. main 다운 (pull)
2. topic1 -> rebase
3. topic1 -> push

이렇게 하면 Github에 topic1 stream이 생기고 init, 아이디중복체크가 올라온다

B는

  1. main branch를 pull을 먼저 한다! (fast forward merge)
  2. topic2에서 rebase
  3. topic2를 push


실습

EX11 folder 생성

$ git init

$ git add .

$ git commit -m "init"

github에서 repository 생성하기
url 복사

$ git remote and add origin "url"

$ git push origin main
$ git checkout -b topic1

$ git checkout -b topic2

그럼 Git Graph가 이렇게 된다

$ git checkout topic1

파일 회원가입.txt 생성하기

$ git add .

$ git commit -m "회원가입"
$ git checkout topic2

파일 글쓰기.txt 생성하기

$ git checkout -b topic1

$ git checkout -b topic2

이제 topic1에서 push 해보자

$ git checkout topic1

$ git checkout main

$ git pull origin main

$ git checkout topic1

$ git rebase main

$ git push origin topic1

topic1을 main에 합치고 싶다면 create pull request 버튼을 누른다 in Github

메시지를 적어 요청하면 된다! 그럼 main branch를 만든 팀장이 확인할 것이다

팀장은 요청이 들어오면
"merge pull request" 버튼이 있을텐데 3가지 옵션이 있다

  • squash and merge : 비추
    • 각 개발자가 로컬에서 squash를 하고 push를 할 것!
  • rebase and merge : 역시 비추
    • 만약 먼저 pull을 했다면 이미 각각 업데이트/동기화가 되어있는 상태있을테니 불필요! rebase하다가 충돌나면... no dap

동기화 : $ git pull origin main

$ git checkout topic2
$ git rebase main


SSH

RSA 공개키를 사용하면 A,B에서 공개키와 비밀키를 각각 만들어 쌍을 만든다

A공개키로 open하면 A비밀키로 close, vice versa가 가능해진다

비밀키를 사용하면 전자서명 역할을 하게 되고, 공개키를 사용하면 암호화 역할을 한다

프롬프트 창을 열어보자

1. 공개키 / 비밀키 생성

$ ssh-keygen -t rsa -C "github url"
rsa): 저장경로작성 ex. c:\users\Desktop\gitprac

2. Github에 공개키 저장

이러면 공개키와 비밀키가 생성되는데, 이 공개키를 github에 저장해놔야한다!

github > setting > SSH and GPG keys

로 들어가서 공개키를 복사해서 저장해주면 된다

3. 생성된 키 자동 push setting > config 파일 생성

공개키/비밀키가 생성된 폴더에 "config" 파일 생성한다

그 다음 다음과 같이 작성한다

Host github.com-codingspecialist
HostName github.com
User codingspecialist@naver.com
IdentityFile ~/.ssh/codingspecialist

Host github.com-본인 아이디
HostName github.com
User 유저네임작성
IdentityFile ~/.ssh/flutter-coder(레포지토리명)

4. SSH agent 실행

5. SSH 등록

Powershell을 실행한다

cd .ssh
ssh-add codingspecialist
ssh-add flutter-coder

6. SSH 테스트

github url (ssh) 복사

vscode로 들어가서

$ git remote add origin "url"인데

url이 git@github.com-@로 되어있다면 중간에 공개키/비밀키 설정했을 때 사용했던 아이디명을 작성해주면 된다

브랜치를 생성하고 rule을 설정할 수 있는데 "requrie approvals"를 1로 설정! 이건 한 명이 승인해야 merge가 된다는 말. 2로 하면 2명이 모두 승인을 해야하기 때문에 불편할 수 있다

업로드중..

브랜치 dev를 만든 후에 topic/write 브랜치를 생성했다면, topic/write에서 수정한 내용을 바로 push하면 안되고 dev에 있는 내용을 동기화를 먼저한다음 rebase dev를 한 후, topic/write를 push하면 된다

팀장은 github > pull requests를 눌러 commit > review change > Approve > submit merge를 하면 merge가 가능하다!

자세한 내용은 유튜브 강의에서 확인 가능하다

https://www.youtube.com/watch?v=PMm3_PTyVas&list=PL93mKxaRDidFtXtXrRtAAL2hpp9TH6AWF&index=36

(본 포스트는 정리가 되기 전으로 날 것의 notetaking입니다)

profile
욕심 많은 공대생

0개의 댓글