유퀴즈 아기자기st 궁금증들 모음이다.
뭐 저런걸 궁금해해? 싶은..
시간날때마다 해보고 내용 추가할 예정
nothing to commit이라고 알려줘
마지막 add 기준으로 commit되더라
commit을 하면 그 순간의 변경사항이 저장되는 거라서 git hub에 commit message 2개 다 기록으로 올라가더라
최신이면 굳이 pull 안 받아오더라
이미 최신이라고 알림만 뜰 뿐.
다른 누군가가 push를 안한경우
= main 브랜치에 변경사항이 없는 경우
= origin/main이랑 origin/HEAD이랑 같은 곳에 위치한 경우
= pull 받은 시점이 아직 HEAD(최신상태)인경우
그사이 누군가가 push(pull request)를 한 거지.
[변경사항a]를 마지막 commit한 이후 추가로 [변경사항b]를 저장만 하고 commit은 하지 않은 채 pull을 할 경우 [변경사항b]가 날아가 버릴 수가 있다.
보통은 에러가나서 막아준다.
답 : 아니. 안돌아가. 왜냐면 최신 HEAD라서!
1) 깃헙에서 pull reque후 git status
Your branch is ahead of 'origin/main' by 4 commits. 이게 무슨말일까
로컬 마스터를 변경하고 원격으로 푸시하지 않았기 때문에 해당 메시지가 나타납니다.
2) fetch 했더니
새로운 브랜치가 있다고 알려줌
3) git pull 하고
4) 띄어쓰기 두번하고 (간단한수정) 저장
5) git status
add 하라는데?
6) add 하기 전에 git pull 해봄
7) add, commit을 한다
8) add, commit 후 git pull 해봄
지금 내가 가장 앞가지에 있으니까 pull 안받아옴
즉 최신이면 굳이 pull 안받아오는것
pull 받으면 내가 한 변경 사항도 pull 기준으로 되돌아 가는것이 아니다! 만약 되돌리고 싶은데 마지막 커밋 전 게 없다면 다른 누군가에게 띄어쓰기로 풀리퀘 해달라고 부탁하면 될듯. 일부러 conflict를 내서 이전 코드로 돌아가는 거지.
내가 pull 받고 수정하고 add, commit 하는 사이에
다른 누군가가 main 브랜치에 pull reque(push)를 해서 main의 최신 가지가 앞으로 이동해버렸다면
나는 push 전에 풀 받은 후 머지하면 될듯.
이걸 실험해볼까?
9) git log
10) git push 후 git status
내 HEAD가 최신이다
git log
main 브랜치에서 push를 하면 pull request를 할 일 이 없음.
main 브랜치에서 push하면 pull reque 따로 안해줘도 된다!!!
branch가 이렇게 움직이져
HEAD는 해당 브랜치의 가장 말단(끄트머리)이다.
원격 서브 브랜치가 보이지 않는다.
git pull origin 서브 브랜치를 하고 나서는
아래와 같이 origin(원격) 서브 브랜치를 확인 할 수 있다.
하지만 여전히 main과 원격 브랜치들의 것은 확인 할 수 없다.
그렇게 하면 서브 브랜치에서 main 브랜치의 로그들과 HEAD도 볼 수 있다.
git log origin 처럼 전체 확인이 된다.
(정리) 전체 log 보려면
1) main 브랜치 가서 git log 하거나
2) git log origin 이라고 하면 됨
참고) git log 화면에서
q 누르면 : log 나갈 수 있고
h누르면 : 도움말 설명 볼 수 있음
f누르면 : forward인데 더 과거기록으로 가고
b누르면 : 최신을 보여주는거 같음(아닐수있음!)
1) git fetch로 변경사항을 가져오고
2) git log origin 으로 HEAD를 확인한다.
3) 일단 작업 중인 것들은 commit을 해두고
4) git pull origin main 을 한다. (이때 받는 브랜치는 서브 브랜치)
에러 메세지 : 로컬에 변경사항이 있는데, pull(merge)받으면 덮어써지니까, merge 전에 변경사항을 commit하거나 stash해라
그러고 강제 진행 안됨
강제진행하는 명령어는?
출처 링크
6) git stash로 임시저장을 한다.
별로 안 중요한 변경사항이라 commit 하지 않았다.
stash를 하면 바로 직전 commit 기준으로 파일 상태도 되돌아간다.
메세지 : index공간에 5ad3294라는 이름으로 잠시 저장해뒀으니, 서브 브랜치에 매인 브랜치 병합(Merge) 해
git stash로 저장을 해둔것은 나중에 merge후 꺼내올 수 있다. git stash list로 저장한 stash목록 확인해서 git stash apply [stash명] 으로 가져오면 된다.
git stash를 쓰는 상황
7) 돌아와 이제 다시 pull 해와보자.
무사히 pull 받아지고
8) git log 확인하면 아래와 같이 로컬의 서브 브랜치도 main 브랜치 HEAD와 나란히 정렬이 되었음을 볼 수 있다.
하지만 origin(원격의) 서브 브랜치는 아직 저 아래에 있다.
여기서 부터는 개인의 선택이다.
보통은 stash에서 꺼내와서 작업 완성후 commit후 origin 개인 브랜치에 한 번만 push한다.
이거는 따로 빼서 똑같은 HEAD환경에서 시작해봤다.
HEAD를 다 맞추고 시작하는게 좋은 사람은 로컬 서브 브랜치를 원격 서브 브랜치에 push 해주고 stash에서 꺼내와 작업을 진행하여 commit후 push 하면 된다.
같은 로컬 서브 브랜치를 origin 서브 브랜치에 push 하는 이 상황에서는 commit message가 따로 생기지 않는다.
나는 지금 이 상태에서 push가 가능한지 궁금하기 때문에 한번 해보겠다.
딱히 변경사항이 없으니 commit없이 로컬에서 원격으로 병합(merge)가 된것같다.
git log를 보면 두개의 로컬 브랜치와 두개의 원격 브랜치들이 모두 최신으로 맞춰져 있다.
이어서 git stash를 했다면 conflict가 났을까?
그만 긍금해해
바로 위에 번호 8) 이후 a.상황으로 셋팅을 했다.
main local에서 주석을 짧게 수정해서 push 했고 서브 브랜치로 돌아왔다.
이렇게 하면 원격 main 브랜치와 로컬과 HEAD가 원격 서브브랜치와 로컬 HEAD보다 앞서있다.
0) 서브브랜치에서 수정, 저장 후 pull origin main을 하면 에러 난다.
1) stash로 저장 후 다시 pull origin main을 하면 아래와 같이 된다.
주의 사항은 실제 개발 협업 할 때는 stash후 pull 당겨 왔을 때 꼭 refrash를 해줘야 한다! 이유는 아래 이미지에~
2) pull 받은 후 git log를 보면 원격 저장소만 뒤에 있다.
3) git stash list로 목록을 확인한다.
4) git stash apply [인덱스번호] 로 찾아온다.
세상에나 충돌이 났다.
5) conflict 메세지에 변경 사항을 add 하라고 해서 add 후 stash 했더니 변경사항이 중복 되어 버렸다.
에러 메세지였으면 실행 안하고 이렇게 해라.. 하고 시켰을 텐데 이건 에러 메세지는 아니어서 그런가 ...
실제 코드였으면 헤결 할 때 진짜 헷갈릴것 같다고 생각하며 변경사항 conflic를 해결했다.
6) 그러고 git push origin 서브 브랜치
7) 여기서 git log 확인하면 서브 브랜치들이 가장 최신이다.
8) git hub 에서 pull request 후 git log를 찍으면 7번과 같은 결과 가 나온다.
아직 fetch가 안되어서 최신 정보를 못받아와서 그럼.
9) git fetch 후 git log 치면 main 브랜치들이 안보임. 왜냐면 pull reque받아서 서브 브랜치들 보다도 최신이기 때문. git log origin 치면 나옴.
10) 다음 작업할 때 시작 전에 git pull origin main 해서 로컬 main을 꼭 최신(HEAD)으로 맞춰주고 시작해줘야함