쫑쫑JJONG
끄적끄적 오후5시37분
쫑쫑JJONG
전체 방문자
오늘
어제
  • 분류 전체보기 (198)
    • Paper Reading (5)
    • Math (5)
    • Data Science (13)
      • SQL (12)
      • Data Analyst (1)
    • AI Track (32)
      • CV (21)
      • CV Remind (2)
      • NLP (1)
      • AI Basic (8)
    • Python (1)
      • Basic (8)
      • Application (5)
    • Robotics (31)
      • ROS (15)
      • Collabot_proj (16)
    • NaverBoost Camp 4기 (45)
      • 부스트일지 (13)
      • [P stage] Image Classificat.. (4)
      • [P stage] Object Detection (12)
      • [P stage] Semantic Segmenta.. (6)
      • [P stage] Final Project (5)
      • CV (1)
      • DL BASIC (4)
    • Excel (1)
    • Git (8)
      • Git (8)
    • Network (3)
      • 통신 (3)
    • 코테준비 (14)
      • Programmers (11)
      • 기타 (3)
    • 환경설정 (19)
    • etc (7)
      • 활동 (2)
      • TIP (3)
      • 잡동사니 (2)
    • 금융관련 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 포트폴리오

인기 글

태그

  • transformer
  • 환경설정
  • 이고잉
  • error
  • python
  • Confusion Matrix
  • CV
  • 논문분석
  • Arduino
  • segmentation
  • Monte Carlo Sampling
  • mmdetection
  • N
  • collabot
  • robotics
  • GIT
  • SQL
  • diffusion
  • Data Scraping
  • ros
  • NLP

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쫑쫑JJONG

끄적끄적 오후5시37분

[Git] Branch와 3 Way merge
Git/Git

[Git] Branch와 3 Way merge

2022. 10. 19. 20:21
728x90

Do it 깃 & 깃허브 입문 이고잉 강사님 특강 2(1)

 

하... 카카오 억까로 인해 티스토리 글쓰기가 이제야 할 수 있네 ㅜㅜㅜ

​<목차>

2회차(1): 깃헙을 통한 협업 방법

1) 실험적인 작업 브랜치에서 커밋한다. (git checkout exp)
2) 마스터에서 작업을 한다. (git checkout master)
3) 마스터로 실험을 병합한다. (git checkout master && git merge exp)
4) 충돌 상황을 만들어 본다. (3 way merge의 개념을 활용한다)

 

​

 

git diff

전과 후로 뭐가 바뀐지 보고 싶을 때 (파일을 수정하고 add 하지 않은)

git diff

=> 이후 나올때는 esc

​

commit 할 때 마다 add하는 게 너무 귀찮을 때

git commit -a -m "work 3"

이렇게 하면 자동으로 add를 하면서 commit을 해준다

​

<tracked & untracked>

add가 한번이라도 되었으면 tracked

한번도 안했으면 untracked

 

하지만 위에 -a : 는 트랙되고 있는 파일에 대해서만 auto add가 된다

(즉 git commit -a 옵션은 tracked 상태의 파일만 커밋에 포함시킨다)

왜냐하면 자동으로 커밋하면 사고가 나는 경우도 있기 때문에 (파일에 비밀번호를 적은 경우)

​

​

add 의 3대 의미

 

1. 커밋 대기 상태를 만드는 것

2. untracked를 tracked로 만드는 것

3. 충돌이 해결되었다는 것을 git에게 알리는 것

 

<커밋하면 안되는 파일을 만들었다 가정> : password.txt

근데 git status 할때마다 추적하지 않는 파일 : password.txt 이거 뜨는거 빡친다고 ㄹㅇㅋㅋ

​

.gitignore 파일을 만들고 (저장하는 습관은 기르기) -> 저장안하면 밑에 실습 불가
.gitignore 파일 안에 password.txt 쓰기

그 다음

git add .gitignore 
git commit -m "password.txt to .gitignore"

이러면 git status 했을 때

git status

password 파일이 숨겨지는 걸 볼 수 있다

​

<Head 가 가르키는 master를 옮기고 싶을 때> : reset

 

checkout은 head를 옮기고

reset은 head가 가리키는 branch를 옮긴다

 

이러면 B가 사라짐

 

왜 Delete가 아니라 reset일까??

B를 복원할 일이 생길까봐 (git의 불변성)

 

reset B로 다시 master를 B로 옮겨주면

완벽하게 복원된다

git reset B
git reset B라고 하면 완벽하게 복원된다

 

* reset 은 master를 과거 (또는 사라졌던) 위치 어디로든 옮길 수 있다

reset과 함께라면 master는 어디든지 갈 수 있다

​

<실습>

work1.txt에 아무 문장을 추가하고
 
git commit -am "work 4"
 
work1.txt에 아무 문장을 또 추가하고
git commit -am "work 5"

 

git reset --hard f9457906

-- hard의 뜻이 뭘까?? 굳이 이해하지 않고 그냥 쓰기 (가성비 떨어짐)

 

나 work 5 다시 살리고 싶은데 어떻게 해야 할까?

git reflog

reflog를 통해 reset 하기 전의 아이디를 확인(아래 같은 경우 위에서 두번째 줄)

​

git reset --hard e8ac477

완벽하게 복원 될 걸 볼 수 있다

​

​

브랜치를 만들고 작업할 수 있도록 체크아웃

 

​

 
 
 

(첫번째) git branch exp

(두번째) git checkout exp

(세번째) commit 하고 새로운 버전을 만들 경우

​

<실습>

branch를 work5위에 만들기

 

​

 

이렇게 한 다음 exp2 를 checkout 해주면 되는데 이게 귀찮으면

다음과 같이 check out box에 체크표시를 해주면 된다

 

 

<터미널에서 하는 법>

git branch exp3 
git log --oneline --all 
git checkout exp3

위에 세줄 적는 것도 귀찮으면

git checkout -b exp4

​

<서로 다른 브랜치에서 작업하는 법>

exp 브랜치 : exp.txt 커밋

git checkout exp

exp.txt 라는 파일을 만들고 내용에 1이라고 작성

git add exp.txt 
git commit -m "exp 1"

커밋한 이후 exp.txt 파일 내용에 2이라고 추가 작성

git commit -am "exp 2"

​

master 브랜치 : master.txt 커밋

git checkout master

master.txt라는 파일을 만들고 내용에 1 이라고 작성

git add master.txt 
git commit -m "master 1"

커밋한 이후 master.txt 라는 파일 내용에 2이라고 추가 작성

git commit -am "master 2"

 

<해석>

master는 work 4 -> master 1 -> master 2 라는 작업을 했고

exp는 work5 -> exp 1 -> exp 2 라는 작업을 했다

또한 master 와 exp는 이 작업을 동시에 할 수 있다

git log --oneline --all

이렇게 하면 log을 볼 수 있지만 위에 같이 그래프 처럼 보고 싶을 때가 있음

 

<그래프 모양으로 보고 싶을 때 명령어 -- graph 추가>

git log --oneline --all --graph

​다 좋은데

git log ~~~~ 너무 길다 이거야

​

<사용자 정의 커멘드>

git config --global alias.mygraph "log --oneline --all -graph"

이러면

git mygraph 만 적어도 된다

git mygraph
 

 

위의 git graph와 유사한 출력을 볼 수 있다

​

<병합>

​

 

master가 exp1, exp2를 병합하고 싶을 때

(즉, 실험이였던 exp의 변경사항을 master에 가한다)

먼저 master가 수행하므로 checkout를 이동

git checkout master

병합하려고 하는 병합 branch에서 오른쪽 마우스 만들고 merge into current branch를 누르면

 

 

새로운 버전이 생김

 

 

merge 작업 이후

병합을 취소하고 싶으면 어떻게 할까??(그래프를 해석할 줄 알 면 된다)

master를 master 2로 보내면 되겠지

git reset --hard b5e28a46

​

<terminal 에서 하는 법>

git checkout master 
git merge exp

​

<만약 터미널이 켜질 경우>

편집 모드 : i를 누르면된다

터미널에서 나가는 법 : esc 누르고 wq(저장 및 종료)

​

​

<reflog 읽는 법>

reflog의 HEAD{@1} : 해드가 이전에 있었던 위치를 뜻한다

 

 

그래서 reset할 때

git reset --hard HEAD@{1}

이렇게만 적어도 된다

​

=========<위에는 서로 다른 파일을 병합하는 경우여서 충돌이 나지 않음>=========

​

<충돌(complete)이 일어날 때>

같은 파일을 수정한 다음 병합한 경우

master : common.txt

exp : common.txt

​

 
 
 
 

​

<초기 상태>

>

여기에 exp branch 만듬

 

git branch exp

 

master에서 m2를 수정하고 commit

 

 

commit 을 해서 새로운 버젼을 만들고

exp로 checkout

 

 

B2가 아니라 C1

exp에서 동일하게 진행해서

 

 

다음과 같은 상황 만들어 주기

 

 

여기에서 c1과 c2를 병합하면 어떻게 될까???

​

<실습>

common.txt를 만듬

 

start라는 이름으로 커밋

git add common.txt 
git commit -am "start"

 

이 상태에서 exp branch를 start로 옮겨주고 싶음

  1. head를 exp를 가르키게 한다
  2. 그 다음 reset을 이용해서 head를 옮겨줌
git checkout exp 
git reset --hard 2035739c
git checkout master

한 다음 두번째 줄 2를 m2 로 수정 하고 commit

 

git commit -am "m2"
git checkout exp
git commit -am "e3"
git checkout master
git merge exp

 

이런 경우는?

 

git checkout master
git merge exp

​

 

내가 m4, e4 어캐 고르라고 !!!! 너가 선택해줘 !! 충돌나 !!!

​

 

이때 git add를 통해 수정이 완료되었음을 알려줘야 한다

 

​

<3 Way merge>

 

다음 과 같은 상황 일때 첫째 줄은 1 이 맞는데

두번째 줄은 2 인지 m2인지 구분을 못함

​

그래서 Base 인 a 와 c1,c2를 비교 하게 된다

c2 -> 2를 수정 하지 않음 c1 -> 2를 m2로 수정

그러므로 수정한 걸 간택

둘다 바꾼 경우는 충돌

 

 

4개의 옵션 중에 자유롭게 선택

 

저장을 하고

git add common.txt 
git commit -a

 

하... 네이버 블로그에서 옮기는 거 생각보다 빡세네..

728x90
저작자표시 비영리 변경금지 (새창열림)

'Git > Git' 카테고리의 다른 글

[Git] 서로 다른 로컬저장소에서 서로 다른 파일을 수정  (0) 2022.10.24
2시간은 제발 이해하자  (0) 2022.10.20
[Git] 이고잉 강사님 특강 (1~2) 복습 & 정리  (0) 2022.10.20
[Git] Github를 통한 협업 방법  (0) 2022.10.20
[Git] Git의 기초 문법과 활용방법  (0) 2022.10.11
    'Git/Git' 카테고리의 다른 글
    • 2시간은 제발 이해하자
    • [Git] 이고잉 강사님 특강 (1~2) 복습 & 정리
    • [Git] Github를 통한 협업 방법
    • [Git] Git의 기초 문법과 활용방법
    쫑쫑JJONG
    쫑쫑JJONG
    connect : tmdwhd619@naver.com

    티스토리툴바