커밋 진행 중 갑자기 아직 존재하지 않는 커밋에 의존하는 것처럼 보일 때 어떻게 처리합니까?


13

나는 Git에 경험이 없지만 최선을 다해 익숙해 지려고 노력했지만 지금까지는 혼자서 작업하는 프로젝트에만 사용하고 있습니다.

코딩 할 때 자연스럽게 하향식 접근법이 있으며 (미래를 알 수 없기 때문에) 반복되는 테마가 있습니다.

나는 일을한다.
나는 내 일을 "커밋 할 수있는"것으로 만들기 위해 다른 일을해야한다는 것을 알게되었다.
다른 작업은 자체 커밋이 필요합니다.

커밋 할 수있는 것은 컴파일하거나 완전히 혼란스럽지 않은 것을 의미합니다.
그리고 그것은 커밋이 가치가있는 것으로 커밋이 한 가지만 수행해야한다는 것을 알게되었습니다.

내가 해결하는 방법은 번거 롭습니다. 다른 작품이 다른 파일에 있으면 새 지점을 만들고 커밋하고 병합합니다. 작업이 같은 파일에있는 경우. ugh .. 로컬 복사본을 만들고 파일을 HEAD의 상태로 다시 설정하고 필요한 커밋을 만든 다음 복사본에서 작업을 복원하기 시작합니다. 실제로 어떻게 처리해야합니까? 나는 이것이 방법이라고 생각하지 않습니다. 나는 그것이 적어도 미래를 모르는 모든 사람들에게 어느 정도 나올 수 있기 때문에 그렇게 가정하지 않습니다. 아니면 내 워크 플로에 결함이있는 것 같습니다.


1
일반적으로 라이브러리와 구성을 추가 할 때 같은 상황에 처하게됩니다. 나는 git status변경된 모든 파일을보고 git add특정 파일 () 대신 사용 git add --all하고 조각 단위로 커밋 하여 두 개 이상의 커밋을 수행 합니다 .
Chris Cirefice

파일의 일부를 git add -p선택한 다음 해당 부분 만 커밋 할 수 있습니다 . 그것은 매우 강력한 기술이며 거의 항상 사용합니다.
eush77

답변:


17

이를 해결하는 방법에는 여러 가지가 있습니다.

현재 변경을 방해하지 않고 첫 번째 커밋에 대한 변경을 수행하려는 경우을 사용할 수 있습니다 git stash. 이렇게하면 열려있는 모든 변경 사항이 사라져 나중에 복원 할 수 있습니다. 사용 git status그들이 더 이상 존재하지 않는 것을 볼 수 있습니다. 이제 익숙한 첫 번째 커밋을 만듭니다. 다음으로 git stash pop, 기본 작업을 수행하여 원래 변경 사항을 복원하고 두 번째 커밋을 작성하는 데 사용할 수 있습니다 .

다른 방법은 필요한 모든 변경을 수행 한 다음 작업의 일부를 포함하는 두 개의 커밋을 만드는 것입니다. 이를 위해 git에서 제공하는 인덱스 (스테이징 영역이라고도 함)를 사용할 수 있습니다. 커밋을 준비하는 데 사용할 수있는 특별한 영역입니다. 여러 파일을 변경했다고 가정하면을 사용하여 각 파일을 색인에 추가 할 수 있습니다 git add. 수행 할 때 git commit인덱스에 추가 된 파일 만 커밋됩니다. git status변경 사항 중 어떤 부분이 커밋되고 그렇지 않은 부분이 표시됩니다. 예를 들어 파일 a.txt, b.txt 및 c.txt를 변경 한 후 다음과 같이하면됩니다 git add a.txt.

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   b.txt
        modified:   c.txt

git commit이 상태에서 수행하면 a.txt에 대한 변경 사항 만 커밋에 추가됩니다.

또한을 사용하여 커밋 할 정확한 변경 사항을 검토하면 커밋 될 git diff --cached모든 변경 사항을 확인할 수 있습니다.

하나의 파일에 두 커밋에 대한 변경 사항이 포함 된 경우 "git add --patch b.txt"를 사용하여 파일의 일부만 색인에 추가 할 수도 있습니다. git은 주어진 파일의 각 변경을 인덱스에 추가해야하는지 묻는 대화식 모드를 제공합니다. 서로 옆에 줄이 바뀌면 두 커밋으로 분할해야하지만 더 해결할 수있는 방법이 있습니다.

준비 영역에 대한 자세한 내용은 http://gitready.com/beginner/2009/01/18/the-staging-area.html을 참조하십시오.

대화식 추가에 대한 자세한 내용은 http://nuclearsquid.com/writings/git-add/를 참조 하십시오.


5

Atlassian의 SourceTree와 같은 Git 용 GUI를 사용하는 경우 git gui파일의 일부를 커밋하고 다른 부분은 커밋되지 않은 상태로 둘 수 있습니다. 실제로 개별 코드 줄을 커밋 할 수 있습니다.

나는 당신이 묘사 한 것처럼 토끼 구멍을 쓰러 뜨릴 때 이것을 자주합니다. 이것은 현명한 커밋 또는 메인 커밋의 선구자로 커밋을 만드는 좋은 방법입니다.

명령 행에서이 작업을 수행 할 수 있지만 어색합니다.

Git 패치 레벨과 개별 라인에서 커밋 할 수 있으면 새 브랜치, 숨김, 커밋, 숨김 및 병합을 만들 필요가 없습니다. 계속 작업하고 흐름을 중단하지 마십시오. 당신은 좋은 일이 있어요.


@MasterMastic THIS는 귀하의 답변입니다. 개별 코드 줄만 커밋 할 수 있다는 것은 놀라운 신의 선물입니다.
JesseTG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.