Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[Git, GitHub] 입문 본문

Etc

[Git, GitHub] 입문

JH_Lucid 2021. 12. 3. 21:43
1. 커밋한다(commit)
  • 게임의 세이브 포인트와 동일하다. 언제든지 저장 시점으로 돌아갈 수 있다.
  • 커밋을 하려면 저장을 원하는 파일을 묶어서 커밋 명령을 수행하면 된다.

 

2. 스테이지에 올린다(add)
  • 앞서 커밋하기 전에 저장을 원하는 파일을 묶는 일을 해야한다고 했다.
  • 이 작업을 스테이지에 파일을 올린다 라고 한다.

 

3. gitHub에 업로드(push)
  • 커밋을 하면, 현재 작업 내용의 세이브 데이터가 내 컴퓨터에 저장된다.
  • 이를 원격 저장소에 올리는 것을 push라고 한다.

소스 트리 사용
  • 강의에서 소스 트리를 사용해서, 편하게 사용해보고자 예전에 깔았던걸 써보는 도중.. mac에서 login 관련 bug가 있음
  • 로그인이 정상 동작 안하고, CPU 사용량이 엄청 증가한다.
  • 아직 해결 안된 것 같다.

 

변경사항 취소하기
  • checkout을 통해 브랜치 또는 커밋으로 돌아갈 수 있다.
  • sourceTree의 코드뭉치 버리기를 통해 변경사항을 되돌릴 수 있다.

 

pull 및 충돌 해결하기
  • 현재 브랜치 : HEAD
  • origin/master가 로컬보다 더 빠를 경우 pull 먼저 진행
  • pull = fetch + merge
  • 충돌의 발생 원인 : 자동 병합 실패했을 경우 발생, 겁내지 말자.

 

해결방법

1. ide에서 수동으로 에디터를 이용해 HEAD, branch 부분을 지워서 해결하는 방법

2. main 브랜치꺼를 사용하는 방법 

3. 반대쪽 브랜치꺼를 사용하는 방법

 

 


 

이전 커밋으로 되돌리기 - Reset
  • reset(이 커밋까지 현재 브랜치를 초기화) - soft, mixed, hard -> hard가 되돌리기이다.
  • 원격에 없는 내용을 reset하면, reset 전 내용들이 모두 지워질 것이다.
  • main과 원격의 내용이 다르므로, 강제 push가 필요하다.(git push --force)
  • 강제 push 대신에는? (sourceTree에서 push 지원 x)
    1. origin/master를 먼저 merge 한다. 충돌을 해결한다.
    2. 그리고 push를 한다.
    3. 브랜치, revert, rebase를 사용하는 방법도 있다. 

 


이전 커밋으로 되돌리기 - 브랜치 이용(추천하는 방법)
  • 쉽지만 트리가 지저분해진다.
  • reset과는 달리 내용이 사라지지 않는다.

 

 

1. 새로운 브랜치 생성

  • 현재 로컬이 원격보다 한 커밋 앞서있는 상태이다.
  • 이 상태에서 되돌리기 원하는 위치에 update-branch를 생성한다. 
  • 추가로 master와 원격을 동기화 하기 위해 Master push를 진행했다.

 

 

2. 새로운 브랜치에 커밋 추가

  • master push를 했다.
  • 커밋을 추가했다.

 

3. update-branch merge

  • 충돌이 발생할 것이다.
  • update 내용('저장소'것)을 사용해서 해결을 누르고 merge를 진행한다.
  • 충돌 해결 후 커밋을 진행한다.

 

4. merge 결과

  • 원래 origin/master위치였는데, 하나를 되돌아가서 브랜치(update-branch)를 만들고, 작업을 한 후 merge한 상황이다.
  • push해도 문제 발생하지 않는다. 강제 push 필요 없다.(push 하면 master로 origin/master, origin/HEAD가 이동한다)
  • 즉, 되돌아갈때는 branch를 만들어서 되돌리자.

 


이전 커밋으로 되돌리기 - Revert를 사용해 커밋 되돌리기

 

1. revert test용 커밋 추가

  • revert test용 커밋 추가한 상황
  • 이 의미없는 커밋을 없애고 싶은 상황이다. 

 

2. revert test 커밋을 대상으로 revert(커밋 되돌리기) 실행

  • 이전의 의미없는 커밋이 삭제되는게 아니라, 'Revert ~ '라는 커밋이 새로 생성이 된다.
  • 없애고 싶은 커밋의 이전 파일 내용으로 돌아간다.
  • 하지만 '리버트 테스트용 커밋'은 남아있게 된다. 이곳에는 파일도 남아있다.
  • 즉, 되돌렸다는 내용 자체도 커밋으로 남기는 것이다.
  • 단점은, 충돌 발생 가능성이 있다.

 

  • learngitbrancing 실습
  • C3를 대상으로 git revert C3를 하게되면, C3'커밋이 생기게 된다.
  • 이 내용은 C2와 동일하다! C3 커밋은 보존된다.

 

 


이전 커밋으로 되돌리기 - revert로 여러 커밋 되돌리기

Q : revert로 여러 커밋을 되돌리려면 어떻게 하나요?

 

  • 현재 test 브랜치를 만들고, commit 3개를 진행한 상황이라고 하자.
  • commit 3을 대상으로 revert를 하면, commit2의 내용으로 돌아간다. 기록은 Revert "Commit 3"으로 남게 된다.
  • commit 1로 돌아가고 싶으면? 
    -> 바로 Commit2를 대상으로 revert하는게 아니라, 차례로 Commit 3부터 revert를 진행해줘야 한다.
    -> 바로 Commit2를 대상으로 하게되면 충돌이 발생한다. 
    -> 현재 Commit3의 내용을 Commit1로 변경하겠다는 의미이기 때문이다.
  • 즉 최신부터 순서대로 revert를 반복 적용하면 된다!
  • 터미널
    -> git revert HEAD : 최신 커밋을 되돌리자
    -> git revert HEAD HEAD~1 : HEAD, HEAD~1을 순서대로 되돌리자

 


이전 커밋으로 되돌리기 - revert 마지막
  • 선택한 커밋 하나의 변경사항을 되돌리고 -> 새로운 커밋을 생성한다.
  • cherry-pick과 비슷하면서도 반대로 동작한다.

 

Q : 특정 커밋 하나만 취소하고 싶은 경우에는 어떻게 하나요?

  • 그냥 선택해서 revert를 하면 된다.
  • 단, 충돌의 가능성이 있다.

 

 

< 충돌 안나는 경우 >

 

1) 임시 브랜치 생성(revert-test) & commit 3번 진행(파일 3개 생성 및 각각 커밋)

 

 

2) 2번째 커밋만 되돌리기

  • 커밋마다 파일이 모두 다르다. 
  • 따라서 2번째 커밋을 revert해도, 2번째 파일만 사라지고 1, 3은 남아있게 된다. 충돌 발생하지 않는다.

 

 


Commit --amend와 스태시

 

브랜치 체크아웃 시 주의사항

  • 브랜치를 만들고 체크아웃을 하려면 현재 작업 디렉토리가 깨끗해야 한다.
    즉, 현재 브랜치변경사항이 있을때는 체크아웃이 불가능하다. 즉 로컬의 변경사항을 커밋해야 한다.
  • 그런데 갑작스럽게 체크아웃이 필요하다면?


 

commit --amend 사용

 

1. 브랜치 1에서 일단 (임시) 커밋을 한다.

2. 브랜치 2로 체크아웃 하고 볼 일을 본다.

3. 다시 브랜치 1로 되돌아 온다.

4. 1의 작업을 이어서 마무리 짓는다.

5. 커밋 덮어쓰기 (commit --amend)를 한다.

6. (옵션) 필요하다면 (push --force)를 한다.

 

 

1. 임시 커밋 후 돌아와서 다시 커밋 한 상태

  • test 브랜치에서 다른 브랜치로 갑작스럽게 체크아웃이 필요해서, 의미 없는 커밋을 만들고 작업 후 다시 돌아왔다.
  • 그리고 이번에는 의미 있는 커밋을 남겼다.
  • 이걸 없애려면 어떻게 할까?

 

2. commit --amend (마지막 커밋 정정 옵션)

  • 결과로 의미 없는 커밋을 덮어쓰게 되었다.

 

 

3. 만약 의미 없는 커밋을 push 했을 경우?

 

  • 이 상태에서 커밋 정정 옵션을 선택하게 되면?

 

  • 로컬과 원격의 커밋이 분리가 된다. 서로 다른 커밋이 2개가 된다.
  • 이럴때는 어쩔 수 없이 git push --force를 수행해서 원격으로 의미있는 커밋을 강제로 덮어씌운다.
  • 실수로 했을 경우에만 사용!

 


 

Stash를 이용해서 같은 작업 하기

 

1. Stash를 만든다.

2. 이 때 새로운 파일(untracked file)이 있었다면 일단 인덱스에 추가한다.

3. 체크아웃을 한다.

4. 되돌아 온다.

5. Stash를 pop 한다.

6. 보통 커밋을 새로 생성한다.

 

 

 

1. Stash(임시 저장공간) 사용

  • 변경점을 stash로 저장한다.
  • 이 내용이 stash로 들어가게 된다.

 

 

  • 작업이 끝난 후, 다시 test2 브랜치로 돌아와서 스태시 적용을 누르게 되면, 다시 내용이 반영된다.
  • 즉, 불필요한 커밋을 생성하지 않는 방법이다!

 

 

2. 주의 사항 - 신규파일 있을 시

 

  • untracked file, 즉 추적되지 않는 파일로 신규 생성된 파일이라는 의미이다. 이는 소스트리상에서 '?'로 표시된다.
  • 이런 파일들은 stash가 되지 않는다. 이런 파일들은 스테이지에 올리기만 하면 된다.(커밋 x)
  • 불필요한 stash는 삭제 가능하다.

 

 


rebase 사용해서 트리 정리하기

 

병합(merge) 처럼 두 브랜치를 합칠 때 사용한다. 소스트리에서는 "재배치"라는 명령이다.

현재 브랜치가 대상 브랜치 위로 올라간다.

 

  • 장점 : 커밋 히스토리가 깔끔하게 정리된다.
  • 단점 : 이미 원격에 올라간 경우, 협업을 하고 있는 경우 특히 위험하다.

 


 

< 단순 merge 사용 >

 

1. rebase 브랜치 생성 및 커밋

 

 

 

2. 원래 master 위치에 신규 브랜치 생성(etc), 새로운 커밋 추가

 

  • rebase, etc 각각 동일한 파일을 수정한 후 commit이 수행된 상태이다.

 

 

3. master에서 rebase를 merge(fast forwarding)

 

 

4. master에서 etc를 merge(충돌 발생)

 

  • 충돌 해결 후 merge 수행 (3-way merge 진행)

 

 


 

< rebase 사용 >

 

 

1. etc, rebase 생성(이전과 동일) 

  • test를 위한 브랜치를 만드는게 좋다. 이번에는 merge-test라는 브랜치를 만들어서 진행한다.

 

 

2. etc merge(fast forward)

 

 

3. rebase 수행

  • 이번에는 merge-test(master라고 생각하자)가 아닌 rebase를 먼저 체크아웃한다.
  • 병합을 원하는 브랜치를 대상으로 "재배치"를 누른다.
    누르면 현재 변경사항을 "merge-test"로 재배치하시겠습니까? 라는 메시지가 나온다.
  • 마찬가지로 충돌은 발생한다.

 

4. 충돌 해결 후

 

  • 충돌 해결 후, 다시 재배치 요청을 한다.
  • 즉, 하던 rebase를 계속하라는 의미이다.(git rebase --continue)

 

5. 결과

  • 갈라져있던 rebase가 하나로 통합되었다.
  • 다시 merge-test로 들어가서, 병합을 눌러줘야 한다.

 

  • 이제는 같은 줄이므로 merge-test -> rebase로 병합이 가능하다. 
  • rebase를 통해 Tree가 이쁘게 합쳐진다.
  • but, 원격으로 올라간 내용은 rebase 하지 말자.

 

 

 


기타 주의사항
  • 안쓰는 코드에 대한 주석을 남기지 말자.
  • 커밋은 자주 하자. 원자적으로 쪼갤 수 없는 단위(주로 함수 등)의 의미 있는 개발은 커밋을 하자.
  • 커멧 메시지를 잘쓰자. 첫 줄에 요약 -> 한 줄을 띄우고 자세하게 내용을 적자.

 

 

미션

1. A, B 원격 저장소 만들기

2. 각각 다르게 커밋하기, B는 1회만 커밋 / A는 다수 커밋

3. A의 내용을 B의 1회 커밋 위에 올려서, B 저장소로 push 하기

 

Comments