git - commit --amend / remote / tag / describe / snapshot

markyang92·2021년 4월 23일
0

git

목록 보기
6/14
post-thumbnail

커밋 수정(--amend)

  • 완료한 커밋을 수정해야할 때가 있다.
    • 너무 일찍 커밋
    • 어떤 파일 빼먹음
    • 메시지 수정
  • 주의: 수정 하려는 커밋이 다른 유저와 공유 중이라면 매우 주의 할것! 최종적으로 $ git push -f 를 동반하므로 동시 사용자에게 매우 귀찮음
    • 같은 내용의 커밋이라도 커밋 해쉬가 변경되기 때문이다!
  • $ git commit --amend
    1. 커밋 메시지 변경
      • 수정 사항 없이 바로 $ git commit --amend
        커밋 메시지만 바꾸는 Editor가 뜬다.

    2. 어느 파일 빼먹고 커밋한 경우
$ git commit -m"Initial Commit"
# 커밋 햇는데 text.txt를 수정해야한다! 혹은 staged로 옮겨야한다!
# 수정 후...
$ git add text.txt	# forgotten_file
$ git commit --amend	# 커밋을 또 만들고 싶은게 아니라면 무조건 `--amend`

위 두개는 로컬에서 반영되었다. 문제는 리모트 저장소이다.
위에서 수정한 커밋이 remote 저장소에 업로드되어 있다면, 다른 유저는 이미 이전 커밋을 다운해서 사용 중일 것이다.

  • $ git chekcout new2 에서 commit --amend 해본다.

  1. push origin/master 하면 충돌난다.
  • 이경우, 혼자만 사용하는 git repo 라면, 포스 푸시
$ git push origin master -f


$ git rebase -i [branch new SHA]

e, edit <Commit>
:wq # vim 저장후 나감
(new2 commit) $ git commit --amend

  • 수정 후 나감
    (new2 commit) $ git rebase --continue

  • git push -f origin HEAD:main
    origin 저장소에게 현재 로컬의 HEAD를 origin/main으로 푸시
  • git push --force-with-lease [remote] [branch]
    로컬에서 보고 있는 remote/브랜치A가 진짜 remote에서 remote/브랜치A가 참조하고 있는 내용이 동일한 경우에만, 즉, 다른 누군가가 remote의 브랜치A에 push를 하지 않은 상태에서만 git push -f 를 실행


git checkout main


$ git merge origin/main
-> 충돌시
$ 충돌 수정
$ git add [modified file]
$ git commit -m"message"


git remote [option]

$ git remote [option]

리모트 저장소 추가

$ git remote add [저장소이름] [URL]

  • $ git remote add [저장소이름] [URL]

    잘먹힌다.

리모트 정보 조회

$ git remote show [저장소이름]

  • $ git remote show [저장소이름]

리모트 이름 변경

$ git remote rename [지금이름] [바꿀이름]

  • 리모트 이름 변경: $ git remote rename [지금 이름] [바꿀 이름]

리모트 삭제

$ git remote rm [삭제할 remote 저장소]

  • 리모트 삭제: $ git remote rm [삭제할 이름]

원격 저장소 URL 변경

$ git remote set-url [alias] [url]

$ git remote set-url [alias] [url]
  • alias: url에 대한 리모트 저장소 별칭 설정
  • url: 리모트 저장소 URL

  1. 원격 저장소 변경해보기
# 1. 기존 원격 저장소 확인
$ git remote -v	# 현재 local에서 remote 저장소 현황 체크
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)

# 2. 원격 저장소 변경
$ git remote set-url origin https://github.com/user/repo2.git
#  리모트 저장소 새로 설정하는데, 별칭은 origin, URL은 https://github.com/user/repo2.git 이다.

# 3. 원격 저장소 확인
$ git remote -v
origin https://github.com/user/repo2.git (fetch)
origin https://github.com/user/repo2.git (push)
# 바뀐 원격 저장소 확인

변경 후엔 꼭 update!

$ git remote update [alias]

$ git remote update [remote_alias]
  • remote_alias: 리모트 저장소 별칭을 지정해 Local에서 Update

  1. 위 예시에서 변경한 repo2.git에 대한 update
$ git remote update origin

Tag

  • 보통 Release 할 때 태그를 사용한다. (v1.0.0)

조회

$ git tag

  • $ git tag
    • 이 명령은 알파벳 순서태그를 보여준다.
$ git tag
v0.1
v0.3

$ git tag -l [pattern]

  • $ git tag -l 'v1.4.*'
    • -l 옵션으로 검색 패턴을 사용하여 태그 검색
$ git tag -l 'v.1.4.*'
v1.4.0
v1.4.1
v1.4.2
v1.4.3

현재 HEAD에서 최신 태그는?

$ git describe --tags --abbrev=0
2.3.12-3

붙이기

  • git tag는 Lightweight 태그와 Annotated 태그 두 종류가 있다.
    • Lightweight: 브랜치처럼 가리키는 지점을 최신 커밋으로 이동시키지 않는다. 단순히 특정 커밋에 대한 포인터
    • Annotated: Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 태그 메시지, GPG 서명.
    • 단순하게는 Lightweight 사용

Lightweight 태그

  • Lightweight 태그는 기본적으로 파일에 커밋 체크섬을 저장하는 것 뿐이다. 다른 정보는 저장하지 않는다.
    • Lightweight 태그를 만들 때는 -a, -s, -m등의 옵션을 사용하지 않는다.
    • 별도의 정보를 확인할 수 없고 커밋 정보만을 보여준다.
  • $ git tag <TAG_NAME> 으로 만든다.
    • tag명커밋 메시지가 태그명새 커밋이 만들어진다

$ git tag [TAG]

$ git tag [TAG]
  • dijkstra-2.0이라는 태그를 붙여 본다.
$ git tag dijkstra-2.0

Annotated

  • $ git tag -a [TAG NAME] -m 'MESSAGE'
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v1.4

$ git show v1.0

  • git show태그 정보커밋 정보를 모두 보여준다.
$ git show v1.0


$ git checkout [TAG]

  • $ git checkout tig-0.5 하면, 태그명 tig-0.5로 체크아웃된다.

태그 서명

  • GPG 개인키가 있으면 태그에 서명할 수 있다. 이 때는 -a 옵션 대신 -s 옵션을 사용한다.
    $ git tag -s v1.5 -m 'my signed 1.5 tag'
$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scoot Chacon <schacon@gee-mail.com>"
1024-bit DSA key, ID F721C45A, created 2009-02-09
  • 이 태그에 git show를 실행하면 GPG 서명도 볼 수 있다.

태그 검증

  • $ git tag -v [태그 이름]으로 서명한 태그 검증
    • GPG키를 사용하여 서명을 검증한다.
    • 서명자의 GPG 공개키가 필요하다. 이 공개키가 Keyring에 있어야만 이 명령이 성공적으로 실행된다.
$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700

GIT 1.4.2.1

Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
gpg:			aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
  • 만약 서명자의 공개키가 없으면 다음과 같은 메시지를 출력한다.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA Key ID
F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

태그 push

  • $ git push 명령은 자동으로 리모트 서버에 태그를 전송하지 않는다. 태그를 만들었으면 서버에 별도로 Push해야한다.
    • 브랜치를 공유하는 것과 같은 방법으로 할 수 있다.
  • $ git push [remote name] [Tag name]

한번에 태그 여러개 push

  • $ git push origin --tags

describe

$ git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>]
$ git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]
$ git describe <blob>

  • 커밋에서 접근가능한 최근 태그를 찾는 명령

태그명 찾기

$ git describe --always --match "*b"


스냅샷

  • 스냅샷: git에서 데이터를 저장하는 방식

  • origin file -> Modified -> Staged -> Committed: 세 단계를 지나면 하나의 스냅샷이 저장된다.

    • 위 3가지 과정은 모두 로컬에서 이뤄진다.
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글