ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자꾸만 헷갈렸던 Git 작업(명령어) 정리
    Studying/Git | Github 2023. 6. 12. 11:44

    Git 설정

    로컬 레포지토리와 연결할 유저 정보를 설정합니다.

    # 버전 히스토리를 식별할 때 사용할 이름을 설정합니다.
    $ git config --global user.name "[firstname lastname]"
    # 각 기록과 연결할 이메일 주소를 설정합니다.
    $ git config --global user.email “[valid-email]”

     

     

    도움말 보기

    help 명령어를 이용하여 각 명령어 및 옵션의 기능을 살펴볼 수 있습니다.

    # Git에서 제공하는 모든 명령어를 볼 수 있습니다.
    $ git help -all
    # 특정 command에서 사용할 수 있는 모든 옵션을 볼 수 있습니다.
    $ git [command] -help

     

     

    세팅 및 초기화

    레포지토리를 초기화 하거나 존재하는 레포지토리를 클론합니다.

    # 현재 디렉토리를 기준으로 Git 저장소가 생성됩니다.
    $ git init
    # URL을 통해 리모트 리포지토리를 로컬 리포지토리에 복제합니다.
    $ git clone [url]

     

     

    Stage & Commit

    변경된 내용을 스테이지 영역에 올린 뒤 커밋합니다.

    # 다음 커밋을 위해 현재 디렉토리에서 수정된 파일을 확인할 수 있습니다.
    $ git status
    # 다음 커밋을 위해 파일을 추가(스테이지)합니다. (stage)
    $ git add [file]
    # 추가한 파일을 언스테이징합니다. 변경 사항은 유지됩니다.
    $ git reset [file]
    # 스테이지되지 않은 변경 사항을 보여줍니다.
    $ git diff
    # 스테이지했지만 커밋하지 않은 변경 사항을 보여줍니다.
    $ git diff --staged
    # 스테이지된 콘텐츠를 메시지와 함께 커밋합니다. (스냅샷 생성)
    $ git commit -m “[descriptive message]”

     

     

    Branch & Merge

    브랜치를 분리, 변경하여 작업하고 작업을 완료한 후 합병합니다.

    # 브랜치 목록을 보여줍니다. * 표시로 현재 작업중인 브랜치를 확인할 수 있습니다.
    $ git branch
    # 현재 커밋에서 새로운 브랜치를 생성합니다.
    $ git branch [branch-name]
    # 다른 브랜치로 전환합니다.
    $ git switch [branch-name]
    $ git checkout [branch-name]
    
    # 새로은 브랜치를 생성하고 해당 브랜치로 전환합니다.
    $ git switch -c [branch-name]
    $ git checkout -b [branch-name]
    # 현재 브랜치에 특정 브랜치의 히스토리를 병합합니다.
    $ git merge [branch-name]
    # 현재 브랜치의 모든 커밋 히스토리를 보여줍니다.
    $ git log

     

     

    비교 및 검사

    로그 및 변경사항을 검사합니다.

    # 브랜치B에 없는 브랜치A의 모든 커밋 히스토리를 보여줍니다.
    $ git log branchB..branchA
    # 해당 파일의 변경 사항이 담긴 모든 커밋을 표시합니다. (파일 이름 변경도 표시)
    $ git log --follow [file]
    # 브랜치A에 있지만 브랜치B에 없는 것의 변경 내용(diff)을 표시합니다. (branch간 상태 비교)
    $ git diff branchB...branchA

     

     

    공유 및 업데이트

    특정 레포지토리의 업데이트 사항을 검색하여 로컬 레포지토리를 업데이트 합니다.

    # url을 통해 특정 리모트 리포지토리를 별칭으로 추가합니다.
    $ git remote add [alias] [url]
    # 별칭으로 추가한 리모트 리포지토리에 있는 모든 브랜치 및 데이터를 로컬로 가져옵니다.
    $ git fetch [alias]
    # 리모트 브랜치를 현재 작업중인 브랜치와 병합하여 최신 상태로 만들 수 있습니다.
    $ git merge [alias]/[branch]
    # 로컬 브랜치의 커밋을 리모트 브랜치로 전송합니다.
    $ git push [alias] [branch]
    # 리모트 리포지토리의 정보를 가져와 자동으로 로컬 브랜치에 병합합니다.
    $ git pull

     

     

    히스토리 수정

    브랜치 or 커밋을 수정하거나 커밋 히스토리를 지웁니다.

    # 특정 브랜치의 분기 이후 커밋을 현재 작업중인 브랜치에 반영합니다.
    $ git rebase [branch]
    # 득정 커밋 전으로 돌아가며 스테이지된 변경 사항을 모두 지웁니다.
    $ git reset --hard [commitish]

     

     

    임시 저장

    브랜치를 전환하기 위해 변경되었거나 추적 중인 파일을 임시로 저장합니다.

    # 수정하거나 스테이지된 변경사항을 스택에 임시 저장하고 현재 작업 내역에서 지웁니다.
    $ git stash
    # 스택에 임시 저장된 변경사항의 목록을 보여줍니다.
    $ git stash list
    # 스택에 임시 저장된 변경사항을 다시 현재 작업 내역에 적용합니다.
    $ git stash apply
    # 스택에 임시 저장된 변경사항을 다시 현재 작업 내역에 적용하고 스택에서 삭제합니다.
    $ git stash pop
    # 스택에 임시 저장된 변경사항을 삭제합니다.
    $ git stash drop

     

     

    협업 Git

    작업자 A와 작업자 B가 있다고 가정했을 때 작업 과정입니다.

     

    1. 깃허브에서 브랜치 생성
    2. 터미널에서 브랜치 확인
      • git fetch 깃 정보 갱신
      • git remote prune origin 로컬에서 캐시 삭제
      • git branch -r origin 브랜치 정보 확인
      • git switch feature/-- 브랜치 변경
      • git pull 현재 브랜치 origin→local
      • git branch 현재 브랜치 확인
    3. test.js 변경 후 커밋
      • git stage . or git add . 변경 사항을 스테이징
      • git commit -m 'test' 로컬 브랜치 반영
      •  or git commit -a -m 'README 변경' 신규파일의 경우 스테이징 선행
      • git push  origin에 반영

     

     

     

    두 작업자 코드에서 충돌이 일어날 경우

     

    (현재 브랜치에는 B의 최근 작업이 올라가있는 상태에서, 작업자 A가 pull을 안 한 상태로 코드 작업을 했다가 B와 같은 파일, 같은 부분을 수정해서 충돌이 일어난 경우)

    작업자 A의 해결 과정은

     

    1. test.js 파일 변경 후 바로 push 할 경우 => 에러 발생. 반드시 커밋을 하고 push 해야한다.
      • git commit -a -m '내역'
      • git push
    2. 문제 발생 => 충돌 해결 후 코드를 머지하는 방법
      • git switch dev
      • git pull origin dev
      • git switch (합병하려던브랜치)
      • git merge dev
    3. 충돌 일어난 부분 개발자와 합의 후 커밋 & 푸쉬
      • git commit -a -m '내역'

     

     

     

    dev 브랜치에 feature 브랜치를 합병하는 방법

    (PR이 제일 편하나 아래 방법도 있음)

     

    1. dev 브랜치에 하위 브랜치를 넣을 것이므로 dev 관점(?)으로 변경
      • git switch dev
    2. 업데이트 한다.
      • git pull
    3. 현재 브랜치에 다른 브랜치를 머지 한다.
      • git merge feature/--
    4. 커밋, 푸쉬한다.
      • git commit -m 'blabla'
      • git push origin dev

     

     

     

     

    Q&A

    Q. 프로젝트 구조, 라이브러리 설치 등 초기화 작업은 어느 브랜치에 하나요?

    A. 대표자 한 명이 초기화 작업을 한 뒤 main 브랜치에 push한 후, 그 아래 dev 브랜치를 생성해서 작업을 시작합니다.

     

    Q. 신규 파일 생성 또는 파일 삭제가 있는 경우 add 를 하고, 그 외 코드 수정은 stage를 하랬는데 똑같은 거 아닌가요?

    A. 두 가지 명령이 기능적으론 동일하나 명시적으로 분리하여 사용하는 게 좋습니다.

     

    Q. 코드 충돌이 일어났을 때 stash를 사용하면 안 되나요?

    A. stash를 잘 사용한다면 더 좋지만, 아직 미숙하다면 코드가 날아갈 수도 있기 때문에 코드를 비교해서 수정하는 게 제일 속 편하긴 합니다...

     

    Q. 매번 명령어로 코드를 업데이트 하기 귀찮아요.

    A. 원본 레포지토리를 fork 해서 Syncfork 기능을 사용하면 버튼 클릭 한 번으로 자동 업데이트 됩니다.

     

    Q. 원본 레포를 사용하기 무서워요.

    A. 원래 주니어 개발자의 경우 원본 레포지토리를 건들이기 부담스럽기 때문에 fork 하여 사용하곤 합니다. 또한 AWS 계정 연동이나 key 등 시크릿 정보를 개인 계정 secret 변수에 등록해놓기 위해 fork 합니다.

     

     

     

     

Designed by Tistory.