[git] git clone, rebase개념, pull, push
(추후 정리 예정)
head
head를 detach하게 되면 아래와 같아진다.
paremt는 head가 가리키는 노드가 부모가 된다.
head가 가리키게 된다.
exp branch를 만들면 다음과 같다.
만약 main을 그대로 둔 채로 commit하면 main이 움직이게 되므로 실험적인 가지의 의미가 퇴색된다.
checkout은 head를 바꾸고, reset은 branch를 바꾼다.
git reset --hard 커밋id
커밋 메세지 변경이 가능하다.
git commit --amend -m vv2
커밋 id가 변경된다.
기존 c는 삭제된 효과가 있다.
merge시.
exp의 변화를 main에 주고자 할 때. main을 가리키는 상황에서 ,exp를 병합.
exp에 마우스를 대고 병합한 건 branch 이름으로 만들어지고 exp의 메세지에서 병합한 건 커밋 id로 메세지가 작성된다.
병합시 커밋메세지 바꾸지 않는 게 국룰
3-way-merge 활용은
rebase, revert, cherry-pick
merge가 너무 많으면 merge hell !!
rebase의 일부 기능 : 실제로 병렬로 작성했으나 거짓말로 직렬로 작성된 것처럼 하는 것. -> 타임라인별로 보기 편하게 하고 싶을 때.
* rebase
main을 exp로 rebase해
이건 잘못한 경우이다.
아래처럼 바꾸는 게 원래 의도대로 바꾼 것이다.
(아래 가지 두개는 삭제 효과)
rebase는 merge 이후에 적용하는 것이 아니라 merge와 다른 결로 병합하는 방법임.
무엇이 base가 되는 것인지 잘 생각해야한다.(base는 계속 바뀜)
* cherry-pick
특정 버전의 변화만 가져오고 싶을 때 사용.(우리의 구현체에서 특정 커밋 하나만 병합하고 싶을 때 사용)
3-way merge를 할 때 항아리가 base이고, 풍선이 변화이다.
우는 아이에게서 버전을 만든다.
* 깃허브 연동
or create는 저장소부터 만드는 거
or push는 저장소가 있을 때 만드는 거
로컬과 클라우드(깃허브)를 연결할 때 로컬에 깃허브 주소를 넘겨줘야한다.
깃허브 주소는 외우기 힘드므로 origin으로 이름을 설정해서 넣어줌.
이름을 설정하는 이유는 여러 주소를 연결할 수 있기 때문이다.
remote repository에 push해야 한다.
잘 연결 됐고 push하면
git log 시 (HEAD -> master, origin/master)가 붙는다.
origin/main은 remote tracking branch이다. git이 알아서 관리하는 애로, 로컬의 마지막 push상황을 기록해놓는다.
이미 push한 건 수정하면 안 된다!!
git log는 head를 start pointing으로 찾는다.
git log --all 해야 다 보인다.
git log --all --oneline
git log --all --oneline --graph
git log --all # 모든 로그가 다 보인다.
git log --all --oneline # 한줄로 요약해서 보여준다.
git log --all --oneline --graph # 그래프로 보여준다.
push 전에 위와 같이 로컬에 B를 만든다.
push를 하면 위 사진처럼 된다.
* clone
source control에서 clone repository를 누르고 폴더를 정해준다.
clone = init + remote add REPO_URL + pull
할 때마다 지역 저장소가 생기는 거다.
원격저장소의 헤드가 L3가 되었다. 쓸모 없는 정보이다.
* pull $ sync changes
pull로 변경 사항을 다운 받고
push로 github에 올릴 수 있다.
sync changes = pull + push
* conflict는 내용과 연관된것이고, push pull 할 때 message가 겹친다고 문제생기지 않는다.
* 서로 다른 로컬 레포지토리에서 변경사항이 있을 경우 어떻게 진행될까?
왼쪽만 push하면 위 그림과 같다.
이 상황에서 오른쪽 사람이 push하려고 하면 rejected 된다.
그래서 오른쪽 사람은 L4를 로컬로 가지고
pull = fetch + merge
fetch는 원격 저장소의
오른쪽 사람이 fatch를 하면 원 저장소에 있는 L5를 가져온다. -> fetch는 절대로 conflict가 날 수 없다.
이후 merge를 하면 위아래와 같이 된다.
* github에서 공동 레포지토리를 생성하는 방법