git 매립 로그 (2) -git stash와git commit의 차이

2852 단어 Git

문제의 출현


이 글을 쓴 이유는 업무 중에 Git를 처음 사용할 때 이상한 현상을 만났다. 즉, 코드를 제출할 때마다 코드를 제때에 끌어내지 않으면 로컬 라이브러리의 코드가 최신이 아니다. 이렇게 코드를 수정한 후에push를 원격 창고에 가져가려고 할 때 거절을 당한다. 거절당할 때마다 나는 먼저 코드를 끌어낸 다음에push를 계속한다. 이렇게 하면 코드를 성공적으로 제출할 수 있다.그러나 두 개의 제출 대상이 생길 수 있다. 하나는 내가 변경하여 제출한 대상(이것은 있을 것이다)이다. 그러나 또 다른 Merge branch...의 제출 대상이 생길 수 있다. 이 대상은 내가 끌어들이지 않은 다른 사람의 제출이다. 마지막에 나의 제출push로 원격 창고에 도착했다. 이런 현상은 제출 역사 기록이 비교적 혼란스럽고 헷갈리기 쉽다. 자칫하면다른 사람의 제출을 다른 사람이나 자신의 것으로 오인할 수 있다.Git에 대한 이해가 한계가 있기 때문에 이 현상이 발생한 원인을 스스로 백 번 생각해 보았지만 어느 날 책과 토론을 통해 현상이 발생한 원인을 마침내 알게 되었다.

숨겨진 차이


프로젝트 개발 과정에서 제가 사용한 개발 도구는 STS이고 다른 동료가 사용한 개발 도구는 IntelliJ IDEA입니다. 그 안에 각각 Git 플러그인이 통합되어 있습니다. STS를 사용할 때 상술한 현상이 나타날 수 있습니다. 그러나 IDEA를 사용하면 상기 상황에서 두 개의 제출 대상이 생기지 않습니다. 즉, 다른 사람의 제출을 자신의 제출로 바꾸어 다시 제출하지 않습니다.우리는 두 도구가 기본적으로 사용하는 Git 명령이 다르기 때문에 발생하는 현상이 다르다고 추측한다.마지막으로 우리는 명령행을 사용하여 두 가지 현상을 재현하여 서로 다른Git명령의 차이를 알게 되었다. 본질적으로 git stash명령과 git commit명령의 차이이다.Git의 기본 원리를 알고 있다면 Git에 저장된 것은 파일의 스냅샷이지 모든 파일과 초기 버전의 차이가 아니라는 것을 반드시 알아야 한다. 그러면 제출할 때마다 Git는 당시의 모든 파일에 대해 스냅샷을 만들고 이 스냅샷의 인덱스를 저장한다. (제출 대상에 저장된다.)가령 우리가 master 지점에서 개발 작업을 진행한다면:
          A  local
         /
    D---E---A'  master

인출E(자모는 제출 대상을 대표함)에서 제출한 후에 우리는 최신 코드를 인출하는 것을 잊고 수정을 진행했다. 이때master 지점의 제출은 이미 A'로 바뀌었다.(1) 우리가 git commit 명령을 사용하면 로컬에서 A 제출 대상이 생길 수 있다. git pull 그러면 master 지점을 로컬로 통합해서 제출해야 한다. (충돌을 해결해야 할 수도 있다)
          A  local
         / \
    D---E---A'  master

병합 후 제출 대상M이 생겼습니다.
          A---M  local
         / 
    D---E---A'  master

마지막git pushmaster 분기에 제출되면 두 개의 제출이 발생한다.
    D---E---A'---A---M    master

(2) 만약에 우리가 git stash 명령을 사용한다면 우리 로컬은 새로운 제출 대상이 생기지 않고 로컬의 변경 사항을 먼저 캐시할 것이다. git pull할 때 로컬HEADA'로 직접 업데이트할 수 있다.
          A'  local
         / 
    D---E---A'  master

그런 다음 git stash pop 명령을 사용하여 로컬 수정 사항을 복구합니다(충돌 해결이 필요할 수 있음). 이것은 우리가 A'를 바탕으로 수정한 것과 같습니다. 그리고 git commit에 새로운 제출 대상이 생겼습니다B.
          A'---B  local
         / 
    D---E---A'  master

마지막으로 git push 분기에 커밋하면 다음 중 하나만 커밋됩니다.
    D---E---A'---B    master

총결산


이상한 현상이 나타난 원인은 Git의 버그가 아니라 우리의 조작 방식이 잘못된 것이다.이 실험을 통해 우리는 두 개의 서로 다른 IDE에서 Git 작업에 대한 기본 명령도 다르다는 것을 알게 되었다. STS의 EGit 플러그인은 로컬 수정에 대해 기본master을, IDEA에 통합된 Git는 로컬 수정에 대해 기본git add을 한다.
어떤 이상한 현상의 발생 뒤에는 반드시 그 이유가 있다--cloudyf

좋은 웹페이지 즐겨찾기