새 파일을 포함하려면 'git add --patch'?


104

내가 실행할 때 git add -pgit가 새로 만든 파일을 선택할 덩어리로 선택하는 방법이 있습니까 ??

따라서라는 새 파일을 foo.java만든 다음 git add -p를 실행하면 git은 색인에 추가 할 파일의 내용을 선택할 수 없게합니다.

답변:


77

모든 새 파일에 대해이를 수행하려면 다음을 실행할 수 있습니다.

git add -N .
git add -p

자주 사용하려면에 별칭을 만들 수 있습니다 ~/.bashrc.

alias gapan='git add --intent-to-add . && git add --patch'

주의 : 빈 새 파일에 이것을 사용하면 git은 패치를 할 수 없으며 다음 파일로 건너 뜁니다.


13
무엇을하는지 궁금한 사람이라면 git add -N지정된 추적되지 않은 파일을 색인에 추가하기 만하면됩니다.
Odin

112

git add -p someNewFile.txt새 파일 (추적되지 않은 파일)을 시도 할 때 git은 단순히 출력 No changes.하고 중지합니다. 먼저 새 파일을 추적하겠다고 git에게 알려야했습니다.

git add -N someNewFile.txt
git add -p

그러나 파일이 추적되지 않았기 때문에 분할 할 수없는 하나의 거대한 덩어리로 표시됩니다 (모두 새로운 것이기 때문입니다!). 그래서 덩어리를 더 작은 조각으로 편집해야했습니다. 익숙하지 않은 경우이 참조 를 확인하여 시작하십시오.

업데이트-Hunk 편집 정보 위의 참조가 사라지는 경우에이를 업데이트하고 싶었습니다. 새 파일이 추적되지 않기 때문에 파일의 git add -p모든 줄이 한 덩어리의 새 줄로 표시됩니다. 그런 다음 해당 덩어리로 무엇을 할 것인지 묻고 다음과 같은 프롬프트를 표시합니다.

Stage this hunk [y,n,q,a,d,/,e,?]?

전체 덩어리를 커밋하고 싶지 않다고 가정하고 (따라서 전체 파일; git add -p그 경우에 왜 사용하고 싶은지 확실하지 않기 때문에 ) e편집하고 싶다고 git에게 알리는 옵션 을 지정하고 싶을 것입니다. 덩어리.

덩크를 편집하고 싶다고 git에게 말하면 원하는 편집기로 이동하여 변경할 수 있습니다. 모든 줄은 a로 시작해야하며 +git은 #파일 끝에 몇 가지 설명 주석 (으로 시작 )이 있습니다. 파일의 초기 커밋에서 원하지 않는 줄을 삭제하면됩니다. 그런 다음 편집기를 저장하고 종료하십시오.

git의 hunk 옵션에 대한 Git의 설명 :

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

1
누군가 요약하여 대답하십시오.
Inanc 구 무스

5
요약하면, git add -N someNewFile.txt다음git add -p
CatShoes

7

git add -p 이미 추적 된 파일에 변경 사항을 추가하는 것입니다.

추가 할 파일을 대화식으로 선택하는 명령은 git add -i입니다. 예를 들면 :

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(실제 명령은 여기에 잘라서 붙여 넣을 수없는 색상이있어 보이는 것보다 더 좋습니다)

실제로의 p atch 명령은와 git add -i동일 git add -p하므로 두 번째 명령은 첫 번째 명령의 하위 집합입니다 (내가 자신을 사랑 add -p하고 싫어 한다는 것을 인정하더라도 add -i!).


"나는 내가 add -p를 좋아하고 add -i 나 자신을 싫어한다는 것을 인정한다!" 이것이 바로 git add then patch가 제가 좋아하는 솔루션 인 이유입니다. 추가하려는 새 파일의 내용 (빈 버전과 비교하기 때문에)과 편집 한 패치 파일의 내용을 확인할 수 있습니다!
Ulysse BN

내가 틀렸다면 저를 정정하십시오. 그러나 여기 대화식 모드에서도 패치는 여전히 No changes.새 파일에 출력 됩니다. OP는 전체 파일이 아닌 새 파일에서 덩어리를 추가하는 방법을 묻고있었습니다. 나는 --intent-to-add여전히 여기에 필요 하다고 믿는다 .
Jeff Puckett

add -p혼자서는 작동하지 않지만이 대답은을 제안 add -i합니다.
Matthieu Moy

에 대해 몰랐기 때문에 투표하고 git add -i있습니다. 그러나 .NET과 비 대화식으로 동일한 작업을 수행 할 수 git add -N있습니다.
Mad Physicist

4

--cached플래그 를 사용하는 매우 유사한 접근 방식도 있습니다 .

1) 추가 된 파일과 마찬가지로 스테이지되지 않은 변경 사항을 스테이지로 전환하십시오.

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2) 차이점을 확인합니다 (참고 : 편집 내용과 새 파일을 모두 포함 할 수 있음).

git diff --cached

3) 패치를 만듭니다.

git diff --cached > my_patch_file.patch

불행히도 동일한 목적을 달성하지 못할 것입니다. 내가 좋아 git add -p하는 점은 모든 것을 추가하지는 않지만 추가 할 항목을 선택하고 선택하겠습니다. 이 솔루션은 맹목적으로 모든 것을 추가합니다.
Alexander Bird

추가 할 항목을 선택할 수 있습니다! 답변을 업데이트하겠습니다.
doublejosh

1
감사합니다 : 모든 것 : 이것은 나를 위해 놀랍게 작동합니다
macool
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.