안녕하세요. codingdog입니다. pycharm에서 git push를 할 때 --force가 붙어있는 것을 볼 수 있습니다. 위험해 보이지만, 한 번 실습을 해 보면서 얼마나 위험한지 보도록 하겠습니다.

 


 저는 gitlab 15.x 버전으로 실습하였습니다. 실습하기 전에, main branch에 대해, force push가 허용되어 있어야 합니다.

 

 먼저, 1.txt를 생성합니다. 다음에, Hello 라는 메세지를 추가한 다음에 commit을 해 보겠습니다.

 

 다음에, push를 해 보겠습니다. vscode에서는 Sync changes를 누르면 바로 됩니다.

 

 

 1.txt add 라는 메세지가 추가되었습니다. 내용을 확인해 보면, Hello 라는 내용이 있는 1.txt를 추가했다고 나옵니다. 그런데, 저는 이 내용을 잘못 push 해서, My name is cho 라는 내용까지 추가한 다음에 git push --force로 덮어쓰려고 합니다.

 


 상황이 하나 있습니다. 제가 올라간 커밋을 잘못 인지한 순간부터, Hello my name is cho 라는 내용을 추가해서 덮어쓰기를 하려는 그 찰나의 순간에 다른 사람이 2.txt를 추가해서 commit을 하였습니다. 즉, 그 찰나의 순간에, 제 최신 커밋에 다른 사람이 커밋을 했다는 것입니다. 저는 이 사실을 모르고, git reset HEAD^로 1.txt가 추가되기 전 상태로 돌려놓습니다. 정확히 말하면, 1.txt가 추가되었다는 내용이 변경 기록에 있는 것입니다. 다음에 아래 내용을 추가합니다.

 

 Hello. My name is cho 입니다.

 

 이제, 깃 변경 내역을 봅시다. Hello. My name is cho라는 내용이 들어가 있는 것으로 보아, 제대로 잘 반영이 된 듯 합니다. 저는 이제 git push --force로 강제로 푸쉬할 겁니다.

 

 protected branch에서 force push를 허용한 상태이므로, 잘 됩니다. 이제 gitlab에 들어가서 어떻게 기록이 쌓였는지 보겠습니다.

 

 

 제 입장에서는 잘못 커밋된 내역을 git push --force로 덮어썼으니 문제가 없을 겁니다.

 

 

 원격에 올라간 건 Hello. My name is cho니까 사실 별 문제가 없어 보입니다. 문제는, 다른 사람의 변경 사항입니다. 2.txt에 대한 변경 사항은 날라가 버렸습니다. 이는, 내가 생각하고 있던 최신 버전에 다른 누군가가 변경 사항을 쌓았기 때문입니다. 충분히 문제가 될 수 있는 상황입니다. gitlab에서 push force를 괜히 막아둔 것이 아니라는 것을 생각할 필요가 있습니다.

 


 그러면 어떻게 해야 하나요? 변경 내역을 보고, 반영되어야 할 것과 그렇지 말아야 할 것을 확인합니다. 다른 사람의 시점으로 돌아가 보겠습니다.

 

 제 변경사항을 push 하려니, 충돌이 난다고 하네요. 당연하게도, 제가 알고 있던 버전은 Hello만 있는 1.txt의 추가였는데, 뜬금없이, Hello. My name is cho. 라는 내용으로 커밋이 덮어졌기 때문입니다. 변경 내용을 반영해야 하는지 말아야 하는지, 확인한 뒤에, merge를 하면 됩니다. 저는 cho에게 물어봐서, Hello, My name is cho. 가 1.txt에 반영되어야 함을 확인하였습니다. 그러므로, server쪽의 변경 사항을 받아들였습니다. 그렇게 해서, 머지를 한 다음에 push를 하였습니다.

 

 변경 사항을 보면 위와 같습니다. 빨간색은 cho가 변경한 것이고, 파란색은 다른 사람이 변경한 이력입니다.