반응형

 

 

 

 

 

 

소스 수정을 한참 하다 보니 새로운 브랜치가 아닌 develop에서 작업을 하고 있었다!

아직 커밋을 하지 않은 상태이므로, 그냥 새로운 브랜치를 만들면 수정하고 있는 사항들도 같이 옮겨갑니다.

$ git checkout -b new-branch

 

 

소스 수정을 하고 커밋도 했는데, 새로운 브랜치가 아닌 develop에서 작업을 하고 있었다!

이런 경우에는, 현재 상태로 새로운 브랜치를 만들고, develop을 커밋하기 전의 상태로 되돌리면 됩니다.

$ git checkout -b new-branch $ git checkout develop $ git reset --hard HEAD~1

만약 커밋이 여러 개였다면 HEAD 브랜치 뒤에 1이 아니라 커밋 개수만큼 숫자를 넣어주면 되겠죠.

 

 

새로운 브랜치를 만들어야 하는데, develop에 아직 코드 리뷰가 끝나지 않은 커밋이 포함되어 있다!

기존 작업을 별도의 브랜치에서 하지 않고, 작업 내용을 develop에 바로 커밋하여 pr을 날렸을 경우 발생할 수 있는 상황입니다. 이 경우 기존 작업의 코드 리뷰가 끝나지 않았는데, 새로운 이슈를 작업하기 위해 develop에서 새로운 브랜치를 만들면, 코드 리뷰를 받지 않은 기존 작업의 커밋이 따라붙게 됩니다. 이런 경우에는, 해당 커밋이 생성되기 전의 상태로 새로운 브랜치를 만들면 됩니다.

$ git checkout -b new-branch HEAD~1

이 명령어에서도 마찬가지로 HEAD 브랜치 뒤에 1 대신 돌아가야 하는 커밋 숫자를 넣어주시면 됩니다.

 

 

뭔가 실행했더니 이상해져 버렸다!

pull을 잘못 받거나 revert를 잘못 했거나... 아니면 뭘 했는지도 모르겠는데 뭔가 이상해졌을 때에는 reset을 해주면 됩니다. 우선 HEAD 브랜치의 변경 내역을 확인하기 위해 reflog 명령어를 사용합니다.

$ git reflog 
544ebb9 HEAD@{0}: pull upstream monkey3: Fast-forward 
e94fc27 HEAD@{1}: checkout: moving from monkey3 to test 
e94fc27 HEAD@{2}: checkout: moving from analyticsqa/246 to monkey3 
f19873 HEAD@{3}: commit: 차트 로딩 추가 (analyticsqa/246) 
e94fc27 HEAD@{4}: checkout: moving from monkey3 to analyticsqa/246

HEAD 브랜치의 내역을 통해 어떤 작업을 했는지, 그 중 어떤 것이 잘못되었는지 확인할 수 있습니다.

이제 첫 번째에 있는 pull을 취소하고 싶다면, 그 하단에 있는 HEAD@{1}로 이동하면 됩니다.

$ git reset --hard HEAD@{1}

이것 또한 1 대신 돌아가기를 원하는 위치를 넣으면 됩니다.

 

 

메인 repository에 push를 하고 나니 뭔가 이상해진 걸 깨달았다!

이미 public으로 나간 커밋은 reset을 하면 안 됩니다. 이런 경우에는 해당 커밋을 revert하고 다시 push를 해야 합니다.

먼저 git log를 하여 revert하고 싶은 커밋의 해시(예: 028c6298eb025ff8e5ccfbba399501a7e8e50af8)를 복사한 후, 다음과 같이 실행합니다.

$ git revert 028c6298eb025ff8e5ccfbba399501a7e8e50af8

그러면 커밋 메시지를 수정할 수 있는 창이 뜨고, 종료하면 revert가 수행됩니다.

 

 

merge 커밋을 revert하고 싶다!

merge 커밋을 revert하기 위해선 명령어에 -m 플래그를 추가해줘야 합니다. -m 뒤에는 원하는 부모의 번호를 넣어줘야 하는데, 보통 부모의 시작 번호인 1을 넣어주면 됩니다. 이 부모 번호는 브랜치들의 merge를 실행할 때 merge를 실행한 베이스 브랜치가 어느 쪽이었느냐에 따라 달라질 수 있습니다.

$ git revert -m 1 028c6298eb025ff8e5ccfbba399501a7e8e50af8

 

꼬였던 로컬 브랜치를 다 정리했고, origin에 있는 같은 브랜치를 이것으로 덮어씌우고 싶다!

강제로 덮어씌우고 싶을 땐, -f를 붙여주면 됩니다. 메인 repository에는 절대로 하면 안 됩니다!

$ git push -f origin some-branch

 

 

로컬에만 있어야 하는 파일이 이미 push까지 되어버렸다!

IDE 설정 파일과 같이 로컬에만 존재해야 하는 파일이 메인 repository까지 실수로 들어갔을 때가 있습니다.
이럴 때는 Git에서는 지우면서 로컬에 있는 파일은 지우지 않아야 합니다.

$ git rm --cached some-filename

 

 

이미 커밋을 했는데 커밋 메시지를 수정하고 싶다!

커밋 메시지를 수정하고 싶을 때는 commit 명령어에 인자로 amend를 사용하면 됩니다.

$ git commit --amend

이 명령어는 엄밀히 말해 기존의 커밋을 수정하는 것이 아니고 새로운 커밋을 만들어냅니다. 만약 이미 해당 커밋이 push가 되어 있는 상황이라면 다른 사람들의 히스토리를 꼬이게 만들 수 있으므로 되도록 지양해야 합니다.

 

 

브랜치 이름을 바꾸고 싶다!

브랜치 이름을 바꾸고 싶을 땐, 아래와 같이 하면 됩니다.

$ git branch -m old-name new-name

 

 

비슷한 여러 커밋을 정리하고 싶다!

같은 주제로 작업한 커밋이 여러 개라면 깔끔한 히스토리 관리를 위해 커밋들을 squash하는 게 바람직합니다.

git log 명령어를 이용해 다음과 같은 작업 내용을 확인했습니다.

$ git log --oneline 
971e62d a 수정 
fc8812c a 수정 
a1b2ae7 a 수정 
16cfc94 Merge pull request #249 from changuk-lee/renewal_monkey3 
3d19554 Merge remote-tracking branch 'origin/renewal_monkey3' into renewal_monkey3 
...

위에서 3개의 'a 수정' 커밋들을 하나로 묶어봅시다. 이것을 interactive rebase라고 합니다.

$ git rebase -i HEAD~3

이제 텍스트 에디터가 실행되고, 각 커밋에 대해 원하는 작업을 할 수 있습니다.

pick 971e62d a 수정 
pick fc8812c a 수정 
pick a1b2ae7 a 수정 
...

두번째와 세번째 라인의 pick을 s(squash)로 바꿔봅시다.

pick 971e62d a 수정 
s fc8812c a 수정 
s a1b2ae7 a 수정 
...

이제 저장하고 종료하고 나면 커밋 메시지를 수정하는 화면이 나옵니다.

# This is a combination of 3 commits. 
# The first commit's message is: 
a 수정 
# This is the 2nd commit message: 
a 수정 
# This is the 3rd commit message: 
a 수정

원하는 커밋 메시지를 넣은 후 저장/종료 후, git log를 해보시면 3개의 커밋이 하나의 커밋으로 합쳐진 것을 볼 수 있습니다.

 

 

Squash하고 싶은데 순서가 얽혀있다!

커밋 순서가 아래와 같은 경우에, 두 개의 'a 수정' 커밋을 묶고 싶다면 어떻게 해야 할까요?

$ git log --oneline 
ae5ba65 a 수정 
3f30dc1 b 수정 
b341e53 a 수정 
...

일반 squash할 때와 똑같지만, 커밋의 순서를 바꿔주면 됩니다.

pick b341e53 a 수정 
pick 3f30dc1 b 수정 
pick ae5ba65 a 수정

에서,

pick b341e53 a 수정 
s ae5ba65 a 수정 
pick 3f30dc1 b 수정

이렇게 바꿔주면 됩니다.

 

 

 

 

 

# 참고 사이트

https://meetup.toast.com/posts/116

 

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기