프로젝트의 소스 코드 뿐만 아니라 그에 관련된 모든 변경사항과 개발 내역을 기록하고 관리할 수 있는
GIT에서의 작업흐름, 주요 명령어, 헷갈릴 수 있는 명령어 간의 차이점, 흔히 만날 수 있는 에러들을 적어보고자 한다.
----------------------------------------------------------------------------------------------------------------------
Git에서의 작업 흐름(3단계)
Working Directory : 현재 작업 중인 파일들이 있는 곳으로, 여기에는 Git의 관리를 받는 파일과 받지 않는 파일이 모두 존재한다. Git의 관리를 받지 않는 파일들은 Untracked 상태라고 표현한다.
↓
Index Stage(또는 Staging Area) : Git이 변경사항을 커밋하기 전에 준비하는 공간이다. Git에서 변경된 파일을 커밋하려면 먼저 해당 파일을 스테이징 해야한다. 즉, 변경사항을 임시로 저장하는 공간이며, git add 명령어를 통해 변경사항을 추가한다.
↓
HEAD : 현재 git이 가리키고 있는 커밋을 의미하며, 보통 가장 최근에 만든 커밋을 가리키는데, 브랜치를 이동하거나 커밋을 이동할 때 변경된다. git commit 명령어를 통해 인덱스에 있는 파일들의 변경 사항을 저장하면, 그 변경 사항이 새로운 커밋으로 기록되고 HEAD는 그 새로운 커밋을 가리키게 된다.
----------------------------------------------------------------------------------------------------------------------
주요 명령어 (개인적으로 많이 쓰는 명령어들은 bold 처리하였다.)
git init // 새로운 git 저장소를 초기화하여, 현재 디렉토리를 git 저장소로 설정한다.
git add 파일명 // 원하는 파일의 변경 사항을 스테이징 영역(Index)에 추가한다.
cf) git add . // 현재 디렉토리 내 모든 변경사항을 스테이지 영역에 추가한다.
git commit -m "메시지" // 스테이징 영역에 추가된 변경 사항을 "메시지"라는 커밋메시지와 함께 키 저장소에 영구적으로 기록한다.
git commit -am "메시지" // add와 commit을 연달아 실행한다.
git commit --amend // 방금 전 커밋 메시지 수정
git status // 현재 저장소의 상태를 확인합니다. 변경된 파일, 스테이징된 파일, 현재 브랜치 등의 정보를 볼 수 있다.
git branch // 현재 로컬에 있는 브랜치 목록을 보여준다.
git branch <branch_name> // 새로운 브랜치를 생성한다.
git branch -d <branch_name>: 지정된 브랜치를 삭제한다. -d 옵션은 해당 브랜치가 이미 병합된 경우에만 삭제를 허용한다.
git branch -D <branch_name>: 지정된 브랜치를 강제로 삭제한다. 병합되지 않은 변경 사항이 있어도 삭제한다.
git branch -r: 원격 저장소의 브랜치 목록을 보여준다.
git branch -a: 로컬과 원격 저장소의 모든 브랜치를 보여준다.
git checkout <branch_name> // 브랜치를 전환한다.
git checkout -b <new_branch_name> // 새로운 브랜치를 생성하고 그 브랜치로 전환한다.
git checkout <commit_hash> // 특정 커밋의 상태로 워킹 디렉토리를 변경한다.
git checkout <commit_hash> -- <file> // 워킹 디렉토리의 특정 파일을 이전 커밋 상태로 되돌린다.
git checkout - // 이전 브랜치로 빠르게 전환한다.
git checkout -t <remote_name>/<branch_name> // 원격 브랜치를 로컬로 가져온다.
git checkout -- <file> // 커밋되지 않은 변경 사항 되돌린다.
git switch <branch_name> // 브랜치를 전환한다.
git switch -c <new_branch_name> // 새로운 브랜치를 생성하고 그 브랜치로 전환한다.
git merge <branch_name> // 지정된 브랜치의 변경사항을 현재 브랜치에 병합한다.
git pull <repository> <branch_name> // 지정된 원격 저장소의 특정 브랜치를 현재 브랜치에 병합한다.
git push <repository> <branch_name> // 현재 브랜치의 변경사항을 지정된 원격 저장소의 특정 브랜치에 반영한다.
git push -u <repository> <branch_name> // 현재 브랜치의 변경사항을 지정된 원격 저장소의 특정 브랜치에 반영하고, 추후 해당 원격 브랜치를 기본적으로 추적하도록 설정한다.
git push <repository> --delete <branch_name> // 원격 저장소의 특정 브랜치를 삭제한다.
git remote -v // 등록된 원격 저장소의 목록을 보여준다.
git remote add <name> <url> // 새로운 원격 저장소를 추가한다.
git remote rm <name> // 원격 저장소를 삭제한다.
git remote rename <old_name> <new_name> // 원격 저장소의 이름을 변경한다.
git remote set-url <name> <new_url> // 원격 저장소의 URL을 변경한다.
git reset --hard <commit> // 현재 브랜치를 지정된 커밋으로 이동시키고, 작업 디렉토리와 스테이징 영역을 해당 커밋의 상태로 되돌린다.
git reset --soft <commit> // 현재 브랜치를 지정된 커밋으로 이동시키지만, 작업 디렉토리와 스테이징 영역은 변경하지 않는다.
git reset <file> // 지정된 파일의 스테이징을 취소합니다. 작업 디렉토리의 내용은 변경하지 않는다.
* 개인 프로젝트가 아닌, 팀 프로젝트시 가급적이면 reset을 사용하는 경우는 지양해야 한다.
git revert <commit> : 지정된 커밋의 변경사항을 되돌리는 새로운 커밋을 생성한다. 커밋 히스토리를 변경하지 않고 이전 커밋을 되돌릴 때 사용된다. 특히 퍼블릭 레포지토리에서 중요한 역할을 한다. 왜냐하면 이는 이전 커밋을 안전하게 되돌리면서도 커밋 히스토리를 유지할 수 있기 때문이다.
git fetch // 원격 저장소의 최신 커밋을 가져와서 원격 브랜치를 업데이트합니다. 이때 변경사항은 로컬 브랜치에는 반영되지 않는다.
git fetch <repository> // 지정된 원격 저장소의 최신 커밋을 가져와서 원격 브랜치를 업데이트한다.
git fetch <repository> <branch_name> // 지정된 원격 저장소의 특정 브랜치를 가져와서 원격 브랜치를 업데이트한다.
git rebase <branch_name> // 현재 브랜치의 커밋들을 지정된 브랜치 위로 옮긴다. 이를 통해 브랜치의 커밋 히스토리를 깔끔하게 유지할 수 있다.
git rebase --abort // 현재 진행 중인 rebase 작업을 취소한다
git stash (-m "메시지") // 현재 작업 중인 내용을 임시로 저장하고 작업 디렉토리를 깨끗하게 만든다. 이를 통해 다른 브랜치로 전환하거나 다른 작업을 하기 좋은 상태로 만들 수 있다. 메시지는 희망하면 작성하면 된다.
git stash pop // 가장 최근에 저장된 임시 작업을 복구하고 그 임시 작업을 삭제한다.
git stash apply // 가장 최근에 저장된 임시 작업을 복구합니다. 이때 임시 작업은 삭제되지 않는다.
git stash list // 저장된 모든 임시 작업을 보여준다.
git stash drop // 가장 최근에 저장된 임시 작업을 삭제한다.
git log: 각 커밋의 해시, 저자, 날짜, 커밋 메시지를 담은 히스토리를 보여준다.
git log --oneline: 커밋의 해시와 메시지만 한 줄로 간략하게 보여준다
git log --graph: 커밋 히스토리를 그래프 형태로 보여줘서, 브랜치와 병합의 모습을 한눈에 볼 수 있다.
git log --stat: 각 커밋에 대해 어떤 파일이 수정되었는지, 얼마나 많은 줄이 변경되었는지 보여준다.
git log -p 또는 git log --patch: 각 커밋의 diff를 보여준다. 즉, 각 커밋에서 어떤 내용이 추가되거나 삭제되었는지 확인할 수 있다.
git log <file>: 지정된 파일의 커밋 히스토리만 보여준다.
git log <since>..<until>: 지정된 시간 범위에 해당하는 커밋만 보여준다. 시간은 다양한 형식으로지정할 수 있습니다. 예를 들어, git log HEAD~5의 경우 HEAD는 최근 5개의 커밋을 보여준다.
git diff: 작업 디렉토리와 스테이징 영역 사이의 차이점을 보여준다.
git diff --staged: 스테이징 영역과 마지막 커밋 사이의 차이점을 보여준다.
git diff <commit1>..<commit2>: 두 개의 커밋 사이의 차이점을 보여준다.
git clone -b <branch_name> <url> : 해당 저장소의 특정 브랜치를 클론해온다.
----------------------------------------------------------------------------------------------------------------------
헷갈릴 수 있는 명령어 간의 차이점
'git merge' vs 'pull request' :
공통점 :
변경사항을 합치는 역할
차이점 :
git merge는 주로 로컬에서 개인 프로젝트를 할 때, 브랜치의 변경사항을 직접 병합하지만,
pull request는 원격 저장소에서 merge를 수행하는 것으로 볼 수 있지만, 그 과정에 다른 사람들이 변경사항을 확인하고 충분히 리뷰할 수 있어, 코드 리뷰나 협업을 가능하게 한다.
'git pull' vs 'git fetch':
공통점 :
브랜치에서 변경사항을 불러오는 목적
차이점 :
git pull은 'git fetch' + 'git merge'를 한 번에 수행하는 명령어로, 원격저장소의 변경사항을 가져와 현재 브랜치에 바로 병합한다.
git fetch는 원격저장소의 변경사항을 가져오되, 병합은 수행하지 않는다. 주로 변경사항을 확인한 후에 별도로 'git merge'를 통해 병합한다.
'git checkout' vs 'git switch':
공통점 :
브랜치를 변경하는 목적
차이점 :
git checkout은 브랜치 변경, 작업 트리 변경, 파일을 특정 커밋 상태로 되돌리는 등 다양한 기능을 가지고 있다.
git switch는 브랜치 변경에 특화된 명령어입니다. 브랜치를 생성하면서 변경하거나, 임시적으로 변경하는 등의 명령어가 포함되어 있다.
'git revert' vs 'git reset':
공통점 :
과거의 특정 커밋 상태로 되돌아가는 목적
차이점 :
git revert <commit>는 해당 커밋을 취소하는 새로운 커밋을 생성하고, 변경사항은 히스토리에 남아서, 공동 작업 환경에서 안전하게 사용할 수 있는 방법입니다.
git reset --hard <commit>는 해당 커밋으로 HEAD를 강제 이동시키고, 그 이후의 커밋 히스토리를 제거한다. 주로 로컬에서의 작업을 잘못 수행했을 때 사용하는 방법이며, 공동 작업 환경에서는 주의가 필요하다.
'git stash' vs 'git branch':
공통점 :
현재의 작업 상태를 저장하고 변경하는 목적
차이점 :
git stash는 현재의 작업 상태를 임시로 저장하고, 워킹 디렉토리를 깨끗한 상태로 되돌린다. 이는 다른 브랜치로 전환하거나, 현재 브랜치에서 다른 작업을 수행할 때 유용하게 사용된다.
git branch <branch_name>는 새로운 브랜치를 생성한다. 이는 기능 개발, 버그 수정 등 다양한 작업을 독립적으로 수행할 때 사용되며, 기존의 작업 상태는 그대로 유지된다.
----------------------------------------------------------------------------------------------------------------------
GIT에서 작업하면서 흔히 만날 수 있는 에러 모음
1.
error: pathspec 'refactoring' did not match any file(s) known to git
=>
원인:
브랜치를 전환하려 할 때, 브랜치가 업데이트가 안되어 생기는 결과
해결방안:
git remote update // 원격 저장소의 모든 브랜치를 업데이트하여, 원격 저장소의 최신 정보를 로컬에 반영한다.
↓
git fetch // 원격 저장소의 데이터를 가져와 로컬에 저장한다.
↓
git switch 브랜치명 // 이동하려던 특정 브랜치로 이동
2.
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/깃허브닉네임/저장소명'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
원인:
원격저장소와 현재 작업중인 로컬저장소가 동기화되지 않았을 때 발생한다. 동기화되지 않은 상태에서 다시 push하면 데이터가 소실될 수 있어 하고 경고해주는 것이다.
해결방안(2가지):
1. git pull --rebase origin 브랜치명 // --rebase 옵션으로 로컬에서의 변경사항을 일시적으로 제거하고, 원격 저장소의 변경사항을 받아와 다시 로컬의 변경사항을 적용하여 동기화한다.
2. git push origin +브랜치명 // '+' 기호는 강제 푸시를 의미하며, 이를 통해 원격 저장소의 기존 변경사항을 무시하고 로컬의 변경사항을 원격 저장소에 적용한다.
*2번의 경우 pull되지 않은 변경사항은 소실되기에 주의해야 한다.
3.
error: Your local changes to the following files would be overwritten by merge:
<file>
Please commit your changes or stash them before you merge.
원인:
현재 작업 중인 파일이 있으나 아직 커밋하지 않았을 때, git pull 또는 git merge 등을 수행하려 하면 발생하는 에러이다.
해결방안(3가지):
1. git add <file> git commit -m "Commit message" // 변경 사항을 커밋한다.
2. git stash // 변경 사항을 임시로 저장한다.
3. git checkout -- <file> // 변경 사항을 버린다.
4.
fatal: Not a git repository (or any of the parent directories): .git
원인:
현재 작업 중인 디렉토리가 git 저장소가 아닐 때 발생하는 에러
해결방안:
git init // 작업 중인 디렉토리 위치를 다시 확인하고, 해당 위치에서 git을 초기화
5.
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to '<remote-url>'
원인:
주로 원격 저장소에 푸시할 때 발생하는 에러로, pre-receive hook이 거절했을 때 나타난다. 이는 원격 저장소의 규칙에 위반되는 커밋이나, 저장소에 대한 권한이 없는 경우 발생한다.
해결방안(2가지):
1. 커밋 메시지, 커밋 내용 등이 원격 저장소의 규칙에 맞는지 확인한다.
2. 원격 저장소에 대한 쓰기 권한이 있는지 확인한다.
6.
error: failed to push some refs to 'git@github.com:username/repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
원인:
로컬 저장소가 원격 저장소의 최신 상태를 반영하지 않고 푸시를 시도할 때 발생하는 에러이다.
해결방안:
git pull을 사용하여 원격 저장소의 최신 변경사항을 로컬 저장소에 반영한 후 다시 푸시를 시도한다.
(branch가 맞는 지도 확인해야한다.)
ex)
git pull origin master
git push origin master
------------------------------------------------------------------------------------
GIT에서 빈 상태로 새로운 브랜치를 만드는 방법
기본적으로 새로운 브랜치를 생성할 때, 현재 위치한 브랜치의 상태를 복사하기에,
기존 브랜치와 관계없이 다른 작업을 하고 싶다면 별도의 조치가 필요하다.
git init // 저장소 초기화 => 이미 init 되어있다면 당연히 하지않아도 된다.
git check out -b new-branch // 새로운 브랜치를 만들고 이동
git rm filename // 새로 만든 브랜치에서 원하는 파일 삭제
git commit -m "Remove files" // 변경사항 커밋
git checkout main // 변경사항을 커밋한 후에는 항상 원래의 브랜치로 돌아가야 한다.
------------------------------------------------------------------------------------
협업간에 필요한 Git의 Flow전략이나 이에 도움되는 것들은 다른 포스팅에서 남겨볼 예정이다.
프로젝트의 소스 코드 뿐만 아니라 그에 관련된 모든 변경사항과 개발 내역을 기록하고 관리할 수 있는
GIT에서의 작업흐름, 주요 명령어, 헷갈릴 수 있는 명령어 간의 차이점, 흔히 만날 수 있는 에러들을 적어보고자 한다.
----------------------------------------------------------------------------------------------------------------------
Git에서의 작업 흐름(3단계)
Working Directory : 현재 작업 중인 파일들이 있는 곳으로, 여기에는 Git의 관리를 받는 파일과 받지 않는 파일이 모두 존재한다. Git의 관리를 받지 않는 파일들은 Untracked 상태라고 표현한다.
↓
Index Stage(또는 Staging Area) : Git이 변경사항을 커밋하기 전에 준비하는 공간이다. Git에서 변경된 파일을 커밋하려면 먼저 해당 파일을 스테이징 해야한다. 즉, 변경사항을 임시로 저장하는 공간이며, git add 명령어를 통해 변경사항을 추가한다.
↓
HEAD : 현재 git이 가리키고 있는 커밋을 의미하며, 보통 가장 최근에 만든 커밋을 가리키는데, 브랜치를 이동하거나 커밋을 이동할 때 변경된다. git commit 명령어를 통해 인덱스에 있는 파일들의 변경 사항을 저장하면, 그 변경 사항이 새로운 커밋으로 기록되고 HEAD는 그 새로운 커밋을 가리키게 된다.
----------------------------------------------------------------------------------------------------------------------
주요 명령어 (개인적으로 많이 쓰는 명령어들은 bold 처리하였다.)
git init // 새로운 git 저장소를 초기화하여, 현재 디렉토리를 git 저장소로 설정한다.
git add 파일명 // 원하는 파일의 변경 사항을 스테이징 영역(Index)에 추가한다.
cf) git add . // 현재 디렉토리 내 모든 변경사항을 스테이지 영역에 추가한다.
git commit -m "메시지" // 스테이징 영역에 추가된 변경 사항을 "메시지"라는 커밋메시지와 함께 키 저장소에 영구적으로 기록한다.
git commit -am "메시지" // add와 commit을 연달아 실행한다.
git commit --amend // 방금 전 커밋 메시지 수정
git status // 현재 저장소의 상태를 확인합니다. 변경된 파일, 스테이징된 파일, 현재 브랜치 등의 정보를 볼 수 있다.
git branch // 현재 로컬에 있는 브랜치 목록을 보여준다.
git branch <branch_name> // 새로운 브랜치를 생성한다.
git branch -d <branch_name>: 지정된 브랜치를 삭제한다. -d 옵션은 해당 브랜치가 이미 병합된 경우에만 삭제를 허용한다.
git branch -D <branch_name>: 지정된 브랜치를 강제로 삭제한다. 병합되지 않은 변경 사항이 있어도 삭제한다.
git branch -r: 원격 저장소의 브랜치 목록을 보여준다.
git branch -a: 로컬과 원격 저장소의 모든 브랜치를 보여준다.
git checkout <branch_name> // 브랜치를 전환한다.
git checkout -b <new_branch_name> // 새로운 브랜치를 생성하고 그 브랜치로 전환한다.
git checkout <commit_hash> // 특정 커밋의 상태로 워킹 디렉토리를 변경한다.
git checkout <commit_hash> -- <file> // 워킹 디렉토리의 특정 파일을 이전 커밋 상태로 되돌린다.
git checkout - // 이전 브랜치로 빠르게 전환한다.
git checkout -t <remote_name>/<branch_name> // 원격 브랜치를 로컬로 가져온다.
git checkout -- <file> // 커밋되지 않은 변경 사항 되돌린다.
git switch <branch_name> // 브랜치를 전환한다.
git switch -c <new_branch_name> // 새로운 브랜치를 생성하고 그 브랜치로 전환한다.
git merge <branch_name> // 지정된 브랜치의 변경사항을 현재 브랜치에 병합한다.
git pull <repository> <branch_name> // 지정된 원격 저장소의 특정 브랜치를 현재 브랜치에 병합한다.
git push <repository> <branch_name> // 현재 브랜치의 변경사항을 지정된 원격 저장소의 특정 브랜치에 반영한다.
git push -u <repository> <branch_name> // 현재 브랜치의 변경사항을 지정된 원격 저장소의 특정 브랜치에 반영하고, 추후 해당 원격 브랜치를 기본적으로 추적하도록 설정한다.
git push <repository> --delete <branch_name> // 원격 저장소의 특정 브랜치를 삭제한다.
git remote -v // 등록된 원격 저장소의 목록을 보여준다.
git remote add <name> <url> // 새로운 원격 저장소를 추가한다.
git remote rm <name> // 원격 저장소를 삭제한다.
git remote rename <old_name> <new_name> // 원격 저장소의 이름을 변경한다.
git remote set-url <name> <new_url> // 원격 저장소의 URL을 변경한다.
git reset --hard <commit> // 현재 브랜치를 지정된 커밋으로 이동시키고, 작업 디렉토리와 스테이징 영역을 해당 커밋의 상태로 되돌린다.
git reset --soft <commit> // 현재 브랜치를 지정된 커밋으로 이동시키지만, 작업 디렉토리와 스테이징 영역은 변경하지 않는다.
git reset <file> // 지정된 파일의 스테이징을 취소합니다. 작업 디렉토리의 내용은 변경하지 않는다.
* 개인 프로젝트가 아닌, 팀 프로젝트시 가급적이면 reset을 사용하는 경우는 지양해야 한다.
git revert <commit> : 지정된 커밋의 변경사항을 되돌리는 새로운 커밋을 생성한다. 커밋 히스토리를 변경하지 않고 이전 커밋을 되돌릴 때 사용된다. 특히 퍼블릭 레포지토리에서 중요한 역할을 한다. 왜냐하면 이는 이전 커밋을 안전하게 되돌리면서도 커밋 히스토리를 유지할 수 있기 때문이다.
git fetch // 원격 저장소의 최신 커밋을 가져와서 원격 브랜치를 업데이트합니다. 이때 변경사항은 로컬 브랜치에는 반영되지 않는다.
git fetch <repository> // 지정된 원격 저장소의 최신 커밋을 가져와서 원격 브랜치를 업데이트한다.
git fetch <repository> <branch_name> // 지정된 원격 저장소의 특정 브랜치를 가져와서 원격 브랜치를 업데이트한다.
git rebase <branch_name> // 현재 브랜치의 커밋들을 지정된 브랜치 위로 옮긴다. 이를 통해 브랜치의 커밋 히스토리를 깔끔하게 유지할 수 있다.
git rebase --abort // 현재 진행 중인 rebase 작업을 취소한다
git stash (-m "메시지") // 현재 작업 중인 내용을 임시로 저장하고 작업 디렉토리를 깨끗하게 만든다. 이를 통해 다른 브랜치로 전환하거나 다른 작업을 하기 좋은 상태로 만들 수 있다. 메시지는 희망하면 작성하면 된다.
git stash pop // 가장 최근에 저장된 임시 작업을 복구하고 그 임시 작업을 삭제한다.
git stash apply // 가장 최근에 저장된 임시 작업을 복구합니다. 이때 임시 작업은 삭제되지 않는다.
git stash list // 저장된 모든 임시 작업을 보여준다.
git stash drop // 가장 최근에 저장된 임시 작업을 삭제한다.
git log: 각 커밋의 해시, 저자, 날짜, 커밋 메시지를 담은 히스토리를 보여준다.
git log --oneline: 커밋의 해시와 메시지만 한 줄로 간략하게 보여준다
git log --graph: 커밋 히스토리를 그래프 형태로 보여줘서, 브랜치와 병합의 모습을 한눈에 볼 수 있다.
git log --stat: 각 커밋에 대해 어떤 파일이 수정되었는지, 얼마나 많은 줄이 변경되었는지 보여준다.
git log -p 또는 git log --patch: 각 커밋의 diff를 보여준다. 즉, 각 커밋에서 어떤 내용이 추가되거나 삭제되었는지 확인할 수 있다.
git log <file>: 지정된 파일의 커밋 히스토리만 보여준다.
git log <since>..<until>: 지정된 시간 범위에 해당하는 커밋만 보여준다. 시간은 다양한 형식으로지정할 수 있습니다. 예를 들어, git log HEAD~5의 경우 HEAD는 최근 5개의 커밋을 보여준다.
git diff: 작업 디렉토리와 스테이징 영역 사이의 차이점을 보여준다.
git diff --staged: 스테이징 영역과 마지막 커밋 사이의 차이점을 보여준다.
git diff <commit1>..<commit2>: 두 개의 커밋 사이의 차이점을 보여준다.
git clone -b <branch_name> <url> : 해당 저장소의 특정 브랜치를 클론해온다.
----------------------------------------------------------------------------------------------------------------------
헷갈릴 수 있는 명령어 간의 차이점
'git merge' vs 'pull request' :
공통점 :
변경사항을 합치는 역할
차이점 :
git merge는 주로 로컬에서 개인 프로젝트를 할 때, 브랜치의 변경사항을 직접 병합하지만,
pull request는 원격 저장소에서 merge를 수행하는 것으로 볼 수 있지만, 그 과정에 다른 사람들이 변경사항을 확인하고 충분히 리뷰할 수 있어, 코드 리뷰나 협업을 가능하게 한다.
'git pull' vs 'git fetch':
공통점 :
브랜치에서 변경사항을 불러오는 목적
차이점 :
git pull은 'git fetch' + 'git merge'를 한 번에 수행하는 명령어로, 원격저장소의 변경사항을 가져와 현재 브랜치에 바로 병합한다.
git fetch는 원격저장소의 변경사항을 가져오되, 병합은 수행하지 않는다. 주로 변경사항을 확인한 후에 별도로 'git merge'를 통해 병합한다.
'git checkout' vs 'git switch':
공통점 :
브랜치를 변경하는 목적
차이점 :
git checkout은 브랜치 변경, 작업 트리 변경, 파일을 특정 커밋 상태로 되돌리는 등 다양한 기능을 가지고 있다.
git switch는 브랜치 변경에 특화된 명령어입니다. 브랜치를 생성하면서 변경하거나, 임시적으로 변경하는 등의 명령어가 포함되어 있다.
'git revert' vs 'git reset':
공통점 :
과거의 특정 커밋 상태로 되돌아가는 목적
차이점 :
git revert <commit>는 해당 커밋을 취소하는 새로운 커밋을 생성하고, 변경사항은 히스토리에 남아서, 공동 작업 환경에서 안전하게 사용할 수 있는 방법입니다.
git reset --hard <commit>는 해당 커밋으로 HEAD를 강제 이동시키고, 그 이후의 커밋 히스토리를 제거한다. 주로 로컬에서의 작업을 잘못 수행했을 때 사용하는 방법이며, 공동 작업 환경에서는 주의가 필요하다.
'git stash' vs 'git branch':
공통점 :
현재의 작업 상태를 저장하고 변경하는 목적
차이점 :
git stash는 현재의 작업 상태를 임시로 저장하고, 워킹 디렉토리를 깨끗한 상태로 되돌린다. 이는 다른 브랜치로 전환하거나, 현재 브랜치에서 다른 작업을 수행할 때 유용하게 사용된다.
git branch <branch_name>는 새로운 브랜치를 생성한다. 이는 기능 개발, 버그 수정 등 다양한 작업을 독립적으로 수행할 때 사용되며, 기존의 작업 상태는 그대로 유지된다.
----------------------------------------------------------------------------------------------------------------------
GIT에서 작업하면서 흔히 만날 수 있는 에러 모음
1.
error: pathspec 'refactoring' did not match any file(s) known to git
=>
원인:
브랜치를 전환하려 할 때, 브랜치가 업데이트가 안되어 생기는 결과
해결방안:
git remote update // 원격 저장소의 모든 브랜치를 업데이트하여, 원격 저장소의 최신 정보를 로컬에 반영한다.
↓
git fetch // 원격 저장소의 데이터를 가져와 로컬에 저장한다.
↓
git switch 브랜치명 // 이동하려던 특정 브랜치로 이동
2.
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/깃허브닉네임/저장소명'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
원인:
원격저장소와 현재 작업중인 로컬저장소가 동기화되지 않았을 때 발생한다. 동기화되지 않은 상태에서 다시 push하면 데이터가 소실될 수 있어 하고 경고해주는 것이다.
해결방안(2가지):
1. git pull --rebase origin 브랜치명 // --rebase 옵션으로 로컬에서의 변경사항을 일시적으로 제거하고, 원격 저장소의 변경사항을 받아와 다시 로컬의 변경사항을 적용하여 동기화한다.
2. git push origin +브랜치명 // '+' 기호는 강제 푸시를 의미하며, 이를 통해 원격 저장소의 기존 변경사항을 무시하고 로컬의 변경사항을 원격 저장소에 적용한다.
*2번의 경우 pull되지 않은 변경사항은 소실되기에 주의해야 한다.
3.
error: Your local changes to the following files would be overwritten by merge:
<file>
Please commit your changes or stash them before you merge.
원인:
현재 작업 중인 파일이 있으나 아직 커밋하지 않았을 때, git pull 또는 git merge 등을 수행하려 하면 발생하는 에러이다.
해결방안(3가지):
1. git add <file> git commit -m "Commit message" // 변경 사항을 커밋한다.
2. git stash // 변경 사항을 임시로 저장한다.
3. git checkout -- <file> // 변경 사항을 버린다.
4.
fatal: Not a git repository (or any of the parent directories): .git
원인:
현재 작업 중인 디렉토리가 git 저장소가 아닐 때 발생하는 에러
해결방안:
git init // 작업 중인 디렉토리 위치를 다시 확인하고, 해당 위치에서 git을 초기화
5.
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to '<remote-url>'
원인:
주로 원격 저장소에 푸시할 때 발생하는 에러로, pre-receive hook이 거절했을 때 나타난다. 이는 원격 저장소의 규칙에 위반되는 커밋이나, 저장소에 대한 권한이 없는 경우 발생한다.
해결방안(2가지):
1. 커밋 메시지, 커밋 내용 등이 원격 저장소의 규칙에 맞는지 확인한다.
2. 원격 저장소에 대한 쓰기 권한이 있는지 확인한다.
6.
error: failed to push some refs to 'git@github.com:username/repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
원인:
로컬 저장소가 원격 저장소의 최신 상태를 반영하지 않고 푸시를 시도할 때 발생하는 에러이다.
해결방안:
git pull을 사용하여 원격 저장소의 최신 변경사항을 로컬 저장소에 반영한 후 다시 푸시를 시도한다.
(branch가 맞는 지도 확인해야한다.)
ex)
git pull origin master
git push origin master
------------------------------------------------------------------------------------
GIT에서 빈 상태로 새로운 브랜치를 만드는 방법
기본적으로 새로운 브랜치를 생성할 때, 현재 위치한 브랜치의 상태를 복사하기에,
기존 브랜치와 관계없이 다른 작업을 하고 싶다면 별도의 조치가 필요하다.
git init // 저장소 초기화 => 이미 init 되어있다면 당연히 하지않아도 된다.
git check out -b new-branch // 새로운 브랜치를 만들고 이동
git rm filename // 새로 만든 브랜치에서 원하는 파일 삭제
git commit -m "Remove files" // 변경사항 커밋
git checkout main // 변경사항을 커밋한 후에는 항상 원래의 브랜치로 돌아가야 한다.
------------------------------------------------------------------------------------
협업간에 필요한 Git의 Flow전략이나 이에 도움되는 것들은 다른 포스팅에서 남겨볼 예정이다.