깃 허브 잘하는 법 (feat. stash)

kim yeeun·2024년 2월 21일
1
post-thumbnail

깃 커밋 꼬일 때 다들 난감한 상황을 겪었을 거라 생각한다.

Request changes받았을 때 로컬에서 커밋을 reset으로 돌리고, 재커밋 후 --force하는 경우가 많았고 그냥 강제로 push하는 구나 정도로 가볍게 생각했다.

commit 자체가 강제 push 되어서, 해당 PR이 merge 되었을 때까지 생각을 못했던 거 같다.


지금 생각해보면 미친건가 싶다. 이 분은 데브옵스 분이시고, 현재 상황은 배포를 위해 릴리즈 태그를 딴 이후, 수정 후 force push 하는 상황이었다. (나의 영어이름은 emma이다.)

📌 --force push?

force push란?
로컬 저장소의 내용을 원격 저장소에 강제로 덮어씌운다. 즉, 원격 저장소에 저장된 Commit 내용 중 일부가 유실 되는 현상이 발생되곤 한다. 로컬에 있는 코드가 확실한 최신 버전인지 꼭 확인이 필요하다.

진짜 쓰여야할 때는 덮어쓰기 하려는 변경사항을 현재 사용자 외에 다른 사람들이 pull 하지 않은 경우
force push를 수행한 이후, 모든 사용자로 하여금 새로운 사본을 pull 하고 그들의 변경 사항을 새로운 버전으로 재적용한다고 합의가 된 경우라고 한다.

그렇다. 본인의 강제 push로 인해 누군가의 피와 땀으로 만들어진 코드가 날아갈 수도 있는 상황이다.

📌 그래서 커밋은 블럭쌓기를 잘 해야한다. (feat.stash)

이렇게 sync failed인 상황이다. 어떻게 할 것인가?

ccc,bbb,aaa에 있는 부분이 먼저 선행이 되어야 한다. 그리고 MyCommit이 가장 마지막에 커밋이 되어야한다. 그렇지 않으면 커밋이 꼬인다.

그렇기 위해서는 MyCommit이전 커밋 기점으로 돌아가야한다.

git reset --soft MyCommit

git reset --soft MyCommit 명령어를 사용하여, aaa 커밋으로 돌아간다.

다시 aaa로 돌아왔을 때, git stash를 사용해준다.

git stash를 통해서 현재 적용된 commit이후로 변경된 모든 사항들이
stash 공간으로 이동됩니다

그런 다음 git pull rebase origin으로 로컬과 원격의 싱크를 맞춘다.

그 이후 git unstash를 통해 가장 마지막에 쌓은 커밋은 가지고 온다.

📌 stash 안쓸 때 최악의 케이스


원격 저장소와 로컬이다. 이렇게 동기화가 안되어있는 상황에서

git rebase origin 하게 되었을 때, 어림도 없이 Conflict가 나게 된다.

(Conflict 난다고, PR 새치기를 상상하거나 동료한테 화내지마라.. stash를 잘 써라)


이렇게 git rebase origin --continue 하여도 잘 안될 거다.

마무리

항상 그때 그때 필요한 명령어만 검색하다보니, 전체적인 맥락을 잊는 거 같다.
그러다 보니 강제로 push를 하게 되었던 거고, 정말 위험했다. 어떤 한 가지의 상황이어도 어떤 의미인지 고민과 생각은 디폴트로 해야겠다.

profile
안녕하세요 프론트엔드 엔지니어 김예은입니다.

2개의 댓글

comment-user-thumbnail
2024년 2월 23일

권한을 빼버려야겠네여

1개의 답글