깃허브 심화 가이드
1. git undoing
git의 작업단계 3가지
1) working directory
현재 작업 공간에서 수정한 파일 내용을 이전 commit 상태로 되돌림
- git restore
2) staging area
staging area에 반영된 파일은 working directory에 되돌림
- git rm --cached
- git restore --staged
3) repository
commit을 완료한 파일을 staging area로 되돌림
- git commit --amend
2. git restore {파일 이름}
working directory에서 수정한 파일을 수정 전(직전 commit)으로 되돌리기
이미 git에 의해 버전관리가 되고 있는 파일만 가능함(staging area에 올라가 commit이 된적이 있었던 것만)
git restore로 되돌리면 해당 내용은 복원 불가능함
commit으로 3번 올려서 ver3까지 관리되고 있던 a.txt
4번째 수정으로 ver4까지 했는데... add는 하지 않았음(staging area로 올라가지 않았음)
이때 git restore a.txt로 ver3으로 되돌린다
add로 staging area로 올리기 전의 수정버전을 이전 버전으로 되돌리는 것이 git restore
2-1) 예시
git init으로 최초 저장소 초기화
touch test.md로 테스트 파일 생성
git add test.md
git commit test.md -m "~"
add, commit 수행
파일을 수정해보고, git restore test.md를 수행하면.. 진짜로 수정한 내용이 사라짐
3. staging area 작업 단계를 되돌리는 방법
staging area에 반영된 파일을 working directory에 되돌림(unstage)
root commit이 없는 경우 : git rm --cached {파일이름}
위와 같이 commit이 없는 경우에 되돌리는 명령어
(예시)
git init 초기화하고
touch test.md로 파일 생성
파일을 수정 후 git add test.md
git status로 현재 상태 확인
현재 test.md가 staging area에 있고, git rm --cached (파일명)으로 unstage할 수 있다고 친절하게 나와있음
untracking 된 것을 확이한다
root commit이 있는 경우 : git restore --staged {파일 이름}
git 저장소에 한 개 이상의 commit을 수행한 경우
(예시)
git 저장소 초기화 >>git init
test.md 파일 생성 >>touch test.md
git add test.md
git commit test.md
파일 수정 후 git add test.md
아까는 git rm --cached로 되돌리라고 나와있는데, 이번에는 git restore --staged로 되돌릴 수 있다고 나와있음
git restore --staged test.md로 되돌아 간 것을 확인
4. git commit --amend
커밋 완료한 파일을 staging area로 되돌리기
상황 별로 두 가지 기능으로 나뉜다.
staging area에 새로 올라온 내용이 없으면, 직전 커밋의 메시지만 수정함
(예시)
git init
touch test.md
파일 수정, git add
git commit
git commit --amend
위에 message가 직전 commit 메시지이고, 이걸 수정하기 위해 i 버튼 누르고
지운다음에 변경
esc누르고 편집모드 탈출
:wq 치고 엔터
git reflog로 상태 확인
staging area에 새로 올라온 내용이 있다면, 직전 커밋을 덮어쓴다
staging area에 새로 올라온 내용이 있다면, 파일의 수정사항이 존재한다
그래서 파일 커밋 자체를 덮어 씌운다는 느낌
(예시)
git init
touch test.md
파일 수정 후 git add
git commit
다시 파일 수정 후에 git add로 staging 에 올림
다시 git commit --amend
(git commit --amend하기 전에)
(git commit --amend하고 나서 message를 수정)
근데 두 경우가 솔직히 큰 차이가 있나..?
5. git reset
시계를 마치 과거로 돌리는 듯한 행위
프로젝트를 특정 커밋 버전 상태로 되돌린다
특정 커밋으로 되돌아가면, 해당 커밋 이후에 쌓았던 커밋들은 전부 사라진다
--soft : 해당 커밋으로 되돌아가고, 되돌아간 커밋 이후 파일은 staging area로 되돌리기
--mixed: 기본값, 되돌아간 커밋 이후 파일은 working directory로 되돌리기
--hard : 되돌아간 커밋 이후 파일은 working directory에서 모두 삭제함
실습파일로 직접 확인해봐야할듯..vscode아니면 보기가 어렵
6. git reflog
과거 커밋 내역을 모두 조회
reset하기 전 내용도 조회가능함
--hard로 삭제했다고 하더라도, git reflog로 조회한, 이전의 내용으로 reset하면 복구 가능하다는데..?
여기에 id가 남아있다면, reset이 가능한가봐
7. git revert (취소하고자 하는 id)
과거를 없던 일로 만드는 행위
이전 커밋을 취소한다는 새로운 커밋을 생성함
reset은 이전 커밋을 삭제하고, 되돌아가지만
revert는 이전 커밋들을 모두 남겨준다
git revert 5se2bf4라고 하면 5se2bf4라는 commit id 1개를 취소한다고 하는 새로운 커밋을 생성
revert는 깃허브를 이용해 협업할때 커밋 내역의 차이로 인한 충돌 방지
실제로 1.txt를 만든 커밋을 취소한다고 했더니, 1.txt가 없어지고... 취소했다는 커밋이 1개 더 늘어나있음
8. git branch & git switch
독립 공간 branch를 형성
원본 master에 대해 안전
하나의 작업은 하나의 브랜치로 나누어 진행, 체계적인 개발이 가능
git은 브랜치를 만드는 속도가 굉장히 빠르며, 적은 용량을 소모하므로 적극적으로 권장
<조회>
git brach #로컬 저장소의 브랜치 목록
git branch -r #원격 저장소의 브랜치 목록
<생성>
git branch {브랜치 이름} #새로운 브랜치 생성
git branch {브랜치 이름} {커밋 id} #특정 커밋 기준으로 브랜치를 생성함
<삭제>
git branch -d {브랜치 이름} #merge된 branch만 삭제가능?
git branch -D {브랜치 이름} #강제로 삭제함
<이동>
git switch {브랜치 이름} #다른 브랜치로 이동함
git switch -c {브랜치 이름} #브랜치를 새로 생성하고 이동함
git switch -c {브랜치 이름} {커밋 id} #특정 커밋 기준으로 브랜치를 생성하고 이동
switch하기 전에 해당 브랜치의 변경 사항을 반드시 커밋해야함
다른 브랜치에서 파일을 만들고, 커밋 하지 않은 상태에서 switch를 하면, 브랜치를 이동했음에도 불구하고 해당 파일이 그대로 남아있다
9. HEAD
HEAD는 현재 브랜치를 가리키고, 각 브랜치는 자신의 최신 커밋을 가리키므로, 결국 HEAD가 현재 브랜치의 최신 커밋을 가리킴
git log 로 현재 HEAD가 어떤 브랜치를 가리키는지 확인 가능함
git switch는 현재 브랜치에서 다른 브랜치로 HEAD를 이동시킨다
이 상태에서 commit을 하면...
switch로 head를 이동시키고..
여기서 다시 commit하면..
만약 한번 더 commit을 한다면...
시간 내서 실습 써보면 좋겠는데
그럴지는 모르겠다
10. git merge {합칠 브랜치 이름}
병합하기 전에, 브랜치를 합치고자 하는, 메인 브랜치로 switch해야함
그러니까 main에서 git merge hotfix 이렇게 실행하면, main에 hotfix를 넣어주는 느낌..
근데 뭐가 어떤 merge인지는 딱히 신경 안써도 되는듯?
명령어는 모두 (master에서..) $git merge hotfix로 동일하거든
10-1) fast-forward
앞에 있는 main branch를 뒤로 가지고와서 빨리감기하듯이? 병합시키는
(예시)
10-2) 3-way merge
갈림길이 있을때, 공통 조상을 이용해서 merge하는
10-3) merge conflict
두 브랜치에서 같은 부분을 수정할때, git이 어느 브랜치의 내용으로 작성해야하는지 판단하지 못해 충돌이 발생할때, 이를 해결하며 병합함
보통은 같은 파일의 같은 부분을 수정했을 때 자주 발생
충돌이 발생할때는 작성자가 직접 해결해야한다고함..??
위와 같은 경우는 자연스럽게 a,b가 수정된 상태로 합쳐지는데
이렇게 다른 branch에서 a,a가 수정되었을때, merge하려고 하면, 뭘 기준으로 합쳐야할지 모르겠어서 conflict일어남
11. git workflow
branch와 원격 저장소를 이용해 협업
원격저장소 소유권이 있으면 shared repository model
원격저장소 소유권이 없으면 Fork & Pull model
12. shared repository model
원격 저장소가 자신의 소유이거나 collaborator
배포를 위한 branch는 master brach이고 여기서 개발하는 것은 아니다.
기능별로 브랜치를 따로 만들어서 개발
Pull request를 사용하여 팀원 간 변경 내용에 대한 소통을 진행함
13. Fork & Pull model
오픈 소스 프로젝트 같이 자신의 소유가 아닌 원격 저장소인경우
원본 원격 저장소를 그대로 내 원격 저장소에 복제하고(Fork)
기능 완성 후에 복제한 내 원격 저장소에 push하면
이후 pull request를 통해 원본 저장소에 반영
14. branch전략
git 전략, github 전략, gitlab 전략 등등
그러나 팀 고유의 branch 전략이 존재할 수 있음
'프로그래밍 > git 가이드' 카테고리의 다른 글
gitignore로 필요한 소스코드만 올리기 (0) | 2023.07.05 |
---|---|
git의 2가지 특징 -빈 폴더 관리, 대소문자 인식- (0) | 2023.02.11 |
모든 파일을 한번에 다른 폴더로 옮기기 (0) | 2022.07.29 |
git bash에서 could not fork child process there are no available terminals (-1) 에러 해결법 (0) | 2022.07.23 |
git bash 명령어만으로 파일을 옮기는 방법 (0) | 2022.07.19 |