참고하면 좋은 자료:
https://eunhee-programming.tistory.com/256
https://yuja-kong.tistory.com/48
https://yuja-kong.tistory.com/47?category=831588
깃 특징
1. 오픈소스
2. 여러사람이 서로 다른 컴퓨터로 협업할 수 있다
3. 작업한 내용을 커밋으로 만들어 저장한다
커밋 순서
git add -> git commit -> 커밋 메시지 입력
새로운 브랜치 만들기: git branch <브랜치명>
특정 커밋으로 되돌리기: git reset -- hard <커밋 버전id>
git --version
git config --global user.anem "ID"
git config --global user.email email@email.com
프로젝트마다 다른 사용자 정보를 지정하고싶으면 저장소 생성 후 --global 옵션을 빼고 실행한다.
git config --list
git init
ls
ls -a
ls -al
ls: 파일이름만보기
ls -a: 파일 확장자까지 보기
ls -al: 읽기쓰기권한까지 보기
git add main.py
git add .
git status
untracked: add로 staging되지 않은 파일들
modified: 커밋된 파일중에 수정된 파일
git commit -m "커밋 메세지"
git commit --amend
텍스트 편집기가 실행되어 수정하면 된다.
git log
git log --graph
git log -p -2
git log --stat
git log --pretty=oneline
git log -S 특정텍스트
--graph를 덧붙이면 그래프형태로 보여준다.
-p, --patch: 각 커밋의 수정결과를 보여주는 diff와 같은 역할 수행
-n: 상위 n개의 커밋만 보여준다.
--stat: 어떤 파일이 커밋에서 수정되고 변경되었는지, 파일 내 라인이 추가되었거나 삭제되었는지 확인
--pretty=oneline: 각 커밋을 한줄로출력
-S: 코드에서 수정된 내용중 특정텍스트가 포함되어있는지 검사
git reset 파일이름
add 했던 파일을 뺀다.
git diff
메인 Branch vs 토픽 Branch
메인 branch: 배포할 수 잇는 수준의 안정적인 branch
토픽 branch: 기능 추가나 버그 수정과 같은 단위 작업을 위한 branch
git branch 브랜치명
git branch
*있는게 현재 브랜치
git checkout 다른브랜치명
git checkout 깃로그특정커밋id
git log로 확인한 snapshot을 넘나들때도 사용가능 -> 과거의 파일 내용 확인
merge(병합)
main branch에서 작업을 하다가 a 브랜치를 새로 만들어 작업을 마친 후 병합을 하려면
main branch로 checkout해서 다음 명령어를 친다. (이때 main branch는 더이상 아무것도 안한다.)
```
git merge a
```
a branch의 내용이 main branch에서 업데이트된 내용이기 때문에 곧바로 merge가 된다.
이런방식의 merge를 fast-forward라고 한다.
->이번에는 하나의 파일을 각각의 branch에서 수정하는 경우이다.
다음의 명령어를 사용하여 커밋 그래프를 확인한다.
git log --graph --all
병합을하기위해 main branch로 이동하여 git merge a를 한다.
git branch --merged
git branch -d a
Merge한 두 branch에서 같은 파일을 변경했을때 충돌이 발생한다.
CONFLICT (content): Merge conflict in main.py
Automatic merge failed; fix conflicts and then commit the result.
git status로 어느 파일에서 충돌이 발생했는지 확인한다.
$git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
충돌이 일어난 main.py를 열어보면 아래와 같이 되어있다.
<<<<<<< HEAD
내용1
=======
내용2
>>>>>>> a
내용1과 2를 직접 수정한후 <, =, >가 포함된 행을 삭제한다.
다시 add와 commit 을 한 후 merge 한다.
git merge a
git clone git의repository주소
git remote add origin git의repository주소
git remote
git remote show origin
git remote rename origin b
git remote rm a
원격저장소 동기화
pull: 원격 저장소에서 데이터 가져오기 + 병합(merge)
fetch: 원격 저장소에서 데이터 가져오기 -> git merge origin/master로 병합 완료
git push origin master
git remote -v
Head: 마지막 커밋을 가리키는 snapshot
snapshot: staging 되어진 데이터들을 커밋 명령으로 영구히 저장한 것을 snapshot이라고 한다.
head 역시 snapshot이며 현재 위치한 branch를 가리키는 포인터 역할을 한다.
rebase: 브랜치가 너무 많아져서 history정리가 필요할때 사용한다.
그래프를선형으로 만든다.
rebase를 공통된 부모까지의 commit 을 가져와 원하는 브랜치 옆에이어붙인다.
git checkout b
git rebase main
main 브랜치 옆에 b가 붙는다.
에러나면 파일 수정 후 add 하고 git rebase --continue로 rebase를 마무리한다.
merge에서처럼 fast-forward될수도있다.