문제

할 때 나는 내용을 변경하는 파일에서 작업하는 방법은 내가 단지의 일부를 변경해야 합니까?

예를 들어,어떻게 구할 수 있습 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 --interactivegit 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

VIM을 사용하는 경우라는 우수한 플러그인을 사용해 볼 수 있습니다. 도망자.

작업 복사와 색인 사이의 파일의 차이를 볼 수 있습니다. :Gdiff, 그런 다음 클래식 VIM Diff 명령을 사용하여 인덱스에 라인 또는 호크를 추가하십시오. dp. 인덱스에 수정을 저장하고 커밋하십시오 :Gcommit, 그리고 당신은 끝났습니다.

아주 좋은 입문 스크린 캐스트 여기 (ESP 참조. 2 부).

사용하는 것이 좋습니다 Sourcetree Atlassian에서. (무료입니다.) 이것은 이것을 사소하게 만듭니다. 코드의 개별 덩어리 또는 개별 코드 라인을 빠르고 쉽게 무대에 올릴 수 있습니다.

enter image description here

사용해야 할 가치가 있습니다 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의 대답은 때때로 많은 변화가있는 것을 제외하고는 일반적으로하는 일입니다. 그리고 나는 물건을 준비하는 동안 실수를 할 수 있다고 말할 수 있으며, 나는 두 번째 패스를 위해 다시 넘어 질 수있는 헌신적 인 상태를 원합니다.

EMAC를 사용하는 경우 살펴보십시오 매기, EMAC에 대한 GIT 인터페이스를 제공합니다. 지원합니다 준비 덩어리 (파일의 일부) 아주 잘.

Intellij 아이디어 (그리고 시리즈의 다른 모든 제품은 V2018.1 이후 부분 커밋을 지원했습니다.

enter image description here

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 이 명령은 다음과 같은 차이점을 가진 편집기를 열기 때문에 커밋하고자하는 것을 라인별로 선택할 수 있도록 선택할 수 있습니다.

enter image description here

당신이 시작되는 줄을 알고있는 것처럼 + 첨가, 시작하는 줄입니다 - 삭제입니다. 그래서:

  • 무대에 추가하지 않으려면 해당 라인을 삭제하십시오.
  • 삭제를 무대에 두지 않으려면 교체하십시오 - 공간과 함께 .

이것이 무엇입니다 git add -h 이 방법 (파일 패치)에 파일 추가에 대해 말합니다.

추가 된 내용 추가 된 내용은 "+"로 시작하는 줄로 표시됩니다. 추가 라인을 삭제하여 준비를 방지 할 수 있습니다.

컨텐츠 제거 :제거 된 컨텐츠는 "-"로 시작하는 줄로 표시됩니다. "-" ""(공간)로 변환하여 제거 준비를 방지 할 수 있습니다.

수정 된 컨텐츠 : 수정 된 컨텐츠는 "-"라인 (이전 컨텐츠 제거)과 "+"라인 (대체 콘텐츠 추가)으로 표시됩니다. "-"선으로 "" "를 변환하여"+"라인을 제거하여 수정 준비를 방지 할 수 있습니다. 쌍의 절반 만 수정하면 인덱스에 대한 혼란스러운 변화가 발생할 가능성이 높습니다.

주의: 파일의 내용을 변경하지 마십시오. 이것은 좋은 곳이 아닙니다. 삭제 또는 추가 라인의 연산자를 변경하십시오.

을 위한 원자 사용자, 패키지 github 대화식 스테이징을 포함합니다 git gui. 바로 가기의 경우 패키지를 참조하십시오 선적 서류 비치.

Atom을 사용하면 어두운 배경이있는 테마로 작업 할 수 있습니다 (기본적으로 기본적으로 git gui 흰색 배경이 있습니다).

이 질문이 요청 된 지 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

샘플 사용을 보여주는 스크린 캐스트Example

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 이며이 기능도 내장되어 있습니다. 무대에 줄을 선택하고 누르십시오 에스. 선택이 없으면 완전한 덩어리가 무대에 올랐습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top