- 커밋을 협업중인 원격 저장소에 push해버린 경우, 로컬 저장소에서 커밋을 취소해버리면 원격 저장소와 상태가 틀어짐
- 원격 저장소에서 force push를 금지하는 경우, 로컬 저장소의 변경사항을 push할 수 없게 됨
- 이런 경우에는 git revert로 특정 커밋의 내용을 되돌리는 커밋을 하는 방법을 사용
Git 저장소의 커밋 정보와 GitHub 사용자가 연결되는 원리
GitHub에 등록된 이메일을 user.email에 설정하고 커밋한 다음 GitHub 저장소에 Push하면 해당 이메일을 사용하는 GitHub 사용자로 자동으로 연결
로컬에서 user.email을 설정하는 것은 커밋의 작성자가 누구인지를 보장하지 않음.
다른 사용자의 이메일로 변경하고 커밋하면 GitHub에서는 다른 사람 프로필에 연결함
- GitHub에서는 Git 커밋의 이메일 정보를 사용해 GitHub 사용자를 매칭
- GitHub 하나의 계정에는 Primary 메일을 비롯해 추가 이메일 등록 가능
- 고유한 이메일 주소는 오직 하나의 계정에만 등록될 수 있기 때문에 이메일 주소로 GitHub 사용자와 매칭하는 것이 가능
Git 저장소의 커밋 과정
-
워킹 트리에서 파일 변경 작업
-
커밋할 내용을 stage해서 Index에 추가(git add)
-
커밋(git commit)
Git 설치
GIT 사용
Git config 리셋 (처음 설치하는 경우 생략해도 됨)
> git config --system --unset credential.helper
> git config --global --unset credential.helper
Git 사용자 이름과 이메일 설정
# 설정
> git config --global user.email "you@example.com"
> git config --global user.name "Your Name"
# 확인
> git config {user.email}
> git config {user.name}
# 삭제
> git config --global --unset {user.name}
> git config --global --unset {user.email}
repository 생성
처음 repository 생성시
> echo "readme file content" >> README.md
> git init
> git add README.md
> git commit -m "first commit"
[main xxxxxxx] first commit
1 file changed, 1 insertion(+)
create mode 160000 dirs
> git show xxxxxxx
commit xxxxxxx..................... (HEAD -> main)
Author: ......... <...........>
Date: ........... 2022 +0900
first commit
...........
> git branch -M {BRANCHES_NAME}
> git remote add {REPO_NAME} https://github.com/{USER_ID}/{REPOSITORY}.git
> git push -u {REPO_NAME} {BRANCHES_NAME}
기존 repository 사용시
> git remote add {REPO_NAME} https://github.com/{USER_ID}/{REPOSITORY}.git
> git branch -M {BRANCHES_NAME}
> git push -u {REPO_NAME} {BRANCHES_NAME}
! [rejected] main -> main (fetch first) 에러시
기존 저장소에 덮어쓴다. (<주의> 이전 저장소 자료 사라진다~)
> git push -u {REPO_NAME} +{BRANCHES_NAME}
예)
> git push -u origin +main
pull & push
# repository 가져오기
git pull {BRANCHES_NAME} {REPO_NAME}
# 다시 push
git push https://github.com/{USER_ID}/{REPOSITORY}.git
저장소 연결 끊기(제거)
현재 연결된 레파지토리 확인
> git remote -v
origin https://github.com/XXX/XXX.git (fetch)
origin https://github.com/XXX/XXX.git (push)
연결 제거
# 연결 제거
> git remote remove {REPO_NAME}
# 연결 제거 확인
> git remote -v
git add 취소 방법
저장소 초기화하고 한 번 도 커밋하지 않았을 때 git add한 내용 취소하기
> git add README.md
> git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
위 상태일때 취소 방법
> git rm --cached README.md
첫 커밋 이후 git add한 내용을 취소하는 경우
> git add README.md
> git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: License
위 상태일때 취소 방법
# restore를 사용할 경우 반드시 파일을 지정
git restore --staged [FILE...]
# Index에 반영된 모든 내용이 취소
git reset HEAD
# 해당 파일만 reset
git reset HEAD [FILE...]
브랜치를 삭제하는 방법
로컬 브랜치 목록을 확인
> git branch
# 또는
> git branch --list
# 필터 가능
> git branch --list 'ma*'
# 현재 활성화된 브랜치는 *로 보여짐
* main
삭제 명령어
git branch -d [BRANCH_NAME]
git branch --delete [BRANCH_NAME]
error: Cannot delete branch 'main' checked out at '........'
현재 브랜치가 삭제하고자 하는 브랜치 이기 때문이며 아래와 같이 브랜치를 전환한 후에 삭제
> git checkout sub
> git branch -d main
병합된(merged) 브랜치 생성 후 병합이 해제되어 삭제가 안될때 강제 삭제
> git branch -D [BRANCH_NAME]
> git branch --delete --force [BRANCH_NAME]
병합(merged) 예시
# main 브랜치가 활성화되어 있는 상태에서 basic 브랜치를 생성하면
> git branch basic
# HEAD와 해당 브랜치가 같기 때문에 merged 상태가 됨
> git branch --merged
basic
* main
> git branch --no-merged
# ...
git reset: 커밋 취소하기
- HEAD 위치를 바꿔버려서, 로컬 저장소의 상태를 커밋 이전 상태로 강제 변경
git reset 방법
커밋한 순서 111111 > 222222 > 333333
> git log --oneline
3333333 (HEAD -> main) second commit
2222222 first commit
1111111 Readme.md
333333을 취소하고 싶다면
# HEAD가 이전 커밋(222222)을 가리키도록
# --hard 옵션은 현재 HEAD에서 추가된 변경 사항들을 모두 되돌려줌
> git reset --hard 222222
# 또는 직전 커밋으로 되돌릴 경우
> git reset --hard HEAD^
# Git 저장소에서 관리 하지 않는 파일들(Untracked files)을 추가한 경우 git clean 으로 따로 삭제
# 삭제 대상(Untracked files) 목록 확인
> git clean -n
# Untracked files 파일 삭제
> git clean -f
삭제 후 git log와 git status 명령어로 현재 저장소 상태를 확인
> git log --oneline
222222 (HEAD -> main) first commit
111111 Readme.md
> git status
On branch main
nothing to commit, working tree clean
git revert: 커밋 내용 되돌리기
특정 커밋의 내용을 되돌리는 커밋
> git log --oneline
3333333 (HEAD -> main) second commit
2222222 first commit
1111111 Readme.md
333333 커밋을 되돌리는 경우
> git revert 333333
[main 333333] Revert "second commit"
1 file changed, 1 deletion(-)
delete mode 160000 ...............
결과 확인
> git log --oneline
444444 (HEAD -> main) Revert "second commit"
333333(origin/main) second commit
222222 Add .gitignore
111111 Readme.md
git commit –amend: 커밋 덮어쓰기
커밋의 내용을 덮어쓸 때는 git commit의 amend 옵션을 사용
수정할 내용을 스테이징에 반영하고 다음 명령어를 실행
> git commit --amend
amend의 옵션의 경우 스테이징에 추가된 내용을 반영해주는 동시에 커밋 메시지도 변경
변경할 내용이 없을 때도 커밋메시지를 변경하고 싶을 때 자주 사용
git pull:
리모트 서버의 최신 소스를 가져와서 로컬 소스에 병합(Merge)
> git pull # 현재 내 로컬 브랜치와 같은 이름을 가진 리모트 서버 브랜치가 타겟
> git pull origin master # origin 리모트 서버의 master 브랜치가 타겟
git fetch:
리모트 서버의 최신 이력을 내 클라이언트로 가져오되 병합은 하지 않음
> git fetch
리모트 서버에 새로 업데이트한 모든 내역을 받아옴
로컬에 있는 버전이 리모트 서버에 있는 버전보다 이전 버전이라면 pull 명령어를 사용하여 내 컴퓨터의 소스 코드를 갱신
> git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
fetch를 통해 리모트 서버의 최신 내용을 받아온 뒤, branch 명령어를 사용하여 리모트 서버에서는 삭제되었지만 로컬에는 남아있는 브랜치를 찾아서 싹 다 지워주는 스크립트
참고로 로컬에는 있지만 리모트에서 삭제된 브랜치는 브랜치 이름 뒤에 : gone이라는 문구가 붙어있기 때문에 구분이 가능
> git branch -v
* master fa0cec5 [origin/master] 마스터 브랜치에욤
test 1f3578f [origin/test: gone] 리모트에선 죽은 브랜치
test2 fa0cec5 로컬에서 만들어지고 리모트에 업데이트는 안된 브랜치
소스 코드 관리를 위한 Git 사용법 총 정리 참고
https://www.lainyzine.com/ko/article/summary-of-how-to-use-git-for-source-code-management/