오류 : 리베이스로 당길 수 없음 : 스테이지되지 않은 변경 사항이 있습니다.


138

나는 프로젝트에서 몇몇 친구들과 협력하기 시작했고 그들은 heroku git 저장소를 사용합니다.

며칠 전에 리포지토리를 복제했으며 이후에 일부 변경을 수행하여 최신 업데이트를 얻으려고합니다.

git pull --rebase여기에 명시된대로 명령을 실행 했습니다 (이것이 올바른 방법입니까?) : https://devcenter.heroku.com/articles/sharing#merging-code-changes

다음과 같은 오류가 발생합니다.

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

내 생각 엔 코드를 어지럽히고 변경 사항을 커밋하거나 버리고 싶습니다 (스 태쉬가 무엇을 의미합니까?). 이런 일이 일어나고 있습니까? 이 경우 변경 한 내용을 취소하고 git 저장소에서 업데이트 된 코드를 가져옵니다.

내가 할 수있는 일에 대한 아이디어가 있습니까?

답변:


173

음주 git status,이 변경하면 어떤 파일이 표시됩니다. 변경 사항을 유지하고 싶지 git checkout -- <file name>않거나 변경 사항을 git reset --hard제거 하고 싶지 않다고 말했기 때문입니다.

대부분의 경우 git은 변경 사항에 대해 수행 할 작업을 알려줍니다. 예를 들어, 오류 메시지가 git stash변경 사항 에 대한 메시지 입니다. 당신이 그들을 유지하려는 경우입니다. 당기고 나면 git stash pop변경 사항이 다시 적용됩니다.

git status 파일이 커밋을 위해 준비되었는지 여부에 따라 변경 사항을 제거하는 방법도 있습니다.


1
이 일이 듯하지만 지금은 다른 오류에 직면하고있다 (안 혼동 미래의 객원에 새로운 질문을 시작) : stackoverflow.com/questions/23518247/...
user3597950

나는 최근에 말 그대로 매번 이것을 가지고 있습니다. 이전에는 현재 변경 사항에 영향을 미치지 않는 파일을 가져 오는 것이 좋지만 이제는 숨김으로 변경 한 모든 것이 필요합니다. 난 밀어 붙일 수 없어, 강제로 사용git push -f
Karma Blackshaw

@KarmaBlackshaw 강제로 밀어 넣을 필요는 없습니다. 강제 푸시를 수행해야하는 경우 로컬 히스토리와 원격 히스토리가 다르며이 답변에서 다루는 내용과 다른 질문입니다.
Schleis

이 질문의 범위가 제공하는 것은 실제로 다릅니다. 그러나 현재 지점을 삭제하고 개발에서 새 지점을 만드는 방법을 찾았습니다. 일부 구성이 잘못되어있는 것이 내 지점이라고 생각합니다.
Karma Blackshaw

91

리베이스를 수행하는 동안 작업 변경 사항을 유지하려면을 사용할 수 있습니다 --autostash. 로부터 문서 :

리베이스를 시작하기 전에 필요한 경우 로컬 수정을 숨기고 ( git-stash [1] 참조 ) 완료되면 숨김을 적용하십시오.

예를 들면 다음과 같습니다.

git pull --rebase --autostash

7
이것이 현대의 답변입니다.
adl

13
autostash를 기본 동작으로 설정 git config --global rebase.autoStash true 하려면 스위치를 통과 할 필요가 없습니다.
Zoredache

1
이것, 내가 찾던 것! (명령 행 스위치는 git 2.9에서 사용 가능하지만 옵션 rebase.autostash은 2.6에서 사용 가능합니다).
jjmontes

이것은 또한 잘 작동합니다 git rebase --interactive!
Dan Dascalescu

6
이것이 기본값이 아닌 이유는 무엇입니까?
Nick

49

리베이스로 당기는 것이 일반적으로 좋습니다.

그러나 인덱스가 깨끗하지 않은 경우, 즉 커밋되지 않은 변경을 한 경우에는 그렇게 할 수 없습니다.

변경 사항을 유지하려는 경우이 작업을 수행하여 해결할 수 있습니다.

  1. 다음과 같이 변경 사항을 숨기십시오. git stash
  2. 리베이스와 마스터에서 당겨
  3. 다시 적용 변경 당신이 (1)에서 은닉 : git stash apply stash@{0}또는 간단git stash pop

1
이 일이 듯하지만 지금은 다른 오류에 직면하고있다 (안 혼동 미래의 객원에 새로운 질문을 시작) : stackoverflow.com/questions/23518247/...
user3597950

6
@nehemiahjacob 또한 git stash pop가장 최근에 저장된 변경 사항을 적용하고 더 이상 암기하지 않도록 할 수 있습니다 apply stash@{0}.
코스타스 Rousis

나는 항상 이것을해야합니다. 더 쉬운 방법?
Alper

@alper는 일반적으로 다른 (기능) 브랜치에서 작업합니다. 내 경험에 따르면, 나는 일을 완수 한 후에 만 ​​마스터를 가져오고 리베이스하기 때문에 숨길 필요가 없습니다. 개발 워크 플로에서 많은 일을하더라도 자신이 찾은 것이라면 언제든지 별칭을 만들 수 있습니다 .bashrc.alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis

@KostasRousis 나는 그 정확한 별칭을 가지고 있습니다. 나는 그것을 'sppgit'이라고 부른다
luizfls

30

먼저 시작 git status

보류중인 변경 사항이 있는지 확인하십시오. 이를 삭제하려면 다음을 실행하십시오.

git reset --hard

이 일이 듯하지만 지금은 다른 오류에 직면하고있다 (안 혼동 미래의 객원에 새로운 질문을 시작) : stackoverflow.com/questions/23518247/...
user3597950

16

이것은 나를 위해 작동합니다 :

git fetch
git rebase --autostash FETCH_HEAD

1
아 오토 스 태쉬, 그러면 두 개의 명령이 더 절약됩니다. 정답 IMO 여야합니다.
Erik Berkun-Drevnig

10

당신은 항상 할 수 있습니다

git fetch && git merge --ff-only origin/master

(a) 업스트림 변경과 충돌하는 커밋되지 않은 변경 사항이있는 경우 변경 사항이 없거나 (b) stash / pull / apply와 동일한 효과 : HEAD의 최신 변경 사항과 커밋되지 않은 변경 사항이 남아있는 리베이스 그대로.


6

git이 파일에서 eol 규칙을 수정하려고하기 때문에 스테이지되지 않은 변경이 발생하면 (항상 내 경우와 같이), 숨김 또는 체크 아웃 또는 재설정이 없어지면 사라질 것입니다.

그러나 의도가 실제로 rebase하고 unstaged 변경을 무시 하려는 경우 분기를 로컬로 삭제 한 다음 다시 확인하십시오.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

짜잔! 그것은 아직 실패하지 않았습니다.


2

변경 사항을 자동으로 숨기고 모든 리베이스에 대해 변경 사항을 해제하려면 다음을 수행하십시오.

git config --global rebase.autoStash true

1
이것은 Git의 최신 버전이 과거에 항상 Git과 동일한 방식으로 작동하도록하는 유일한 대답입니다. 사람들이 --autostash자동으로 할 수있을 때 추가하는 이유는 무엇 입니까?
앤드류 코스터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.