git add --interactive“편집 한 덩어리가 적용되지 않습니다.”


85

git add --interactive인덱스에 일부 변경 사항을 선택적으로 추가 하는 데 사용하려고하는데 "편집 한 덩어리가 적용되지 않습니다. 다시 편집 ..."메시지가 계속 나타납니다. e 옵션을 선택해도이 메시지가 표시되고 즉시 편집기를 저장 / 닫습니다. 즉, 덩어리를 전혀 편집하지 않으면 패치가 적용되지 않습니다.

다음은 내가 사용하는 정확한 예입니다 (작은 데모를 작성하려고합니다).

원본 파일 :

first change
second change off branch
third change off branch
second change
third change
fourth change

새로운 파일:

Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
bug fix 1
change supporting feature 1

git add --interactive색인에 "버그 수정 1"줄만 추가 하는 데 사용하는 방법을 보여 주려고합니다 . 파일에서 대화 형 추가를 실행하고 패치 모드를 선택합니다. 그것은 나에게 선물한다.

diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
 first change
 second change off branch
 third change off branch
 second change
 third change
 fourth change
+bug fix 1
+change supporting feature 1

나는 첫 번째 덩어리를 적용하기 위해 분할 후 "아니오"로 응답합니다. 두 번째 덩어리는 편집을 시도합니다. 나는 원래 결론을 삭제하려고 시도했지만 작동하지 않았습니다. 덩어리를 완전히 내버려 두는 것도 효과가 없으며 이유를 알 수 없습니다.


여기서 확인해야 할 좋은 점 -은 처음에 파일에 존재하지 않는 줄의 시작 부분에 '를 추가 하지 않는다는 것입니다. diff이고 아직없는 줄은 삭제할 수 없습니다. 따라서 diff의 줄이로 시작하고 git goes WTF로 +변경하면 -? 이제 제거로 표시된 줄이 처음부터 존재하지 않기 때문에 (대신 해당 줄이 추가로 표시되고 추가로 표시된 줄이 제거로 표시되면 git은 파일에 아직없는 줄을 제거 할 수 없습니다) .
leeand00 2016-04-05

1
제 경우에는 CRLF 대신 하나의 LF를 적용하지 않은 줄 끝 (LF, CRLF)도 확인하십시오!
Alberto Rivelli

답변:


37

이 특정 예에서는 덩어리의 줄 번호를 조정해야합니다. 라인 변경 :

@@ -1,6 +2,8 @@

대신 다음과 같이 읽습니다.

@@ -2,7 +2,8 @@

16
파헤쳐 본 결과, 그 라인이 "from-file range"와 "to-file range"를 보여주는 것을 발견했습니다. 1을 2로 변경하는 논리를 실제로 이해하지 못합니다. 시도해 보았지만 작동하지만 "파일 범위"가 변경되는 이유를 이해하지 못합니다. 전체 패치를 적용하든 편집 한 덩어리 만 적용하든 원본 파일은 동일합니다. 더 자세히 설명 하시거나 통합 diff 형식에 대한 하강 참조를 알려 주시겠습니까? 나는 하나를 찾는 데 실패했습니다.
Josh

9
@Josh : stackoverflow.com/questions/2529441/… 내가 완전히 통합 형식 덩어리를 얻지 못하더라도 도움이 될 수 있습니다. @William +1
VonC

5
@Josh : 살펴보면 버그 일 수 있습니다. 덩어리를 편집 한 후 git은 모든 덩어리가 적용 되는지 확인하여 패치를 확인합니다 (과도 할 수 있음). 안타깝게도이 경우 이전 덩어리 (적용하지 않는)가 검사되고 있으며 git apply --check가 실패하는 원인이 겹치는 부분이 있습니다. 나는 우아한 해결책을 모른다. git은 여기서 지나치게 조심해서 올바른 일을 할 수 있습니다.
William Pursell 2010-07-20

22
줄 번호 변경에 대한 자세한 정보를 원하십니까? 왜 그렇게해야합니까? 그리고 어떻게? 각 숫자는 무엇을 의미합니까?
Bill

4
@WilliamPursell 어떤 버전의 git? 새 컴퓨터로 전환하고 git v2.17.0을 실행했는데 갑자기 내 패치 편집이 더 이상 유효하지 않습니다.
Dennis

105

이 git-add 게시물 과 비슷 합니까?

덩어리를 수동으로 편집하는 것은 매우 강력하지만 이전에 해본 적이 없다면 약간 복잡합니다.
명심해야 할 가장 중요한 사항 : diff는 다른 들여 쓰기에 추가하여 항상 한 문자로 들여 쓰기됩니다.
문자는 다음 중 하나 일 수 있습니다.

  • 공백 (변경되지 않은 줄을 나타냄),
  • -광고가 제거되었음을 나타내는,
  • 또는 +라인이 추가되었음을 나타냅니다.

다른 건 없습니다. 공백,-또는 + 여야합니다. 그 밖의 모든 것은 오류가 발생합니다
(변경된 행에는 문자가 없습니다. 변경된 행은 이전 행을 제거하고 변경된 행을 새 행으로 추가하여 처리되기 때문입니다).

선호하는 텍스트 편집기에서 diff를 열었으므로 (Git에서 선호하는 텍스트 편집기를 사용하도록 구성 했습니까?) 원하는대로 수행 할 수 있습니다. 결과 diff가 깔끔하게 적용되는지 확인하면됩니다.

그리고 거기에 속임수가 있습니다. 이전에이 작업을 수행 한 적이 없다면 Git에서 "편집 한 덩어리가 적용되지 않습니다. 다시 편집 하시겠습니까?"라고 알려줍니다. 너무나 자주, 당신은 이것을 알아 내지 못하는 당신 자신을 증오하기 시작할 것입니다. 비록 그것이 너무 쉬워 보이지만 (또는 당신이 원하는 것을 알아낼 수 없기 때문에 Git).

나를 자주 넘어 뜨리는 한 가지는 내가 한 글자 들여 쓰기를 잊었다는 것입니다.
제거 할-로 줄을 표시했지만를 삽입하는 대부분의 텍스트 편집기 -에서는 이전에 있던 공백을 덮어 쓰지 않습니다. 이것은 전체 줄에 추가 공간을 추가한다는 것을 의미합니다. 즉, diff 알고리즘이 원본 파일에서 줄을 찾거나 일치시킬 수 없다는 것을 의미합니다 . 즉, Git이 당신에게 소리를 지른다는 것을 의미합니다 .

다른 한 가지는 diff가 여전히 의미가 있어야한다는 것입니다. "센스"는 깔끔하게 적용 할 수 있다는 의미입니다. 당신이 현명한 diff를 만드는 정확한 방법은 (적어도 지금 당장은 나에게) 약간 어두운 예술처럼 보이지만, 당신은 항상 원본 파일이 어떻게 생겼는지 염두에두고 그에 따라 -s와 + s를 계획해야합니다. 심술쟁이를 충분히 자주 편집하면 결국 익숙해 질 것입니다.

git add -p에 대한커밋 도 참조하십시오 .

Ortomala Lokni답변Joaquín Windmüller 블로그 게시물 " git로 커밋 할 변경 사항 선택 (또는 Imma 편집 당신의 덩어리) "을 참조합니다.

줄을 세는 대신 Git이 원하는 것은 편집 된 덩어리를 적용하기 전에 겹치는 덩어리를 합치는 것입니다 (편집 될 때).
이는 2018 년 중반논의 되었으며 다음과 같은 시나리오를 피할 것입니다.

덩어리를 분할하면 첫 번째 하위 덩크를 편집하고 후행 컨텍스트 줄을 삭제로 변환 한 다음 두 번째 하위 덩크를 준비하려고하면 실패합니다.


5
링크 주셔서 감사합니다.하지만 이미 본 적이 있습니다. 나는 추가 줄을 추가하거나 남기지 않았습니다. 문제는 줄 번호에 있었지만 여전히 수정 사항을 이해하지 못합니다.
Josh

9
삭제 된 '-'를 공백으로 바꾸지 않았으므로 들여 쓰기가 망가졌습니다. 고마워!!
pedorro

공백 부분을 오해하지 않도록하십시오. 나는 모든 변화 라인이 검은 그냥 줄 수 있어야 생각 - 대신 단지 들여 쓰기 문자의 ... 내가 왜 이해 될 때까지 "편집 덩어리가 적용되지 않는"한 시간했다 : - /
oligofren

@oligofren 내가 당신을 이해하는지 잘 모르겠습니다. 편집 한 덩어리를 적용하기 위해 무엇을해야 했습니까?
VonC

1
@VonC : 먼저 - foo ``( "공백 전체 라인"이 아닌 공백 만)으로 변경해야한다고 생각했습니다 . 'foo'여야한다는 것을 이해하는 데 시간이 걸렸습니다.
oligofren

48

물론 나는 이것에 늦었지만 그럼에도 불구하고이 문제 는 작년에 git 메일 링리스트에서 논의 되었고 그 이후로 많이 변하지 않은 것 같다는 기록을 위해 언급하고 싶었 습니다.

이 특정 문제 는 동일한 덩어리를 분할 하고 편집하려는 시도 에서 발생 합니다. 원래 Jeff King이 게시 한 기본 문제에 대한 분석은 다음과 같습니다.

흠. 그래 알았어. "does this diff apply"체크는 분할 패치의 부분을 ​​git-apply에 공급합니다. 그러나 물론 두 번째 부분은 컨텍스트가 첫 번째 부분과 겹치지 만 고려하지 않기 때문에 올바르게 적용되지 않습니다.

함께 확인하고 바로 편집 된 패치가 일 것입니다. 그러나 분할 패치의 나머지 절반을 수락하는지 여부에 따라 편집 한 패치가 장기적으로 적용되지 않을 가능성은 고려하지 않습니다. 그리고 우리는 아직 알 수 없습니다. 사용자가 우리에게 말하지 않았을 수도 있기 때문입니다 (전반을 건너 뛰었다가 나중에 편집 단계 후에 다시 돌아올 수있었습니다).

Jeff는 항상 성공하는 매우 실용적인 해결 방법으로 게시물을 마무리하므로 적극 권장됩니다.

따라서 일반적으로 동일한 덩어리를 분할하고 편집하는 것은 본질적으로 위험하며 이러한 종류의 문제로 이어질 것이라고 생각합니다. 그리고 편집은 기능의 상위 집합을 제공하기 때문에, 나는 당신이 단지 편집하고 당신의 선호에 따라 덩어리의 첫 부분이 적용되도록 허용해야한다고 생각합니다.

이전에 분할되지 않은 덩어리 만 편집하도록 선택하면 줄 번호를 처리 할 필요가 없습니다.


6
감사합니다. 이것은 줄 번호를 조작하는 것보다 참으로 쉽습니다.
michiakig

3
이것은 내 문제였습니다. 내 덩어리가 더 작아야했습니다. 대화식으로 분할을 수행했습니다. 분할은 내가 원하는 것이 아니기 때문에 수동으로 편집하기로 결정했습니다. 오류가 계속 발생했습니다. 다시 시작하고 먼저 시도했습니다.
Kyle s

이 스레드에서 가장 좋은 답변입니다. 분할 및 편집하지 마십시오. 그냥 편집하십시오.
Dr_Zaszuś

제 경우 ^M에는 diff 파일에 표시된 Windows 줄 끝에서 추가 문제가 발생했습니다 . CR 엔딩으로 파일을 저장하면 대화 형 편집 패치가 진행되었습니다!
Dr_Zaszuś

고마워, 이것은 나를 위해 트릭을했다. 나는 거대한 덩어리로 작업해야했기 때문에 그것을 분할했고 모든 것이 망가졌습니다. 분할되지 않은 상태로 유지하면 모든 것이 잘 작동합니다.
Matthias Fischer

16

다음과 같이 삭제를 위해 준비된 라인을 삭제하지 않으려는 경우

 first line
-second line
 third line

두 번째 줄을 유지하려면 -전체 줄을 삭제하는 대신 공백으로 바꾸십시오 (추가 된 줄을 제거하려는 경우). Git은 컨텍스트를 위해 라인을 사용합니다.


1
이것은 나에게 명확하지 않았으며 Git이 줄을 단일 공간으로 만들라고 말하고 있다고 생각했습니다.
JackHasaKeyboard 2016

15

hunk 헤더 (예 :)를 올바르게 수정하는 것도 중요합니다 @@ -1,6 +1,9 @@. Joaquin Windmuller는 자신의 블로그 게시물 중 하나에서 헝크 헤더 편집의 비밀을 밝힙니다 .

심술쟁이 편집의 비밀

덩크를 편집하는 것은 처음에는 혼란 스러울 수 있습니다. git이 도움을 주지만 시작하기에 충분하지 않습니다.

# —||

# To remove ‘-’ lines, make them ’ ’ lines (context).

# To remove ‘+’ lines, delete them.

# Lines starting with # will be removed.

#

# If the patch applies cleanly, the edited hunk will immediately be

# marked for staging. If it does not apply cleanly, you will be given

# an opportunity to edit again. If all lines of the hunk are removed,

# then the edit is aborted and the hunk is left unchanged.

비밀 소스는…

  • +로 시작하는 줄을 제거하면 하면 새 줄 수 (덩어리 헤더의 마지막 숫자)에서 1을 뺍니다 .
  • 다음으로 시작하는 줄을 제거하는 경우 새 줄 수 (덩어리 헤더의 마지막 숫자)에 하나를 추가합니다. 합니다.
  • 다른 라인 (참조 라인)을 제거하지 마십시오.

이렇게하면 원하는 부분을 선택하기 위해 덩어리를 빠르게 수정할 수 있습니다.


1
덩어리 헤더의 편집을 자동화하거나 git을 구성하여 적절한 줄 수를 결정하는 방법이 있습니까?
Dennis

이를 자동화하기 위해 좋아하는 편집기를 스크립팅 할 수 있습니다. 아마도 이것에 대한 플러그인이 이미 있을지도 모르지만 이것은 편집기에 따라 다릅니다.
Ortomala Lokni

14

최근에이 스레드를 읽고 수동 편집을 수행하는 방법을 알아 냈습니다.

내가 사용한 트릭은 다음과 같은 diff가있는 경우입니다.

+ Line to add
+ Line to add
+ Line I dont want to include
+ Line I dont want to include

요령은 내가 원하지 않는 두 줄을 완전히 제거하여 결과 diff를 다음과 같이 만드는 것입니다.

+ Line to add
+ Line to add

이것은 대부분의 사람들에게 분명 할 가능성이 높지만, 오늘까지는 제게 아니었고 제 경험을 공유해야한다고 생각했습니다. 이 방법에 위험이 있는지 알려주세요.


2
충분히 감사 할 수 없습니다! 나는 적어도 한 시간 동안를 +a 로 바꾸려고했다 ' '.
soumer

아시다시피 광기는 같은 일을하고 다른 결과를 기대하고 있습니다. 나는 내가 단지 삭제해야한다는 것을 알아 내기 전에 20 분 동안 나 자신에게 그것을 말하고 있었다 :)
solidak

이것이 답이되어야합니다. 멋지고 간단합니다. 감사합니다!
xPeaWhyTee

7

줄 번호를 수동으로 편집 할 수 있으며, 이는 경우에 따라 유용합니다. 그러나 먼저 덩어리를 분할하지 않음으로써이 특정 문제를 피할 수있을 것입니다.

나중에 Git이 자동으로 선택한 덩어리에서 무언가를 편집해야 할 것 같다면 분할하고 절반을 준비한 다음 나머지 절반을 편집하는 것보다 전체 덩어리를 편집하는 것이 가장 좋습니다. 힘내는 그것을 알아내는 더 나은 일을 할 것입니다.


6

나는 같은 문제에 대한 해결책을 찾기 위해이 질문에 왔고, 내 경우에 git이 받아들이도록 덩어리에서 (위에서 제안한 것처럼) 줄 번호를 변경하는 방법을 알아낼 수 없었습니다. 그래도 사용하는 훨씬 더 좋은 방법을 찾았습니다 git gui. 여기에서 스테이징하려는 diff의 라인을 선택한 다음 마우스 오른쪽 버튼을 클릭하고 "Stage lines from commit"을 선택할 수 있습니다. 나는 git-cola를 기억한다 도 같은 기능을 가지고 있음을 합니다.


이것은 정말로 답이되어야합니다. git-colaLinux, Windows 및 MacOS에서 작동하는 것으로 보입니다.
leeand00 jul.

5

이 오류가 발생했을 때 내가 가진 또 다른 문제는 편집 파일을 저장할 때 줄 끝이 변경되었다는 것입니다.

편집을 위해 Windows를 사용하고 메모장을 사용했습니다 (Windows 줄 끝으로 만 저장). 내 코드는 Notepad ++로 작성되었으며 Unix / Linux 스타일 줄 끝을 갖도록 설정했습니다.

Notepad ++를 기본 git 편집기로 사용하도록 설정을 변경했을 때 덩어리를 편집 할 수있었습니다.

git config --global core.editor "notepad++"

1
이것은 나를 위해 일했습니다. 하지만 notepad ++의 전체 경로가 필요했고 제대로 작동하는 데 시간이 좀 걸렸습니다. git config --global core.editor '"C:/Program\ Files\ \(x86\)/Notepad++/notepad++.exe"' (notepad ++가 PC에 설치된 위치에 따라 조정)
Annabel

1
나에게 똑같은 문제. 문제를 일으키는 것은 메모장이었습니다. 기본 편집기를 Notepad ++로 전환하면 모든 것이 다시 작동하기 시작했습니다.
Johnny Oshika

4

이상한 "편집 된 덩어리가 적용되지 않습니다"메시지 ( "오류 : 줄에 헤더없는 패치 조각 ..."과 같은 메시지가 함께 표시됨)에 대한 한 가지 이유는 후행 공백을 제거하도록 구성된 편집기 일 수 있습니다. 이것은 패치가 빈 줄을 하나의 공백이있는 줄로 인코딩하므로 이러한 편집기로 저장하면 빈 줄을 포함하는 덩어리가 적용되지 않으므로 분명히 큰 문제가 발생할 수 있습니다. 따라서 실제로 변경되지 않은 빈 줄을 포함하는 덩어리는 후행 공백 제거가 켜져 있으면 편집 후 적용되지 않습니다.


0

참고로, 약간의 상호 관련된 오류가 발생했습니다. 위의 제안 된 지침에 따라 패치를 추가 할 때 ... 그러나 오류가 표시되지 않았습니다. 같은 덩어리를 무대에 올려달라고 반복해서 요청하고 있었는데 ... Vim 7.4의 이전 버전을 실행하고 있다는 것을 알았습니다. vim을 업그레이드했고 지금 예상대로 작동하고 있습니다. 바라건대 이것은 누군가를 도울 것입니다 ..

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