본문 바로가기

형상관리 Git

[SourceTree] sourceTree사용 이유와 여러가지 해결방안(이전 commit으로 reset후 서버에 push하기, 이미 push한 commit메시지 수정하기, 이미 push한 commit삭제하기)

sourceTree를 사용하는 이유는 터미널만 이용해서는 전체적인 그림이 잘 그려지지 않던게 UI를 이용한 sourceTree를 사용하여 머릿속에 더 쉽게 그림이 그려져서 GIT의 여러 명령어를 익숙히 하기 위함에 있다. 따라서 UI를 기반으로 진행되는 sourceTree의 각각의 버튼을 사용할때 해당 버튼이 구체적으로 어떠한 GIT명령어에 해당되는지를 매칭시켜 가며 공부해야한다.

====================================================================================

원격에 있는 master브랜치가 아닌 다른 브랜치에 push해도 master브랜치에 push 하지 않으면 아래 그림과 같이 push에 '1'이라는 파란버튼이 그대로 남아있게된다!

====================================================================================

이전 commit으로 reset후 서버에 push하기

간혹 작업이 충돌했거나 머지나 푸시를 잘못했거나 이전 커밋으로 되돌리고 싶을 때 아주 유용하다. 다만, 공동의 작업자가 있다면 미리 공유를 하고 해당 작업 후 다시 브랜치를 체크아웃 한 후 작업할 수 있는 환경이어야 한다.

이렇게 master 브랜치 서버에 올라가 있는데 2b4d5e2c 커밋으로 돌리고 싶으면

reset으로 hard 옵션을 줘서 커밋을 돌릴 수 있다.

% git reset --hard 2b4d5e2c
HEAD is now at 2b4d5e2 상품 추가 롤백 작업

 

하지만 로컬에서만 적용될 뿐, 아직 서버에는 그대로일텐데 이때 아래처럼 브랜치 앞에 +를 써서 강제로 푸시가 가능하다.

 % git push origin +master
Total 0 (delta 0), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/jane-shop-api
 + 9249ff1...2b4d5e2 master -> master (forced update)

(명령어로 할때는 이와 같이 간단히 +기호만 브랜치앞에 붙여주면 간단히 해결되지만 sourceTree에서는 pull을 한후에 push하라고 아래와 같이 에러를 내뱉는다.

sourceTree는 이러한 상황에서 강제 push(브랜치앞에+)를 하기 위해서는 아래 링크에서 소개되는 설정이 필요하다.

https://tlghks1009.tistory.com/4

이후 진행해 보면 정상적으로 수행되는 것을 확인할 수 있다.

 

이제 git update project를 실행해보면 2b4d5e2c 커밋이 가장 상단에 표시되는 걸 볼 수 있다

=======================================================================================

이미 push한 commit메시지 수정하기

나는 구글링한 내용을 따라간다. 그런데 문제는 구글링한 내용이 내가 실제 따라 하면서 접하게 되는 내용과 100%일치하지는 않는다는데에서 혼란이 온다는 사실이고 이런 혼란은 내가 정말 문해력이 없다는 것을 말해주는 것이다. 
실제로는 글에서의 설명과는 다르게 전혀 새로운 창이 뜨더니 글에서와 비슷한 내용이 떳다.(여기서 혼란이 시작되었다. 나는 글을 고대로 따라 하고 있는데 전혀 새로운 창이 떠 버렸다는 것에서 그렇다. 그런데 그런건 중요치 않다. 어느정도 문맥이 비슷한 것만 확인하고 큰것들만 아다리가 맞아가면 되는것이다(물론 어떤 것이 큰것이고 작은것인지는 순전히 경험의 영역인것 같다)

나는 i를 눌러 입력 모드로 바꾸지도 않았고 esc를 누르고 :wq를 입력해서 터미널을 종료하지도 않았다. 이런것에서 혼란을 느끼지 말라는 거다. 큰 틀만 맞추면 된다(물론 뭐가 작고큰것인지는 경험의 영역이다)

참고: https://so-kyte.tistory.com/161

1. 터미널에서 rebase를 사용해서 수정 모드로 바꾼다. 

 

이를 위해서는 rebase 명령어를 사용해야 하는데 rebase명령어는 branch의 base를 다시 설정하여 master브랜치와 merge commit생성을 방지하여 깔끔한 커밋을 남길 수 있도록 도와주는 명령어이다.

 

(rebase 명령어도 다양하게 쓰일 수 있기 때문에 여기서는 이정도만 알면 된다.)

 

git rebase HEAD~1 -i

 

rebase에서 -i 옵션을 주면 rebase명령을 대화형으로 수행하여 여러 커밋들의 순서를 바꾸거나 커밋 히스토리를 변경 또는 삭제할 때 사용한다.

위와 같이 입력하면 기존의 VScode창에 git-rebase-todo라는 창이 하나 더 뜰 것이고 그 창은 아래와 같은 그림이다.

이 창에서 위에 보이는 pick이라는 글자를 내가 원하고자하는 행위를 시행시키는 명령어로 바꾸면 되고 주석에 나와있듯이 commit message를 바꾸고 싶다면 pick을 r또는 reword로 변경하면 된다.

이렇게 변경하고 Ctrl+s 버튼으로 저장 시킨후 화면을 종료하면 연이어서 다시 아래와같은 COMMIT_EDITMSG창이 VScode로 올라온다

주석에 나와있듯이 내가 바꾸고자하는 commit message로 메시지 내용을 변경한후 저장하고 나가면 된다

이제 마지막으로 변경된 내용을 서버로 push해 주면 된다.

git push --force main 이 아니라 git push --force origin main으로 입력해야 한다는 것을 확인할 수 있다.

 

force 로 덮는 경우 강제로 덮어쓰기 방식을 사용하는 것이므로 권장하는 방법은 아니다.

왜냐하면 협업 중에 다른 사람이 강제로 바꿔놓은 branch를 pull 받았을 때, 커밋 메시지가 수정되어있으면 혼란을 야기할 수 있기 때문이다. 

 

또 push 된 Commit의 로그를 갖고 있던 다른 팀원들이 일일이 수동으로 Commit 로그 메시지를 수정해야 할 수도 있다고 한다.

 

그래서 만약 force로 하게 된다면 팀원과 상의 후에 할 것을 권장한다! 

(나처럼 개인 작업/개인 레포라면 크게 상관이 없겠지만 .. ?)

위의 과정을 잘 따라왔다면, 다시 깃헙으로 가보았을 때, 커밋 메시지가 수정된 것을 확인할 수 있다. 

=======================================================================================

이미 push한 특정 commit삭제하기?

==> 사실 엄밀히 이런 기능은 GIT에는 없다. 왜냐하면 GIT이라는 것이 버전관리 툴이기 때문이다. 다만 특정 커밋으로 돌아가고 그 이후의 모든 커밋들은 삭제되는 기능이 있는데 그것이 이 글의 처음에 보았던 "이전 commit으로 reset후 서버에 push하기" 기능이다. git reset --hard "돌아가고자하는 commit버전 id"

이것외에 가장 최근의 커밋을 삭제하거나 가장 최근에 있던 몇개의 커밋을 삭제하는 방법은 아래와 같다.

git bash터미널에서 git log 명령어를 통해 여태 commit된 목록을 확인한다

git reset을 통해 최근 커밋을 삭제하기 위해 git reset head~n( 최근의 n개의 commi을 삭제) 의 명령어를 사용한다.

(여기서 꼭 주의 할것이 head 와 ~ 사이에 한칸 띄워서는 절대안됨. 그럼 동작안함)

=======================================================================================