본문 바로가기
2222
Developer Camp[Fastcampus NKLCB] 2021.07/GIT

GIT/GITHUB(2)

by PARK TAE JOON 2021. 7. 23.

- branch 사용법

- branch 전략 : git flow

 

Branch

 

깃헙레포만들고 - 클론하고 

 

gitignore 역할

 

프로젝트, 프로그래밍 파일들을 실행하고자 할떄 생성되는 부산물(캐쉬 등)

이런것들을 미리 깃에 알려줘서 이런 종류의 파일들은 너가 트래킹 할 필요없다. 라고 알려주는 것.

 

vi .gitignore

# custom

.hidden/**
keyfile.pem
*.db
thumbs.db

맥 OS에서 finder로 한번이라도 그 파일을 열면 .DS_Store 생성되는데 이거 생성안되게 할 수 있다.
윈도우에서 thumbs.db 임시파일

esc- :wq

 

mkdir .hidden 만들고
touch .hidden/server.java를 만들어보자.
touch keyfile.pem
touch users.db
touch server.java

 

gitignore.io에 가면

OS별로 .ignore 자동으로 세팅해서 생성해줘서 복사해서 쓰면된다.

https://www.toptal.com/developers/gitignore

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

 

생성 - 복사해서 붙여넣기하면 끝.

 


git commit을 하고 환경설정을 한거니까

 

 


Branch

분기점을 생성해서 독립적으로 코드를 변경할 수 있게하는 모델

 

> git branch

* main

내가 지금 main브랜치 위에 있다는 것을 알 수 있다.

 

> git branch {branchname} // branch 만들기
> git branch // branch 확인하기

* main
  print-hello

 

git lg.

ex) 금방 hello.py파일을 하나 만들어뒀으면

create: hello.py가 있을건데

똑같은 공간이 복제되는 것.

 


자 이제 평행우주를 건너가보자.

원래는 checkout. 지금은 switch를 쓴다. git 최신버전은 그렇다. 

(구버전은 git checkout print-hello)

 

checkout => switchrestore로 바뀌었다. (몰랐다. 충격적이다.)

 

vi hello.py

> print('hello');

 

python hello.py

 

분기점을 우리가 생성한거고 독립적으로 한다는걸 이제 해보자.

 

git switch main

python hello.py 해보니까

전혀 안뜨고 cat hello.py 해보니까 전혀 안뜬다.

 

(이런식으로 따로 작업하고 merge하는거다.)

 

printhello 에서 수정한 python파일을 main브랜치로 병합해보자.

( 지금 main위치에서 branch를 땡긴다라고 생각하면 된다.)

 

병합되야할 main으로 와서 땡겨온다.

 

이제 사용했던 print-hello python을 쓸 필요가 없다. 지우는게 맞다. 라이프 사이클이 끝난건 그 때 그때 정리해야 한다. 나중에 필요하면 또 생성해서 하면 된다.

 

브랜치 지우기 : git branch -D print-hello

상태 항상 확인하기 : git branch

 


다시 만들어보자.

> git branch for-loop

> git branch

 

이 때 for-loop의 hello.py상태는 어떨까?

> git switch for loop

> print hello.py

hello.py

 

hello.py에 loop만들어보자.

> vi hello.py

for _ in range(1, 10+1):

    print('hello')

 

성공적으로 동작하고 add와 commit을 하지 않고 branch를 switch로 main으로 갈아타려고 한다면?

 

> git switch main 하면 되긴 된다. 근데 작업한 내용이 불안정한 상태에서 갈아타버리면 안된다.

 

나중에 가면 알겠지만 main에서 작업하면 절대 안된다. 

 

* 작업을 마무리 짓고 이동하던지

포기하고 이동하던지

둘중 하나 택해야 한다.

 

다시 for-loop로 돌아가서 add, commit해주자.

git switch main 꼭 갈아타고

git merge for-loop

왜 1 deletion, 2 insertion일까?

git들어가서 확인해보면 

 

이렇게 되어있는데 이건 삭제되고 더해졌다는 것을 나타내는 것이다.

인간의 사고방식으로는 줄 이동이라고 생각할 수도 있지만 아니다.

 

이러한 문제로 나중에 개발할 때 라인이동은 최대한 안하는 것이 좋다.

- 된거보고 이 기능이 지워진건가? 라고 착각할 수 도있기 때문.

 

+ git은 문장의 일부만 바뀌어도 해당 줄 전체가 바뀌었다고 인지한다.

 


잠시 팁! 묶음 자료형을 표현할 때! 2가지 팁

1

예를들어 python 에서 리스트를 작성할 때 animals = ['dog'] 이렇게 쓰면 안된다.

왜냐?

 

로그를 확인할 때 dog뒤에 rabbit이 붙으면 줄 전체에 대해 적용되기 떄문이다.

 

그래서 아래와 같이 작성해야 한다. 

animals = [
    'dog',
]

 

- 묶음 자료형은 줄 바꿈으로 해서 정리해라!

- 콤마를 마지막에 달아라!

 

--------------------------------------

테스트해보기 위해서

 

git add

git commit

다시 push를 하지 않고

git add

git commit

그 후 push 해서 commit 두 가지를 한번에 볼 수도 있다.

 

2

 

콤마를 미리 안찍어두면 다음 요소를 추가할 때 이런식으로 -되고 +된 것처럼 나온다. 난 콤마만 찍었을 뿐인 'dog'행도 지워졌다가 생성된 것처럼 보인다. 트레일링콤마.

 


practice(1)

(insights - network에서 그래프로 나온다.)

 

spiderman.md 파일을 만들고  

각 브랜치에서 내용을 추가해라.

commit 3번, 2번, 5번 해야된다.

 

지금 레포에서 한다.

forloop 지우고

 

https://github.com/ulgoon/nklcb-git/blob/main/handouts/git(2).pdf

 

https://github.com/ulgoon/spiderman-timeline/network

 

 

git branch {브랜치명}

git branch

git switch {브랜치명}

 

vi spiderman.md - 수정

git add ./spiderman.md

git commit -m 

 

여러번하고

 

git push -u origin TobeyMaguire 후에

 

git siwtch main

git merge Tobey---------

 


난 왜 1열로 쭉 보일까?

그것에 대해 테스트해보자.

main에서

cat hello.py

git branch if-hello

git switch if-hello

vi hello.py 하고 아래와 같이 변경해주자.

```

animals = {

    'hamster',

    'rabbit',

    'dog',

}

 

for i in range(1, 10+1);

    if(i%3==0):

        print('hello')

    else:

        print(i)

```

 

git push -u origin if-hello

git switch main

 

main에서 또 5의배수일 떄 출력되도록 hello.py 수정해주고

add, commit, push해줬다.

 

지금 뭘한거냐면

branch를 수정하고 main도 수정한 상태에서 merge를 할 때 어떻게 다른 것인지 보려는 것이다.

 

위 스파이더맨 예제에서는 main은 두고 branch만 계속 수정했었다. 그리고 merge를 했었다. 즉,

아래와 같이 위는 main 아래는 branch. 마지막에 merge다.

 

근데 지금 main도 수정하고 branch도 동시에 수정했다.

위는 main 아래는 if branch다. 위는 5의 배수 아래는 3의 배수.

깨알 중간 팁!

git commit -m 을하고 "을 안닫고 밑에 계속 행바꿔서 쓰다가 만약 위를 수정하려고 하면 돌아갈 수 없다.

그래서 git commit을 쓰고 커밋을 쓰는 것이 좋다. 이 습관을 먼저 들이는 것이 좋고 내용을 충실히 쓰는 연습을 하는것이 좋다.

 

 

 

다시 이어서 하자.

main에서 git merge if-hello

오류가 뜬다.

> git status

both modified: hello.py

git이 난 모르겠으니 니가 알아서해라.라고 떠넘긴 것. 우리는 중재를 해줘야 한다. 

 

> vi hello.py

<<<<<<< HEAD 최신 브렌치

 

========== 위나 아래를 지우거나 조합을 하면 된다.

이거를 합쳐보자.

행에서 dd : 잘라내기, p : 로 붙여넣기 

D12J??? 아래로 12줄을 지워라.

 

i를 3으로 고쳐라.

꺽쇄 다 지워줘야 한다.!

 

esc :wq

 

실행해본다.

python hello.py.

우리가 원하는데로 작동을 안한다.

잘못쳤다 중간에 if를 elif로 해줘야 한다.

 

git status

아직도 merge가 해결된 것은아니다. 즉 합의는 했는데 이행(merg)은 안한거다.

 

git add hello.py

git commit했떠니 ?!아래와같이 나온다.

제목이 정해져있다!

어떻게 했는지 커서 위치에 설명하면 된다.

 

애니멀스 리스트를 지우고 j변수를 만들고

 

remove animals list

j for inner variable,

print hello if j is times of 3

print world if j is times of 5

print j for else.

 

git status

이제 merge가 완성된것을 볼 수 있따.

 

git push origin main

이제 insigts - network 로 나누어져 있는 것을 볼 수 있다.

 


git flow를 많이 쓴다.

main 브랜치와 devleop 브랜치.

feature따서 작업하고 devleop에 집어넣고.

상급자가 : release해도 되겠네  > main으로

 

만약 버그가 발생하면? main에서 hotfix따서 변경하고 바로 수정하고.

 

근데 이 브랜치는 5개나 된다.

 

github flow

main에서 feature따서 작업을 하고 반영하는데 하나하나가 다 deploy. 

개발사이클이 길면 불리하다.

 

gitlab flow

 

 

! 요즘은 프론트와 백엔드를 따로 레포를 만들어서 쓴다.

 

 

 

macos는 git flow를 설치해야 한다.

설치링크

https://danielkummer.github.io/git-flow-cheatsheet/index.ko_KR.html

 

git-flow cheatsheet

 

danielkummer.github.io

iterm에서 설치하기 : brew install git-flow-avh

 

main을 제외한 나머지 브랜치들을 일단 다 지워줘라. main 만 남게.

git branch -D {브랜치명}

 

터미널을 혹시모르니까 지웠다 키자.

 

git flow치면 아래같이 쓸 수 있는 커맨드들이 떠야 한다.

https://danielkummer.github.io/git-flow-cheatsheet/index.ko_KR.html

 

git-flow cheatsheet

 

danielkummer.github.io

페이지 쭉 따라가면서 공부할 수 있다.

 

develop으로 와있으면 성공.

 

이 부분을 실험해보자.

 

15의 배수일 때 helloword 를 출력하는 걸 git flow를 사용해서 해보자.

> git flow feature start helloworld

 

> git branch.  // 브랜치 이름이 feature/helloworld 가 됬다.

 

> vi hello.py 를 열어서 아래와 같이 코드를 고쳐준다.

 

python hello.py 잘 출력되는 지 확인하고

 

git status

git add hello.py

git commit 들어가서 커밋쓰기.

"feat: print helloworld if i is times of 15"

 

> git flow feature finish helloworld

 

start와 finish를 사용함으로서 ~뭐하고 머지하고 다 이런과정을 생략하고 두 단계로 만들어준다.

 

git branch 해보면 deveolop, main만 남아있다.

python hello.py

피즈버즈라고 부른다. 면접볼 떄 많이 쓰신다고 한다.

 

! 충돌이 있으면 멈추고 그거 해결하세요 하고 ...

 

 

이제 develop이 끝난거고 release를 시작해보자.

git flow release start v1.0

 

버전에 대해 설명

v1.11.5

5는 아주 마이너한 패치. 버그픽스급.

11은 메이저한 기능이 추가.

맨 앞 숫자는. 거의 리비전급 코드개선 일어날 때.

 

git branch로 확인해보면

release 브랜치가 있는 것을 볼 수 있다.

 

javascript 등 release에서는 읽기 어렵게 만든다.  보기 쉽게하면 어떤 문제점이 있느냐?

 

개발자모드에서 javascript 함수명을 확인하고

console.log에서 엔터엔터하면 searchBoard를 입력하면 js코드를 볼 수 있다.

 

여기서 작업이 다 끝나면

git flow release finish v 1.0.0

엔터를 치는 순간 

 

첫번째 vi창이 뜬다. merge commit이다. main 브랜치로 들어가는 것.

merge conflict를 해결하느게 아니라면 그냥 :wq해서 넘어간다.

 

두번째 vi창이 뜬다. v1.2 얘에다가 태킹을 하는거다. 여기는 중요하다.

패치노트가 되는 것이다.

여기 작성한 것을 기획자들이 이걸 참고해서 사용자들에게 보여준다.

``` 내용

helloworld statements has finished

 

helloworld is simillar to fizzbuzz

 

while j is go up from 1 to 16.

print hello if j is times of 3.

```

:wq

 

세번쨰 커밋창(vi창이 뜬다)

deveop에게 넘겨주는 것이다.

얘도 머지커밋이라 저장하고 넘어가준다. 끝.

 

자 이제 3번 푸쉬해야 한다.

1.  git push -u origin develop

2. git switch main > git push origin main. (이전에 푸쉬한적있으니까 -u 뺸다.)

3. git tag  // 네이밍한 버전이 나오면 잘 된 것. 이 태그도 푸쉬해줘야 한다. v1.0.0이 나올 것.

3. git push --tags

(얘는 깃헙 홈페이지 - 가운데 tags 누르면 나온다.)

 


실습하기 전에 

되돌리는 거 먼저 하고.

개인 프로젝트에 git flow 적용 실습.

다음 협업.

 

1. 저장소에 있는 파일 이름바꿀 때 (git mv 파일명 바꿀파일명)

 

1. git switch develop

2. mv hello.py helloword.py 이렇게 하면 연속성이 끝나고 끊어진다. (이력이 단절되버린다. 깃으로 해야 이력이 안끊긴다.)

이럴 때는 mv helloworld.py hello.py 로 다시 돌려줄 수 있다.

 

그럼 어떻게 하느냐?

git mv hello.py helloword.py

그 다음은 바로 커밋하면 된다.

git commit

 

2. 최신 커밋으로 되돌리는 방법 ( git restore 파일명)

수정했는데 최신 파일로 되돌리고 싶다.

git checkout -- helloworld.py

 

모든 파일을 돌리고 싶다.

git checkout -- .

 

checkout이 안되면 restore라고 하면 된다.

git restore helloworld.py

git restore .

 

3. staging한 파일이 있을 때 stage로부터 내리는 방법 (git reset HEAD 파일명)

다시 파일을 수정하고 나와서 git status

 

git add helloword.py

git status

 

git reset HEAD helloworld.py

git restore -- helloworld.py (다시 최신 커밋한 상태로 돌린다.)

 

❌ 커밋 자체를 지우는 것은 불가능하다. 하지만 메타데이터를 수정할 수는 있다.

직전 커밋에 대해서 해보자.

git log 제일 위를 보자. 이게 최신이다.

 

git commit --amend : 직전 커밋 내용이 불러와진다. 내용만!

수정하면 된다. 그리고 다시 git log.

(직전 내용뿐만 아니라 그 전 커밋들도 내용 수정할수는 있지만 이런 상황을 안만드는게 중요하다. 하는 방법은 있다.)

 

만약에 이미 push를 했다면 충돌 발생된다.

 

git push -f origin main (-f 붙이면 내가 하는게 맞아 하면서 올릴 수는 있으나 맞는 방법인지 모르겠다. 모든 것을 무시하고 반영한다. 매우 위험!)

 

push를 하기전까지는 모든지 할 수 있다. 신중히 push하자.

 

강사님이 말씀하시는건 잘못했으면 다음 커밋에서 수정했다고 올려야지.(뒤늦게 알아도)

이전것을 바꾸는 것은 아니라고 생각한다.

 

커밋을 취소하는 방법

이 방법은 사용하지 않는 것을 권유한다.

푸쉬하기 전에는 해도 된다.

> git reset --hard HEAD~{개수}

 

지울 커밋을 푸쉬하지 않았다는 가정하에!!!!!

지우는 커밋 중에 한번이라도 push했던 내역이 있다면 안된다.

만약 다른사람이 이 코드를 가지고 있었다면 나중에 서버에 올라가있는걸 pull하면 살아돌아온다.

 


다시 3개를 만들고 3개를 커밋한다. 아래처럼

touch g1.md

git add g1.md

git commit -m "feat : add g1.md"

 

만약에 push를 했었다???? git revert

git revert하고 했단

git revert --no-commit HEAD~3.. // 직전 3개 되돌리고 내역을 커밋하나만 찍겠다. 라는 의미.

원래 revert는 하나 되돌리고 하나 되돌렸다고 기록하고 반복해야 한다.

 

--no-commit 하면 n번해도 되돌렸단 내역을 한번 찍을 수 있다.

 

>>> commit은 있는데 파일은 없다. 이 기록은 남기는 것.

내가 만들었었는데 잘못생각했어. 없던일로 할께. 라고 사과의 편지를 쓰는 것과 같다.

 

git status해보면

git commit 엔터 하면 메세지가 이미 적혀있다.

내용에다가 왜 되돌렸는지 내용을 적어주면 좋다.

 

These file were useless for this project. 

얘가 의미없는 파일들을 커밋했었구나 할 것.

 

지금 develop 레포니까

 git push origin develop

 

github에서 log를 봐바라. 로그가 남았고 마지막에 사과하는 커밋까지 남는데 아까 reset한건 없다.

 

rebase라는 방법을 쓰면 merge를 기록 안할 수도 있다. 근데 상관에 따라 다를 듯.

 


github페이지 - issue

https://github.com/joker77z/branchPractice2/issues

 

GitHub - joker77z/branchPractice2

Contribute to joker77z/branchPractice2 development by creating an account on GitHub.

github.com

 

여러명이 개발할 때 내가 지금 뭐하고 있고 다음에 뭐할꺼고 어떤게 남았다. 라는걸 기록해야 큰 도움이 된다.

기타 review받아야 할 일, 커뮤니케이션이 필요할 때 쓴다.

 

새로운 이슈를 만들어본다.

New issue

 

커밋은 영어로 쓰는 것이 중요하나 issue에서는 커뮤니케이션이 우선이기 때문에 한글로 써도 된다.

 

issue쓰고

labels달 수 있고

issuses 바로 눌렀을 때 milestone 등록해놓고 issue 글안에서 milestone 등록할 수 있따.

 

이거를 도식화 한게 프로젝트

automated kanban

 

issue에 쓴 게 자동으로 우측하단에 있는 것을 볼 수 있다. 이거를 끌어다가 놓을 수 있다.

 


개인프로젝트 시작.

1. 레포만들고

2. git flow적용하고

3. issue, project + project 카드.

3. fibonacci.py

 

정리하면

1. git flow init해서 develop branch 만들어지게 하고

2. develop으로 이동되게 git switch develop

3. git flow feature start {기능이름}

4. 코딩한다. vi {파일이름}

5. 잘되는지 확인하고 git status, git add {파일이름}, git commit {내용쓰기}

6. fit flow feature finish {기능이름}

 

릴리즈

git flow release start {릴리즈 이름}

git flow release finish {릴리즈 이름}

 

자 이제 3번 푸쉬해야 한다.

1.  git push -u origin develop

2. git switch main > git push origin main. (이전에 푸쉬한적있으니까 -u 뺸다.)

3. git tag  // 네이밍한 버전이 나오면 잘 된 것. 이 태그도 푸쉬해줘야 한다. v1.0.0이 나올 것.

3. git push --tags

(얘는 깃헙 홈페이지 - 가운데 tags 누르면 나온다.)

 


협업

본 코드와 관련 없는 사람한테 manage access에서 콜라버레이터를 추가한다.

협업할 때 자기꺼처럼 막 push할 수 있기 때문에

 

fork and merge 방법

1팀장님

1. 팀장이 새로운 레포를 만든다. + readme만 만든다.

2. 본인 주소 복사해서 dev에서 클론

3. 일단 develop을 만들어놔야 한다. git flow init (자동으로 develop 생긴다.)

git branch에서 확인한다.

4. git push -u origin develop

깃헙페이지에서 레포지토리 devleop 생긴거 확인하고 팀원에게 주소 넘긴다.

 

팀원

1. 그 페이지 들어가서 develop있는거 확인하고. 우측 상단 Fork 누르고 포크뜬다.

2. 콜라보레이터를 갖지 않아도 여기다가 자유롭게 작업한 결과물을 팀장한테 적용해주세요. pull requests를 하면 된다.

> git clone 으로 가져오고 해당 위치에서 git flow init (각자 다 해야한다.)

3. 세팅끝!

 

팀원이 팀장 레포로 방문해서 issue를 쓴다. new issue.

제목
proposal: lets do fizzbuzz

내용
제가 fizzbuzz 구현하겠습니다.

팀장은 issue를 보고 write에 confirm - Assign에 그 사람 할당해준다. / label도 달아줘야 한다.

프로젝트도 만들어놓고 관리한다.

 

컨펌받은 팀원 기능개발 시작.

git flow feature start fb-if-for
----------------------------------
touch fizzbuzz.py

git add fizzbuzz.py
git commit > feat: create fizzbuzz.py

코드 수정한다. 프린트문만 나오게.

git add fizzbuzz.py
git commit m > "feat print all numbers"

코드 수정한다. 조건문 수정

git add fizzbuzz.py
git commit m > "feat: print fizz"

코드 수정한다. 3으로 나누는거도 추가한다.

git add ~~~~
got commit m > "feat: fizzbuzz done"

-----------------------------------
git flow feature finish fb-if-for

devlop에 있는 걸 팀장의 develop으로 반영해주세요 요청해야 한다.

git push -u origin develop

내 레포지토리 - fork한 레포가면 가운데에 뜬다. 버튼 누른다.

내용에 어떤 이슈에 대한 해결책인지 링크를 걸어준다.

resolved : #1

 

팀장 승인 거절 가능

팀장 pull requests 커밋들을 확인한다. file changed보고~ 문제가 있을 땐 코드에 +눌러서 변경 가능.

request change > submit review 할 수 있다. 팀장은 무조건 딴지를 걸어라.

 

만약 if문 하나로 고쳐달라고 했으면 고친다.

git add fizzbuzz.py
git commit m "feat fizzbuzz with 1 if done"
git push origin develop

이렇게 하면 알아서 간다.

 

팀장 승인해준다. well done! resolve처리하고 [confirm merge] 

이러면 fizzbuzz.py가 들어온다.

 

나머지 팀원

받아야 한다.

 

git remote -v 로 확인하고

git fetch upstrem develop 으로 가져와야 한다. (없을 때 git remote add upstream {팀장 레포주소})

git merge FETCH_HEAD

 

팀장이 직접 코드올릴 때는 git fetch origin develop

'Developer Camp[Fastcampus NKLCB] 2021.07 > GIT' 카테고리의 다른 글

git(2) 내용 정리  (0) 2021.07.23
GIT/GITHUB(1)  (0) 2021.07.14

댓글