깃을 사용하다보면 세세한 명령어도 중요하지만 기본적인 흐름이 중요하다는것을 느껴서 생각을 정리할겸 글을 써본다.
1차프로젝트는 기존에는 다른 브랜치의 작업물을 내 브랜치에 병합할때 머지라는 키워드를 사용했다.
예시:기본세팅에서 각자 브랜치에서 작업중 다른사람의 작업물이 Develop에 머지(Merge commit)가 될경우 => 메인 최신화(git pull origin master) => 내 브랜치에서 최신화를 위해 git merge Develop한다(프로젝트에서는 Develop이 아니라 main으로 그냥 작업함)
2차프로젝트는 병합할때 머지라는 키워드가 아닌 리베이스라는 키워드를 사용해서 병합한다
여러개의 커밋을 합칠수있는 squash
다른 브랜치의 변화를 또 다른 브랜치로 병합을 하고자 할때 둘다 똑같이 사용을 하는데 완전히 다른 방식으로 작동을 한다
Rebase는 이름에서 유추할수 있듯이 베이스 자체를 바꾼다 머지커밋같은거가 남지 않게된다 최종적으로 작업된 그 시점으로 베이스가 이동
Rebase는 내 commit의 base를 변경하여,commit history를 일렬로 잘 정리해줍니다.
단점:Merge키워드를 사용할때는 마지막 commit하고 비교해서 딱한번만 conflict가 충돌 날 수가 있었지만 Rebase의 경우 아예 얘를 기반으로 새로운 commit을 만들어주는거다보니 Rebase를 진행한 상태에서 conflict가 발생하면 이 commit만든 개수만큼 conflict가 날수있다
1.Main branch로 이동하여 remote main을 pull 받는다.
2.내가 push 할 Feature branch 로 이동한다.
3.'git rebase -i main'를 진행한다.
1.가장 오래된 commit을 pick한다.
2.다른 커밋 메세지는 가장 오래된 commit을 기준으로 squash한다.
3.다른 커밋의 작업 내역이 없어지는 것이 아닙니다.
4.Esc -> :wq!로 창에서 빠져나온다.(!강제의명령어)
1.불필요한 내용을 제거하고 현재 수정 내역에 대한 커밋 메세지를 작성
2.Esc -> :wq!로 창에서 빠져나온다.(!강제의명령어)
3.성공했다면 git log로 커밋 메세지 정리된것을 확인
4.git push
-rebase완료-
1.Rebase는 commit history를 정리하는 역할을 한다.
2.같은 브랜치에서 Rebase를 할 때마다 history가 달라질 수 있다.
3.수정 사항이 추가로 생긴 후 다시 rebase하면 history가 무조건 달라진다.
4.git은 history가 다른 branch의 push를 허용하지 않는다.
5.'git push origin feature/login -f' -f옵션을 사용하여 force push를 진행한다.
해당하는 코드를 수정 후 Git add . (Git commit은 하지않는다 수정사항이 없으니까)Git rebase --continue를 진행한다
멈춰 있던 리베이스가 진행된다.충돌이 여러번나면 그 때마다 충돌을 해결하고 git add./git rebase --continue를 반복
계속 해결이 안된다면 git rebase --abort로 아예 rebase를 진행하기 전 상황으로 돌아갈 수도 있다.
내 브런치에서 3개 커밋을 푸쉬한뒤에 git checkout main => git add . => git commit -m "35 -> 36" => git push origin main(메인에서 푸쉬를했지만 상황은 다른 브랜치에서 작업한 작업물이 메인에 머지한것과 같은상황) => git checkout -(이전 브랜치로이동:내브런치) => 메인에 새로운 코드가 들어왔으니까 내 작업하던 브랜치에 최신화된 코드를 병합 해야한다(main로 가서 git pull로 최신화) => 1차의 경우 git merge main => git rebase -i main => 맨위 제일 오래된 커밋만을 pick하고 그외는 모두 s로 변경 => commit message:에서 수정한 한개만 남기고 모두 DD누르면 한줄을 한번에 지워준다
컨플릿 고의로 만들기
내브런치에서 고친뒤 git add . => git commit -m "conflict -> 충동" => git checkout main => git add . => git commit -m "느낌표 많이" => git push origin main 메인브랜치에서 git pull main => git checkout -
상황:충돌을 일으키기위해 각자 브랜치에서 수정한 상황이고 메인 같은 파일의 같은 라인의 위치를 수정한걸 또 git pull 한 상황
=> 내브런치에서 git rebase -i main => 맨위에 하나남기고 엔터 => conflict발생 => 수정뒤 => git add . => git rebase --continue => 여기 conflict에 해결한것에 대한 커밋메세지를 작성하는 부분이 나오는데 :wq로 나오면 쌓인 커밋 다시 재반복 => 반복되는 문제를 해결한뒤에 git add . => git rebase --continue하면 Successfully rebased and updated ~ => git log 하면 올바르게 conflict된거까지 확인할수가있다.
https://backlog.com/git-tutorial/kr/stepup/stepup3_1.html