개발/git

[Git&GitHub] 이해를 바탕으로 내용 정리.

mabb 2022. 8. 18. 21:41
반응형

 

수시로 수정 및 업로드예정입니다.
틀린 부분이 있다면 댓글로 꼭 알려주세요!

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


📃깃&깃허브를 사용하는 이유:
 버전관리, 백업, 협업
 일반 직장인들도 문서관리를 위하여 많이 사용한다.
파일 하나를 여럿이 수정하고 합치는 것이 굉장히 번거롭기 때문.
버전까지 달리하며 관리할 경우 더욱 불편.
개발자 협업에는 필수.

📃깃: 
 로컬 저장소를 깃으로 관리하면 커밋, 브랜치 등의 기능으로 버전관리가 가능하다.


📃깃허브:
 로컬 저장소를 원격저장소에 백업하고 협업할 수 있다. 오픈소스에 기여하는 등 커뮤니티 활동도 할 수 있다. 정적인 사이트 호스팅도 가능하며 포트폴리오로도 많이 사용함. 


📃저장소(디렉토리,폴더)를 깃이 관리하도록 만드는 두 가지 방법

   1) 깃 저장소로 만들 디렉토리에서 $git init 명령어를 실행한다.
   2) 디렉토리를 만들 상위경로에서 $git init <생성할 디렉토리명> 을 실행한다.
    ->폴더 내에 .git이라는 숨김 폴더가 생긴다. 이제 이 폴더는 git이 관리함.
      .git폴더를 지우면 깃의 관리에서 벗어남.


📃깃 배쉬(리눅스 기반의 CLI프로그램)에서 디렉토리 이동하는 방법
   
   1) 해당 폴더 우클릭 - Git Bash Here 를 선택한다.
   2) 깃 배쉬에서 리눅스 디렉토리 이동 명령어를 사용한다.
        -현재 디렉토리 확인 명령어: $pwd
        -상위 디렉토리로 이동 명령어: $cd ..
        -해당 디렉토리의 목록 확인: $ls
        -해당 디렉토리 내의 디렉토리 이동: $cd 디렉토리명 


📃커밋이란

   저장소 내의 현상태를 버전으로 만드는 것을 커밋한다고 한다.
  깃은 '커밋'하는 순간의 저장소 내의 상태를 저장한다.
  커밋한 순간으로 되돌릴 수 있으며 그럴 경우 저장소 내의 상태는
  해당 커밋 시점으로 되돌아간다. 스냅샷에 메모를 남기듯, 커밋할때 커밋메시지를 남긴다.
  커밋한 그 순간의 저장소 상태를 잘 표현할 수 있는 메시지를 남겨야 한다.


📃되돌아가는 두 가지 방법  

  1) $git reset <커밋해시> : 돌아갈 커밋 이후에 만들었던 커밋은 지워진다..! 
  2) $git revert <커밋해시> : 기존 커밋이 유지되고 되돌아가려는 커밋을 최신 커밋으로 생성한다.
  
   커밋한 시점(버전)에는 커밋해시라는 고유의 코드가 부여되며 이를 이용하여
  되돌아갈 수 있다. 커밋 기록은 $git log 명령어를 사용하면 확인 가능하다.
  (단, log기록은 소스트리같은 GUI프로그램에서 보는 것이 편리)


📃깃이 저장소의 버전을 관리하는 절차
  
  1) 해당 저장소(작업트리) 내의 변경사항(파일추가,수정,삭제)을 깃이 감지한다.
      $git status 명령어를 사용하면 변경사항 확인이 가능하다.
      텍스트파일에 글자 하나만 바뀌어도 다 감지한다.
     (변경을 감지하지 않을 파일을 설정하는 것이 .gitignore 파일)

  2) 변경사항 중 커밋할 파일을 골라놓는 것을 스테이징이라고 한다.
     $git add 명령어를 사용한다.  $git add .   ( . 마침표) 를 사용하면
     저장소 내의 모든 변경사항을 스테이징한다. $git add <파일명>을 실행하면
     해당 파일을 스테이징한다.

  3) 스테이징한 파일들을 커밋하여 저장소의 현 상태를 스냅샷처럼 버전으로 
     만든다. $git commit 명령어를 사용하며 다음과 같은 옵션이 있다.
     (명령어 뒤에) 
     -m "커밋메시지"  :커밋 메시지를 남기며 커밋
     -am  : 한번이라도 커밋한 적 있는 파일일 경우 스테이징과 커밋을 한 번에 처리
     --amend   :최근 커밋 메시지 수정
    ※ 이러한 과정은 .git폴더 내에서 깃 내부적인 처리로 이루어진다.


📃브랜치란

  master브랜치 또는 main브랜치가 기본 브랜치이다. 가지가 새 줄기를 뻗듯 main브랜치에서
새로운 갈래를 만들어 버전관리를 할 수 있게 해주는 기능이다.

$git branch <브랜치명> 으로 현재 시점에서 새로운 브랜치를 만들 수 있다.
$git switch <브랜치명> 으로 다른 브랜치로 이동할 수 있다.
$git branch <브랜치명> -c  으로 브랜치를 만들면서 만든 브랜치로 이동까지 한번에 할 수 있다.

(master라는 단어는 주인-노예를 연상시켜서 지양하는 추세라고하므로
main브랜치라고 칭한다.)

※.로컬저장소의 브랜치와 원격저장소의 브랜치는 별개이다.


📃브랜치를 만들어 작업하면 좋은 점

1) 기본기능을 만들고 각기 다른 기능을 추가하여 각각 다른 버전으로 만들 때
2) main브랜치의 내용을 보존하면서 새로운 기능을 추가로 작업 할 때
3) 협업 시 원격의 main브랜치에 바로 수정사항을 올리지 않고 원격의 서브브랜치에 수정사항을 올린 후 이를 다시 원격의 main브랜치에 병합하는 식으로 하여 main브랜치를 보호한다.

 새로운 기능을 추가할 때 main브랜치 하나의 줄기에서 진행하기 보다는
새로운 기능을 새로운 갈래의 branch에서 작업하고 병합하는 것이 안전하고 편리하다.


📃작업한 브랜치를 main브랜치에 병합하는 방법

 main브랜치에서 $git merge <병합할 브랜치명> 을 실행한다.
 vim이라는 텍스트편집기가 실행되며 커밋메시지를 수정하게되는데
 a를 눌러 편집모드로 진입하여 수정 후 ESC를 눌러 저장모드로 진입하고 :wq 를 입력하여 저장종료한다. 그냥종료는 :q
 병합 시 병합하는 각각의 브랜치에서 파일의 같은 부분을 수정했을 경우 충돌이 일어날 수 있다. 이는 사람이 직접 결정해주어야 한다.


📃브랜치를 삭제하는 두 가지 방법

  1) main브랜치에 병합하고 남은 브랜치를 지우는 방법 $git branch -d <브랜치명>
  2) 병합하지 않은 브랜치를 강제로 지우는 방법 $git branch -D <브랜치명>

  보통 메인브랜치 보호 차원에서 만들어 작업하고 병합한 브랜치는 바로바로 지운다고 한다.


📃깃허브에 나의 로컬저장소를 연결하는 방법

  1) 깃허브 사이트에서 원격저장소를 만들고 원격저장소 주소를 복사한다.
  2) 백업할 깃 로컬저장소에서 $git remote add origin <원격저장소 주소>를 입력한다.
     origin은 키워드라기보다는 원격저장소 주소를 담는 변수같은 관습적인 것.
  3) 연결하였다면 로컬저장소의 내용을 커밋하여 원격저장소에 올려주어야 한다. 
     먼저 스테이징 및 커밋을 한다. (add명령어와 commit명령어)
  4) $git push 명령어로 커밋한 내용을 원격저장소에 push(업로드)한다.
     명령어는 $git push origin master 로 지역저장소의 master브랜치를 origin저장소의 master브랜치에 push하겠다는 의미.
     원격저장소 연결 후 최초에 push를 할 때
     $git push -u origin master로 실행하면 이 다음부터는 $git push만 해도 해당 원격저장소의
      master브랜치로 push가 된다.
  5) $git pull 명령어를 사용하면 원격저장소의 변경사항을 로컬저장소에 반영할 수 있다.

     원격저장소의 변화된 내용을 로컬저장소에 반영시키기 전에 
     $git fetch 명령어를 이용하여 변경사항을 살펴보고 $git merge로 
     병합하는 방법도 있다. 이 때의 $git fetch와 $git merge를 한번에 처리하는게
     $git pull이다. 원격 브랜치의 변화 사항을 로컬브랜치로 병합한다고 이해.
  
※.하나의 로컬저장소를 여러개의 원격저장소에 백업할 수도 있다.


📃 나의 원격저장소나 타인의 원격저장소를 나의 PC에 복사하여 내려받는 방법

  $git clone <복사한 원격저장소 주소>
   만약에 협업자로 등록된 사람이라면 이 저장소에 push할 수 있다.
 
   만약에 $git clone으로 내려받은 PC가 학원이나 회사 컴퓨터이고
  해당 원격저장소가 본인의 소유라면 여러 작업 PC에서 원격저장소로
  PUSH하고 PULL하면서 작업할 수 있다.


📃 협업 시 풀 리퀘스트의 의미

  원본 저장소( 프로젝트를 진행하는 메인 브랜치)에 내가 수정한 내용을 반영해주십사
요청하는 것을 풀 리퀘스트(pull request)라고 한다. 이는 깃허브 홈페이지에서 확인할 수 있으며
이를 검토 후 원본 소스에 반영할지 여부를 결정할 수 있다.



📃 하나의 원격저장소에서 브랜치를 구분하여 협업하는 방식

준비사항: 원격저장소 생성 및 협업자 등록. 팀원 clone 생성.
1. 깃허브 원격저장소에 변동사항이 있는지 확인한다.
    :깃허브에서 확인하거나, $git fetch명령어를 이용한다.
2. 변동사항이 있다면 원격저장소를 pull하여 나의 로컬 저장소를 최신화한다.
   $git pull origin main 
     : origin(원격저장소)의 main브랜치를 나의 로컬 main브랜치로 가져온다는 의미.
3. 나의 로컬저장소에 작업용 브랜치를 생성한다.
    :$git branch <브랜치명> , $git switch <브랜치명>

4. 작업을 진행한다.
  *작업 내용이 좋지 않을 경우 main브랜치로 이동하여 작업브랜치를 지울 수 있다. 
(main브랜치에는 작업 전 폴더 상태가 유지되어 있음)
5. 작업 내용은 중간 중간 커밋을 남긴다.
 스테이징: 로컬 저장소 내의 변동사항(파일 추가, 수정, 삭제 등)을 커밋 대상으로 저장하는 것.
      $git add .
 커밋: 로컬 저장소 내의 현재 상태를 스냅샷처럼 메모를 달아서 남기는 것.(이 순간으로 되돌릴 수 있음)
$git commit -m "커밋메시지"
6.작업한 브랜치를 원격 저장소의 브랜치로 업로드(push) 한다.
  $git push origin <브랜치명>
  $git push origin main : 로컬의 main브랜치를 원격저장소(origin)의 main브랜치로 올리겠다는 의미.
  $git push origin dev:  로컬의 dev브랜치를 원격저장소(origin)의 dev브랜치로 올리겠다는 의미.
7. 원격저장소의 main브랜치(현재까지 완성된, 최신화 상태의 프로젝트가 있는 브랜치) 보호를 위해
  작업 브랜치를 만들어서 push하는 것이다.
8. 원격으로 올린 작업 브랜치와 원격의 main브랜치를 검토 후에 병합(merge)한다. -> 원격의 main브랜치는
  작업사항이 반영되어 최신화 된다.
9 원격저장소에서 병합을 하고 남은 작업용 브랜치는 지운다.
10. 로컬에서는 main이 아닌 작업용 브랜치를 유지하거나,
  main브랜치를 최신화 하면서 매번 새롭게 작업용 브랜치를 생성하여도 된다.


  



반응형

'개발 > git' 카테고리의 다른 글

[git] 깃과 깃허브  (0) 2022.06.12