: working directory -- add
--> stage area -- commit
--> repository(.git)
: 상태를 기억하고, 그 상태를 변경하는 행위를 알면 된다.
$ git init
입력$ git config --global user.name 'juyeonma'
$ git config --global user.email 'juyeonma9@gmail.com'
$ git add work1.txt work2.txt
$ git rm --cached work1.txt
$ git restore --staged <file>
$ git commit -am "work_1"
$ git add .
(.
:현재 디렉토리의 파일 전부) 금지!
: config.txt 파일도 다 commit 되기 때문에, 큰일남!
.gitignore 파일을 만들어서 그 안에 파일명을 넣어놓자
$ git rm -r --cached 폴더 또는 파일명
$ git add .
$ git commit -am "커밋 메시지"
$ git push remote명 branch명
$ git checkout 아이디
: HEAD가 아이디를 가리킴$ git checkout master
: HEAD가 master를 가리킴'hard' 옵션
: 워킹 디렉토리의 파일까지 강제로 덮어쓰기 때문에, reset 명령을 위험하게 만드는 유일한 옵션. 파일의 v3버전을 아직 git이 커밋으로 보관하고 있기 때문에 reflog 를 이용해서 다시 복원할 수 있다. 만약 커밋한 적 없다면 git이 덮어쓴 데이터는 복원할 수 없다.
$ git reset --hard 아이디
: 삭제/복원
: 만약 HEAD가 master를 가리킬땐, reset 하면 master가 움직임.
: 그러나 HEAD가 master 이외의 버전을 가리킨다면, reset은 checkout과 같은 효과(즉 HEAD가 움직임)
: 복원 하려면? 위험한 작업을 할 때는 이전의 commit id를 적어두고, 그 id로 다시 reset 하면 된다(git의 불변성!!)
: HEAD가 parent
: 만약 새로운 버전 E를 만들었다면..
git merge 아이디
git reset --hard 그전 버전명
: 충돌은 나쁜 것이 아니다! 오히려 git이 얼마나 천재적인지 알게 해줌!
병합하려는 branch에서 서로 충돌하는 파일의 내용이 있는 경우, 선택지를 줌.
: "어떻게 병합할래?"
branch | Zero (분기점) | A | B | C (병합) |
---|---|---|---|---|
file | zero.txt | a.txt | b.txt | a.txt b.txt |
1 | 1 | 111 | 111 | |
2 | 2 | 2 | 2 | |
3 | 333 | 3 | 333 | |
4 | A4 | B4 | conflict |
$ git config --global core.editor "code --wait"
: 기본 편집 스타일을 vscode로 설정
merge 하여 conflict 해결한 뒤에 해야할 것
: add하고 commit 해주면 창이 하나 뜨는데, 이 창을 끄면 성공적으로 병합이 됨
$ git remote add origin 원격 저장소 주소
$ git remote remove origin
$ git push --set-upstream origin master
origin/master
: 어디까지 동기화했는지 기록하는 특수한 브런치
$ git push
: 원격 저장소로 업로드
$ git pull
: 원격 저장소에서 다운로드
$ git clone 원격 저장소 주소 .
-.
: 현재 디렉토리로 원격 저장소를 복제한다
: 협업 시, 원격 저장소의 버전을 갖고있지 않은 상태로 원격 저장소로 push 하면 rejected가 남. 왜냐면, push가 성공하면 원격 저장소의 버전이 유실되기 때문에!
$ git status
: 깃 상태 확인
$ git log --oneline --all --graph
: 한줄로, 전체 다(master가 가르키는 부분도 보여줘)(reset 해서 사라진 부분도 보이게끔?체크), graph로(branch를 나타내줌) 보자
$ git reflog
: 지금까지 한 모든 기록이 나타남
$ git config --global alias.l "log --oneline --all --graph"
삭제하는 방법은 vim ~/.gitconfig
에서 수정
$ git config --global core.editor "code --wait"
: 뭔지 모르겠음
$ ls -a
(= $ ls --all
)
: 숨겨진 파일도 다 보여줌
: ./ ../ .git/ work1.txt work2.txt work3.txt
$ ls
: 현재 directory의 파일을 보여줌
: work1.txt work2.txt work3.txt
출처: https://stackoverflow.com/questions/65434544/whats-the-difference-between-git-rm-cached-git-restore-staged-and-gi
git rm --cached: working directory는 그대로, stage area에서만 파일 제거.
git restore --staged: working directory는 그대로, repository 안의 HEAD가 가르키는 commit 버전을 stage area로 복사함. 즉 stage area에 아직 commit되지 않은 파일은 삭제되는 효과를 가지므로 이 경우에는 rm --cached와 같은 결과를 보임.
다음으로 rm시 cached의 차이를 찾아보았고, 이렇게 이해했습니다.
git rm: 원격 저장소와 로컬 저장소에 있는 파일을 삭제한다.
git rm --cached: 원격 저장소에 있는 파일을 삭제하지만, 로컬 저장소에 있는 파일은 삭제하지 않는다.
그리고 이에 몇가지 궁금증이 생겨 질문드립니다.
1.git rm --cached의 경우 "stage area에서만 파일 제거" 라는 설명과 "로컬 저장소에 있는 파일은 삭제하지 않는다."는 설명이 모순되는 것이 아닌지 궁금합니다. push 하기 전에는 로컬 저장소에서만 작업이 이루어지는데, 로컬 저장소의 파일은 삭제하지 않는데 stage area에서 파일이 삭제된다는건 모순 아닌가요??
2.rm --cached와 restore의 차이에 대한 저의 이해가 맞는지 궁금합니다. 만약 rm --cached와 restore가 동일한 결과를 보이는 경우가 아닌 예시가 무엇이 있을지 궁금합니다.