( 출처 : https://wikidocs.net/book/7060 )

3. github과 함께 사용하기

(1) 로컬 저장소 SimpleTest & (2) 원격저장소를 연계하기

원격 저장소 ( ex. github ) 사용의 장점

  • 1) 안전성 : 백업 저장소 역할
  • 2) 협업 : 다수의 개발자가 협업 가능


3-1) 원격 저장소 생성 & 연동

Step 1) 원격 저장소 생성

  • 회원 가입 후, new repository 생성하기


Step 2) 저장소 연동

  • git remote add : 원격 저장소 등록하기
  • git remote add [원격 저장소 이름] [원격 저장소 주소]
    • ex) git remote add origin https://github.com/xxxxxxxx
    • 원격 저장소의 이름 : origin
  • git remote : 원격 저장소 리스트를 확인하기
    • git remote -v : url도 함께 확인


Step 3) 파일을 원격 저장소로!

  • (지금까지는) 현원격 저장소의 이름만 등록된 상태
  • git push -u [원격저장소 이름] [로컬저장소의 브랜치 이름]
    • ex) git push -u origin master


[ 요약 ]

  • git remote : 추가된 원격저장소 리스트 출력
  • git remote -v (--verbose) : 원격저장소 리스트 출력
  • git remote add [원격 저장소 이름] [원격 저장소 주소] : 해당 이름으로 원격 저장소 등록
  • git remote delete [원격 저장소 주소] : 해당 원격 저장소를 등록 리스트에서 삭제
  • git push -u (--set-upstream-to) [원격 저장소 이름] [로컬 브랜치 이름] : 로컬 저장소의 브랜치가 원격 저장소를 추적하도록 설정하고 파일들을 원격 저장소로 push


3-2) push & pull

  • push : 로컬 저장소의 변경사항을 원격 저장소로!

  • pull : 원격 저장소의 내용을 로컬 저장소로!

figure2


git push

  • 순서 1) git add

  • 순서 2) git commit

  • 순서 3) git push

    • git push vs git push origin master

      • 원칙적으로, 전체 명령은 git push origin master

      • BUT 원격 저장소를 연계할 때 upstream 설정을 완료했기 때문에

        (git push -u origin master) 이후 부터는 간략하게 git push만 입력하면 됨


git pull

  • 격 저장소에 업데이트 된 내용을 로컬 저장소로 내려받기
  • 두 가지 process가 내부적으로 일어남
    • 1) fetch = 원격 저장소의 정보를 가져오기
    • 2) merge = 가져온 내용을 브랜치에 병합
  • git pull vs git pull origin master
    • git push와 마찬가지이다!


[ 요약 ]

  • git push [원격 저장소 이름] [로컬 브랜치 이름] : 로컬 저장소의 변경사항을 원격 저장소로 업로드

  • git push : upstream(-u) 설정 후 인자 생략 가능

  • git pull [원격 저장소 이름] [원격 브랜치 이름]

    원격 저장소의 정보를 현재 로컬 브랜치에 가져와서 병합(fetch + merge)

    • 예) 원격 저장소의 브랜치가 origin/master이면 git pull origin master
    • = git fetch origin and git merge origin/master
  • git pull : upstream(-u) 설정 후 인자 생략 가능


3-3) tag

버전정보를 함께 기록해서 저장하기!

  • 직관적인 이름을 붙이자! with tag


tag의 종류

  • Lightweight tag : tag 이름
    • 특정 commit을 참조하는 포인터와 같은 기능
    • when? 임시로 사용하거나 정보를 기록할 필요가 없을 때
  • Annotated tag : tag 이름 외의 정보
    • ( ex. 설명 서명, 작성자 정보, 날짜 등 )
    • git 내부 데이터베이스에 정보가 저장
    • when? 그 외의 일반적인 경우


tag 생성

Goal : 다음과 같이 tag 부여하기

figure2


[ Lightweight tag ] ( ex : v1.0.1)

  • git tag [tag명] [commit hash]
$ git tag v1.0.1 cd9938f


[ Annotated tag ] ( ex : v1.0.2 & v1.0.3)

  • git tag 명령에 -a(또는 --annotate) 옵션을 추가
  • git tag -a [tag명] [commit hash]
$ git tag -a v1.0.2 5858e92


tag 확인하기

방법 1) git log

$ git log --oneline
----------------------------------
ee826e4 (HEAD -> master, origin/master) Create README.md
3d05760 (tag: v1.0.3) Modify OnBnClickedResetBtn function
a9aca7e Add OnBnClickedResetBtn function
5858e92 (tag: v1.0.2) Add listbox and modify OnBnClickedMsgBtn function
cd9938f (tag: v1.0.1) Add OnBnClickedMsgBtn() function
e5b578b Apply .gitignore
635225a Create empty project


방법 2) git tag

$ git tag -l
------------------------
v1.0.1
v1.0.2
v1.0.3
$ git tag -l "*.2"
--------------------
v1.0.2


방법 3) git show

  • 해당 commit의 상세정보 확인
  • git show [tag명]
$ git show v1.0.3
--------------------------
tag v1.0.3
Tagger: User1 <User1@gmail.com>
Date:   Thu Oct 28 13:38:28 2021 +0900

Release version 1.0.3 3d05760

(생략)


tag 삭제

git tag -d [삭제할 tag명]

$ git tag -d v1.0.3
-----------------------------------
Deleted tag 'v1.0.3' (was 2f82b67)


tag 활용

  • commit을 참조하는 기능

  • commit hash 대신 사용


ex) 특정 tag가 부여된 commit으로 checkout 하려면 …

  • git checkout [tag명]
$ git checkout v1.0.1
Note: switching to 'v1.0.1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
(생략)


tag를 원격 저장소에 push

로컬 저장소에 부여한 tag를, 원격 저장소에도 반영해야함. ( push 필요 )

  • 실수 하지 않기! git push가 아니다!
  • 명령어
    • 모든 tag : git push [tag명]
    • 개별 tag : git push --tags


원격 저장소에서 확인해보기!

( 왼쪽 상단의 master 탭을 클릭해서 Tag 항목 )

figure2


[ 요약 ]

  • git tag : 로컬 저장소의 모든 tag를 조회
  • git tag [tag명] : 현재 commit에 tag를 생성 (Lightweight tag)
  • git tag [tag명] [commit ID] : 해당 commit에 tag를 생성 (Lightweight tag)
  • git tag -a [tag명] –m “[tag message]” [commit ID] : 메시지를 추가하여 tag 생성 (Annotated tag)
  • git tag -am [tag명] “[tag message]” : 현재 commit에 메시지를 추가하여 tag 생성 (Annotated tag)
  • git show [tag명] : 해당 tag가 부착된 commit을 상세정보 확인
  • git push --tags : 생성된 전체 tag를 원격 저장소에 push ( = git push origin –tags)
  • git push [tag명] : 해당 tag를 원격 저장소에 push ( = git push origin “[tag명]”)
  • git tag –d [tag명] : 해당 tag 삭제
  • git push –d [tag명] : 원격 저장소의 해당 tag 삭제


3-4. revert

원격 저장소까지 이미 업로드된 commit을 취소하기 위해..

  • 방법 1) 코드 수정 + commit & push
  • 방법 2) git revert
    • 코드 수정없이, 간단하게 commit을 되돌릴수 있음!
    • 원리 : 과거 commit으로 파일 상태를 복구 & 새로운 commit을 추가


git revert [commit hash]

$ git revert 8683c03
-------------------------------------
[master 2ef723c] Revert "Add static(IDC_STATIC) to print date"
 2 files changed, 5 deletions(-)


이후, git push를 통해 revert commit을 업로드!


의문점 : git reset은?

$ git reset --hard HEAD^^

$ git push ---------> 에러!
------------------------------------------------
To https://github.com/sguys99/SimpleTest.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/sguys99/SimpleTest.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.

에러 이유?

  • 로컬 브랜치 : C단계

  • 원격의 브랜치 : E를 참조 ( 더 최신 )

    ( git에서는, 더 뒤쳐진 commit이 최신 상태를 못 덮어쓴다! )

figure2


결론 : “push까지 완료한 상태”에서 commit을 되돌리려면, git revert를 써야!

figure2


[ 요약 ]

  • git revert [commit hash] : 해당 commit을 되돌리기
  • git revert --no-edit [commit hash] : revert commit messege 수정하지 않고 default 사용
  • git revert [commit hash1]..[commit hash2] : 해당 구간만큼 commit 되돌리기. commit ID1은 해당되지 않음

Categories:

Updated: