commit --amend / remote / tag / describe / snapshot
커밋 수정(--amend
)
- 완료한 커밋을 수정해야할 때가 있다.
- 너무 일찍 커밋
- 어떤 파일 빼먹음
- 메시지 수정
- 주의: 수정 하려는 커밋이 다른 유저와 공유 중이라면 매우 주의 할것! 최종적으로
$ git push -f
를 동반하므로 동시 사용자에게 매우 귀찮음
- 같은 내용의 커밋이라도 커밋 해쉬가 변경되기 때문이다!
$ git commit --amend
- 커밋 메시지 변경
- 수정 사항 없이 바로
$ git commit --amend
커밋 메시지만 바꾸는 Editor가 뜬다.
- 어느 파일 빼먹고 커밋한 경우
$ git commit -m"Initial Commit"
# 커밋 햇는데 text.txt를 수정해야한다! 혹은 staged로 옮겨야한다!
# 수정 후...
$ git add text.txt # forgotten_file
$ git commit --amend # 커밋을 또 만들고 싶은게 아니라면 무조건 `--amend`
- 너무 일찍 커밋
- 어떤 파일 빼먹음
- 메시지 수정
$ git push -f
를 동반하므로 동시 사용자에게 매우 귀찮음- 같은 내용의 커밋이라도 커밋 해쉬가 변경되기 때문이다!
$ git commit --amend
- 커밋 메시지 변경
- 수정 사항 없이 바로
$ git commit --amend
커밋 메시지만 바꾸는 Editor가 뜬다.
- 수정 사항 없이 바로
- 어느 파일 빼먹고 커밋한 경우
$ git commit -m"Initial Commit"
# 커밋 햇는데 text.txt를 수정해야한다! 혹은 staged로 옮겨야한다!
# 수정 후...
$ git add text.txt # forgotten_file
$ git commit --amend # 커밋을 또 만들고 싶은게 아니라면 무조건 `--amend`
위 두개는 로컬에서 반영되었다. 문제는 리모트 저장소이다.
위에서 수정한 커밋이 remote 저장소에 업로드되어 있다면, 다른 유저는 이미 이전 커밋을 다운해서 사용 중일 것이다.
$ git chekcout new2
에서commit --amend
해본다.
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. 기존 원격 저장소 확인
$ 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
- 위 예시에서 변경한 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
붙이기
- git tag는 Lightweight 태그와 Annotated 태그 두 종류가 있다.
- Lightweight: 브랜치처럼 가리키는 지점을 최신 커밋으로 이동시키지 않는다. 단순히 특정 커밋에 대한 포인터
- Annotated: Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 태그 메시지, GPG 서명.
- 단순하게는 Lightweight 사용
$ 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 [삭제할 이름]
$ git remote set-url [alias] [url]
$ git remote set-url [alias] [url]
alias
: url에 대한 리모트 저장소 별칭 설정url
: 리모트 저장소 URL# 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)
# 바뀐 원격 저장소 확인
$ git remote update [alias]
$ git remote update [remote_alias]
remote_alias
: 리모트 저장소 별칭을 지정해 Local에서 Update$ git remote update origin
- 보통 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
붙이기
- git tag는 Lightweight 태그와 Annotated 태그 두 종류가 있다.
- Lightweight: 브랜치처럼 가리키는 지점을 최신 커밋으로 이동시키지 않는다. 단순히 특정 커밋에 대한 포인터
- Annotated: Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 태그 메시지, GPG 서명.
- 단순하게는 Lightweight 사용
Lightweight 태그
- Lightweight 태그는 기본적으로 파일에 커밋 체크섬을 저장하는 것 뿐이다. 다른 정보는 저장하지 않는다.
- Lightweight 태그를 만들 때는
-a, -s, -m
등의 옵션을 사용하지 않는다. - 별도의 정보를 확인할 수 없고 커밋 정보만을 보여준다.
- Lightweight 태그를 만들 때는
$ 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 <[email protected]>"
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 <[email protected]> 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 <[email protected]>"
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가지 과정은 모두 로컬에서 이뤄진다.
Author And Source
이 문제에 관하여(commit --amend / remote / tag / describe / snapshot), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@markyang92/Git-amend-remote-tag-squash
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ 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가지 과정은 모두 로컬에서 이뤄진다.
Author And Source
이 문제에 관하여(commit --amend / remote / tag / describe / snapshot), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@markyang92/Git-amend-remote-tag-squash저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)