힘내 커밋이 완료되지 않았지만 해당 컴퓨터에서 계속할 수 없습니다


11

커밋 준비가되지 않았지만 다른 워크 스테이션 또는 랩톱에서 완료해야하는 워크 스테이션에 커밋되지 않은 코드가있는 문제가 발생하는 경우가 있습니다.

"소프트 커밋 (soft commit)"또는 다른 머신으로 변경 사항을 다른 곳으로 옮기는 다른 방법과 같은이 문제에 대한 해결책이 있습니까?

제대로 구현되지 않은 변경 사항을 커밋하고 푸시하지 않는 것이 좋습니다.


2
이 게시물은 읽기 어렵습니다 (텍스트의 벽). 더 나은 형태로 편집 하시겠습니까 ?
gnat

.. 나중에 들리는 것 같은데 git stash...?
Simon Whitehead

@SimonWhitehead 예 git stash를 다른 컴퓨터로 쉽게 옮길 수 있습니까?
csteifel

모든 Git 커밋은 "소프트 커밋"입니다.
user253751

답변:


12

다음은 로컬 리포지토리가 다른 서버 (예 : github)에있는 리포지토리의 복제본이라고 가정합니다. 업스트림 서버를 변경할 권리가 있습니다. 이 예에서는이 업스트림 리포지토리를 "원본"이라고했습니다. git remote show다른 저장소를 나열하기 위해 실행하십시오 . 이것은 그것이 무엇인지에 대한 힌트를 줄 수 있습니다.

지점을 만드는 것이 좋습니다. 그러면 다른 컴퓨터에서 지점을 확인할 수 있습니다. 실제로 작업을 시작하자마자 지점을 만들면 안정적인 코드 세트를 사용하지 않고도 지점에 "커밋"하고 작업을 추적하고 백업 할 수 있습니다. 작업에 만족하면 "마스터"지점으로 다시 병합 할 수 있습니다.

  • 리포지를 분기하려면 : git checkout -b MyNewBranch
  • 새 지점의 커밋 된 변경 사항을 푸시하려면 git push origin MyNewBranch
  • 다른 머신에서 브랜치를 체크 아웃하려면 : git checkout MyNewBranch
  • 다른 지점으로 전환하려면 (예 : "마스터") git checkout master
  • 마스터 인 경우 MyNewBranch를 다시 병합하려면 다음을 수행하십시오. git merge MyNewBranch
  • 분기를 나열하려면 git branch

3
그렇습니다. 항상 개인 브랜치에서 일하면이 문제가 해결됩니다. 다른 사람에게 영향을 미치지 않고 원하는만큼 커밋 할 수 있습니다. 새 기능에 대한 작업을 시작하거나 새 결함을 수정할 때마다 새 분기를 작성하는 것이 더 좋습니다. 이를 통해 코드베이스 간을 앞뒤로 매우 쉽게 이동할 수 있습니다.
로봇 고트

또한 내가하는 이유 : 도중에 실수를하면 현재 분기의 이전 커밋으로 이동할 수 있습니다. 아니면, 뒤로 뛰어 넘어서 한 조각을 잡고 앞으로 뛰어 가서 적용하십시오.
AMADANON Inc.

1
이 방법은 병합 된 마스터 브랜치에서 불완전한 커밋도 포함하지 않습니까?
eimrek

예, 그리고 (제 생각에는) 나쁜 것은 아닙니다. 원하지 않으면 위의 작업을 수행 한 다음 코드를 커밋하는 대신 diff (모든 파일 변경 사항은 포함하지만 커밋은 포함하지 않음)를 만들고 분기의 새로운 사본에 적용 한 다음 푸시하십시오.
AMADANON Inc.

2
" 다른 브랜치로 전환하려면git branch -d master "과 관련하여 혼란 스럽지만 git 이 마스터 브랜치 를 삭제 하도록 요청하지 않습니까 ? (어쨌든 git branch 매뉴얼을 읽음으로써 얻은 인상입니다)
Tasos Papastylianou

2

git diff패치를 만든 다음 다른 컴퓨터에 적용 할 수 있습니다 . 또는 임시 커밋을 만든 다음 다른 컴퓨터에서 가져 오기를 수행 할 수 있습니다. 다른 머신에 임시 브랜치를 생성하고 임시 커밋을 푸시 한 다음 브랜치를 삭제할 수도 있습니다.

내가 좋아하는 방법은 두 번째 방법입니다. 임시 커밋을 만든 다음 다른 컴퓨터로 이동하여 다음과 같이하십시오.

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^

왜 그렇게 복잡하고 사용하지 git format-patch않습니까?
try-catch-finally

와 크게 다르지 않습니다 git diff. 내가 놓친 것이 있습니까?
aragaer

1
git format-patch deadbee..badcab1e- .patch멋진 이름과 커밋 메시지를 유지하면서 커밋마다 파일을 생성 합니다.
try-catch-finally

아직 커밋되지 않은 변경 사항에 대한 패치도 작성합니까? 현재 색인과 아직 준비되지 않은 항목을 분리합니까? 그렇지 않은 것 같습니다.
aragaer

커밋되지 않은 / 무단계 변경은 아닙니다. 그러나 커밋은 푸시하지 않는 한 다른 사람에게 해를 끼치 지 않기 때문에 커밋하는 것이 좋습니다 ( "WIP"-진행중인 작업 메시지).
try-catch-finally

2

나는 그것을 저지른다 . 나는 그것을 개인 지점으로 밀고 다른 쪽을 확인하고 수정합니다. 완료되면 개인 브랜치를 삭제하십시오.

물론 repos 사이를 직접 푸시하거나 bundle 또는 format-patch/를 사용할 수 am있지만 개인 브랜치는 훨씬 쉬운 솔루션입니다. 그리고 공유 브랜치에 푸시되지 않는 한 히스토리 재 작성은 큰 문제가되지 않습니다. 많은 프로젝트에서 사람들이하는 가정 들에게 검토를 위해 이해하기 쉽게 유지하는 기능 가지를 되감기 할 수 있습니다.


0

쉬운 방법은 당신이 설명하는 것입니다 : .git숨겨진 디렉토리와 프로젝트 파일을 커밋하고 마무리하거나 계속 작업 할 수있는 다른 머신에 복사하십시오 .

.git디렉토리는 자식 역사는 계속된다, 그래서 실제 파일과 함께이를 보존하는 것이 전체 프로젝트의 역사는 그대로 유지됩니다.

원래 머신을 사용하여 영구적으로 수행 한 경우이 방법을 사용하는 것이 좋습니다.


0

다른 사람들이 대답했듯이 Git을 사용하면 개인 브랜치에서 완료되지 않은 코드에 신경 쓰지 않아야합니다. 그러나 어떤 이유로 든 미완성 작품이 메인 리포지토리에 닿지 않게하려면 Git의 분산 특성을 활용할 수 있습니다!

git bundle중앙 저장소없이 쉽게 변경 사항을 전달할 수 있는 간단한 도구 가 있습니다. 먼저 저장소를 복제하십시오.

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

몇 가지 사항을 변경하고 임시 지점에 적용하십시오.

git checkout -b tmp_branch
git commit -a -m "temporary changes"

이제 변경 사항을 묶습니다.

git bundle create ../tmp.bundle tmp_branch

이제 새 시스템으로 메일을 보낼 수있는 번들 파일이 있습니다. 거기서 어떻게 사용합니까? 새로운 작업 사본을 만들어 봅시다 :

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

번들을 다른 리모컨으로 취급해야 변경 사항을 가져올 수 있습니다.

git remote add tmp ../tmp.bundle
git fetch tmp

요점은 흔적을 남기지 않고 변경 사항을 전송하는 것이 었으므로 임시 커밋을 잃지 않기 위해 변경 사항을 작업 복사본으로 스쿼시하고 싶습니다.

git merge tmp/tmp_branch --squash

남은 것은 임시 리모컨을 제거하는 것입니다.

git remote remove tmp

비올라! 브랜치 나 커밋의 흔적을 남기지 않고 변경 사항이 새 작업 복사본으로 전송되었습니다!

그러나 실제로이 과정은 상당히 길고 번거 롭습니다. 이것은 SVN이 아닌 Git입니다. 개인 지점을 중앙 저장소로 밀지 않을 이유가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.