et al/Docker&git

[git] git clone, rebase개념, pull, push

코딩상륙작전 2023. 12. 5. 21:04

(추후 정리 예정)

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에서 공동 레포지토리를 생성하는 방법