문제
할 때 나는 내용을 변경하는 파일에서 작업하는 방법은 내가 단지의 일부를 변경해야 합니까?
예를 들어,어떻게 구할 수 있습 commit15 라인의 30 라인에서 변경된 파일을?
해결책
당신이 사용할 수있는 git add --patch <filename>
(또는 -p
짧게), git은 파일을 현명한 "hunks"(파일의 일부)라고 생각하는 것으로 분해하기 시작합니다. 그런 다음이 질문을 자극합니다.
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
다음은 각 옵션에 대한 설명입니다.
- 와이 다음 커밋을 위해이 덩어리를 무대에 올리십시오
- N 다음 커밋을 위해이 덩어리를 무대에 두지 마십시오
- 큐 그만두다; 이 덩어리 나 나머지 덩어리를 무대 무대 무대
- ㅏ 이 덩어리와 나중에 모든 덩어리를 파일에 무대
- 디 이 덩어리 나 파일의 나중에 덩어리를 무대에 올리지 마십시오.
- g 갈 덩어리를 선택하십시오
- / 주어진 regex와 일치하는 덩어리를 검색하십시오
- 제이 이 덩어리를 결정하지 못하게하십시오. 다음 미정의 덩어리를 참조하십시오
- 제이 이 덩어리를 결정하지 못하게하십시오. 다음 덩어리를 참조하십시오
- 케이 이 덩어리를 결정하지 못하게하십시오. 이전 미정의 덩어리를 참조하십시오
- 케이 이 덩어리를 결정하지 못하게하십시오. 이전 덩어리를 참조하십시오
- 에스 현재 덩어리를 작은 덩어리로 나눕니다
- 이자형 현재 덩어리를 수동으로 편집합니다
- ? 덩어리 도움을 인쇄하십시오
파일이 아직 저장소에 있지 않은 경우 먼저 할 수 있습니다. git add -N <filename>
. 나중에 당신은 계속할 수 있습니다 git add -p <filename>
.
그 후에는 사용할 수 있습니다.
git diff --staged
올바른 변경 사항을 준비했는지 확인합니다git reset -p
무시하지 않으면 실수로 덩어리가 추가되었습니다git commit -v
커밋 메시지를 편집하는 동안 커밋을 보려면
이것은 이것과 크게 다릅니다 git format-patch
명령, 그의 목적은 데이터를 .patch
파일.
미래 참조 : GIT 도구 - 대화식 준비
다른 팁
당신이 사용할 수 있는 git add --interactive
나 git add -p <파일>
, 다음 git commit
(지 git commit -a
);보 대화형 모드 에 git-추가 ncursesw 에는 와이드,또는 단순히 지시 사항을 따르십시오.
현대적인 자식은 또한 git commit --interactive
(고 git commit --patch
, 은 바로 패션에 대화형 커밋).
당신이 선호하는 경우 그것을 하기서는 GUI 를 사용할 수 있습니다 git-gui.당신은 단순히 표시 덩어리할 수 있에 포함되어 있다.나 개인적으로 그것을 찾을 사용하여 더 쉽 git add -i
.다른 git Gui,다음과 같 QGit 또는 GitX,도 있을 수 있습니다 이 기능을 뿐입니다.
Git Gui 이 기능을 Diff보기에서 제공합니다. 관심있는 라인을 마우스 오른쪽 버튼으로 클릭하면 "이 줄이 커밋하는 스테이지"메뉴 항목이 표시됩니다.
나는 그것을 믿는다 git add -e myfile
단순히 텍스트 편집기를 열고 무대에 원하는 줄과 어떤 라인을 선택할 수 있기 때문에 가장 쉬운 방법입니다 (적어도 내 선호도). 편집 명령과 관련하여 :
추가 된 내용 :
추가 된 내용은 "+"로 시작하는 줄로 표시됩니다. 추가 라인을 삭제하여 준비를 방지 할 수 있습니다.
컨텐츠 제거 :
제거 된 컨텐츠는 "-"로 시작하는 줄로 표시됩니다. "-" ""(공간)로 변환하여 제거 준비를 방지 할 수 있습니다.
수정 된 컨텐츠 :
수정 된 컨텐츠는 "-"라인 (이전 컨텐츠 제거)과 "+"라인 (대체 콘텐츠 추가)으로 표시됩니다. "-"선으로 "" "를 변환하여"+"라인을 제거하여 수정 준비를 방지 할 수 있습니다. 쌍의 절반 만 수정하면 인덱스에 대한 혼란스러운 변화가 발생할 가능성이 높습니다.
에 대한 모든 세부 사항 git add
사용할 수 있습니다 git --help add
사용하는 것이 좋습니다 Sourcetree Atlassian에서. (무료입니다.) 이것은 이것을 사소하게 만듭니다. 코드의 개별 덩어리 또는 개별 코드 라인을 빠르고 쉽게 무대에 올릴 수 있습니다.
사용해야 할 가치가 있습니다 git add --patch
a 새로운 파일 먼저 색인으로 파일을 추가해야합니다. git add --intent-to-add
:
git add -N file
git add -p file
변경 사항이 많고 변경 사항에서 몇 가지 커밋을 만들면 작업을 준비하기 전에 일시적으로 출발점을 저장하고 싶습니다.
이와 같이:
$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop
Whymarrh의 대답은 때때로 많은 변화가있는 것을 제외하고는 일반적으로하는 일입니다. 그리고 나는 물건을 준비하는 동안 실수를 할 수 있다고 말할 수 있으며, 나는 두 번째 패스를 위해 다시 넘어 질 수있는 헌신적 인 상태를 원합니다.
Intellij 아이디어 (그리고 시리즈의 다른 모든 제품은 V2018.1 이후 부분 커밋을 지원했습니다.
JDSUMSION의 답변과 마찬가지로 현재 작업을 숨길 수 있지만 MELD와 같은 DIFFTool을 사용하여 선택한 변경 사항을 숨기기 위해 선택했습니다. 그렇게하면 덩어리를 수동으로 매우 쉽게 편집 할 수 있습니다. git add -p
:
$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop
Stash 메소드를 사용하면 코드가 여전히 작동하는 경우 테스트 할 수 있습니다.
사용하는 사람들을 위해 :
커밋 창에서 부분적으로 커밋하려는 파일을 선택한 다음 오른쪽 창에서 커밋하려는 텍스트를 선택한 다음 선택을 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 '스테이지 선택된 라인'을 선택하십시오.
Vim-Gitgutter 플러그인은 VIM 편집기를 사용하지 않고 덩어리를 무대에 올릴 수 있습니다
:GitGutterStageHunk
이 외에도 일부 현대 IDE와 같이 Diff 부호 열과 같은 다른 멋진 기능을 제공합니다.
덩어리의 일부만 준비 해야하는 경우 vim-fugitive
:Gdiff
그러면 시각적 범위를 선택할 수 있습니다 :'<,'>diffput
또는 :'<,'>diffget
개별 라인 변경을 무대/되돌리기 위해.
시도 해봤 다 git add -p filename.x
, 그러나 Mac에서 나는 Gitx를 발견했다.http://gitx.frim.nl/ 또는 https://github.com/pieter/gitx) 내가 원하는 라인을 정확하게 커밋하는 것이 훨씬 쉽습니다.
거북이 :
파일을 마우스 오른쪽 버튼으로 클릭하고 사용하십시오
Context Menu → Restore after commit
. 파일의 사본이 그대로 생성됩니다. 그런 다음 파일을 편집 할 수 있으며, 예를 들어 TortoiseGitmerge에서 파일을 편집하고 원하지 않는 모든 변경 사항을 취소 할 수 있습니다. 이러한 변경 사항을 저장 한 후 파일을 커밋 할 수 있습니다.
이전 답변에 추가, 명령 줄을 사용하여 입력하는 경우 git add -e myfile
이 명령은 다음과 같은 차이점을 가진 편집기를 열기 때문에 커밋하고자하는 것을 라인별로 선택할 수 있도록 선택할 수 있습니다.
당신이 시작되는 줄을 알고있는 것처럼 +
첨가, 시작하는 줄입니다 -
삭제입니다. 그래서:
- 무대에 추가하지 않으려면 해당 라인을 삭제하십시오.
- 삭제를 무대에 두지 않으려면 교체하십시오
-
공간과 함께.
이것이 무엇입니다 git add -h
이 방법 (파일 패치)에 파일 추가에 대해 말합니다.
추가 된 내용 추가 된 내용은 "+"로 시작하는 줄로 표시됩니다. 추가 라인을 삭제하여 준비를 방지 할 수 있습니다.
컨텐츠 제거 :제거 된 컨텐츠는 "-"로 시작하는 줄로 표시됩니다. "-" ""(공간)로 변환하여 제거 준비를 방지 할 수 있습니다.
수정 된 컨텐츠 : 수정 된 컨텐츠는 "-"라인 (이전 컨텐츠 제거)과 "+"라인 (대체 콘텐츠 추가)으로 표시됩니다. "-"선으로 "" "를 변환하여"+"라인을 제거하여 수정 준비를 방지 할 수 있습니다. 쌍의 절반 만 수정하면 인덱스에 대한 혼란스러운 변화가 발생할 가능성이 높습니다.
주의: 파일의 내용을 변경하지 마십시오. 이것은 좋은 곳이 아닙니다. 삭제 또는 추가 라인의 연산자를 변경하십시오.
이 질문이 요청 된 지 10 년이 지났습니다. 그리고이 대답이 누군가에게 유용하기를 바랍니다. 답에 언급 된 바와 같이 여기, GUI가 옵션이 아닌 경우 Andrew Shadura 's 크레코드 확장 커밋 할 라인을 선택할 수있는 ncurses 창을 가져 오는 데 도움이됩니다.
다음과 같이 확장을 설정하십시오.
git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord
git repo에 CD를 사용하여 다음과 같이 호출하십시오.
git crecord
이렇게하면 아래와 같이 사용할 수있는 NCurses 인터페이스가 나타납니다. NCurses 창에서 다음 키를 누르면 특정 조치가 수행됩니다.
f hunk toggle fold (arrow keys can also be used)
space toggle hunk selection
a toggle commit or amend
c confirm and open commit window
샘플 사용을 보여주는 스크린 캐스트
EMAC의 경우도 있습니다 gitsum
git-융합-index --에서 인용하는 웹 사이트:
git-융합 index 실행 융합-또는 다른 git difftool(kdiff3,확산,etc.) --할 수 있도록 대화식으로 단계 변경을 자식수(git 준비 지역).
이와 유사한 기능의 git add-p,git add--상호 작용입니다.어떤 경우에는 병합은 쉽게/빠르게 사용하기보다 git add p.그 때문에 병합할 수 있습,예를 들어:
- 더보기 컨텍스트
- 보 intra-라인 차이점이
- 으로 편집시'라이브'diff 업데이트(모든 후 업데이트 키)
- 탐색하고없이 변경은 말'n'모든 변경할 건너뛰기
사용법
에 git 을 실행합니다.
git meld-index
당신이 볼 수 융합(또는 당신의 구성 git difftool)팝업으로:
남:임시 디렉토리 contining 파일에서 복사한 작업 나무
오:임시와 디렉토리의 내용을 색인.이것도 포함되어 있지 않은 파일직에서 지수 하지만 수정하거나 추적되지 않은 상태에서 작동을 복사-이 경우에 당신은 파일 내용을 머리에서.
편집수(오른쪽)까지 행복합니다.기억을 저장할 때 필요합니다.
당신이 완료되면,가까이 융합,git-융합 index 것입 업데이트 인덱스의 내용과 일치하는 임시 디렉토리에 오른쪽의 융합하는 당신은 단지 편집합니다.
처럼 하나의 대답 위의 쇼, 당신은 사용할 수 있습니다
git add --patch filename.txt
또는 짧은 형식
git add -p filename.txt
... 그러나 이미 저장소에있는 파일의 경우, s는 commit 명령에서 -patch 플래그를 직접 사용하는 것이 훨씬 좋습니다 (최근의 충분한 버전의 git을 사용하는 경우).
git commit --patch filename.txt
... 또는 다시 한 번 짧은 형식
git commit -p filename.txt
... 그런 다음 커밋에 포함될 라인을 선택하기 위해 언급 된 키 (Y/N 등)를 사용합니다.
켜져 있다면 Windows
내 생각에 플랫폼 git gui
아주 좋은 도구입니다 stage
/commit
몇 줄에서 unstaged
파일
1. 덩어리 현명한 :
- 파일을 선택하십시오
unstagged Changes
부분 - 무대에 필요한 코드 덩어리 마우스 오른쪽 버튼을 클릭하십시오.
- 고르다
Stage Hunk for commit
2. 현명한 라인 :
- 파일을 선택하십시오
unstagged Changes
부분 - 준비 할 라인/라인을 선택하십시오
- 마우스 오른쪽 버튼을 클릭하고 선택하십시오
Stage Lines for commit
3. 몇 줄을 제외한 완전한 파일을 무대에 올리려는 경우 :
- 파일을 선택하십시오
unstagged Changes
부분 - 누르다
Ctrl+T (Stage file to commit)
- 선택한 파일이 이제 이동합니다
Staged Changes
부분 - 스테이지/라인을 선택하십시오
- 마우스 오른쪽 버튼을 클릭하고 선택하십시오
UnStage Lines for commit
git-cola 훌륭한 GUI 이며이 기능도 내장되어 있습니다. 무대에 줄을 선택하고 누르십시오 에스. 선택이 없으면 완전한 덩어리가 무대에 올랐습니다.