Git에서 파일을 변경할 때 변경 사항 중 일부만 커밋하려면 어떻게 해야 합니까?
예를 들어 파일에서 변경된 30줄 중 15줄만 커밋하려면 어떻게 해야 합니까?
질문자 :freddiefujiwara
Git에서 파일을 변경할 때 변경 사항 중 일부만 커밋하려면 어떻게 해야 합니까?
예를 들어 파일에서 변경된 30줄 중 15줄만 커밋하려면 어떻게 해야 합니까?
git add --patch <filename>
(또는 -p
)을 사용할 수 있으며 git은 파일을 합리적인 "덩어리"(파일의 일부)로 분류하기 시작합니다. 그러면 다음과 같은 질문이 표시됩니다.
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
다음은 각 옵션에 대한 설명입니다.
+
/ -
를 #
으로 바꿔 덩어리를 수동으로 편집할 수 있습니다( veksen에게 감사). 파일이 아직 저장소에 없으면 먼저 git add -N <filename>
수행할 수 있습니다. git add -p <filename>
계속할 수 있습니다.
그 후에 다음을 사용할 수 있습니다.
git diff --staged
올바른 변경 사항을 준비했는지 확인합니다.git reset -p
git commit -v
커밋 메시지를 편집하는 동안 커밋을 확인합니다. .patch
파일로 구문 분석하는 것을 목적 git format-patch
명령과 매우 다릅니다.
미래를 위한 참조: Git 도구 - 대화형 스테이징
당신은 사용할 수 있습니다 git add --interactive
또는 git add -p < file >
, 다음 git commit
(안 git commit -a
); git-add 맨페이지의 대화형 모드 를 참조하거나 지침을 따르십시오.
Modern Git에는 git commit --interactive
(및 git commit --patch
, 대화형 커밋의 패치 옵션 바로 가기)도 있습니다.
GUI에서 수행하는 것을 선호하는 경우 git-gui 를 사용할 수 있습니다. 커밋에 포함하려는 청크를 간단히 표시할 수 있습니다. git add -i
사용하는 것보다 쉽습니다. QGit 또는 GitX와 같은 다른 git GUI에도 이 기능이 있을 수 있습니다.
git gui 는 diff 보기에서 이 기능을 제공합니다. 관심 있는 라인을 마우스 오른쪽 버튼으로 클릭하면 "이 라인을 커밋할 준비" 메뉴 항목이 표시되어야 합니다.
git add -e myfile
이 가장 쉬운 방법(최소한 내 취향)이라고 생각합니다. 왜냐하면 단순히 텍스트 편집기를 열고 어떤 줄을 준비하고 어떤 줄을 만들지 않을지 선택할 수 있기 때문입니다. 편집 명령에 관하여:
추가된 콘텐츠:
추가된 콘텐츠는 "+"로 시작하는 줄로 표시됩니다. 추가 라인을 삭제하여 스테이징을 방지할 수 있습니다.
제거된 콘텐츠:
제거된 콘텐츠는 "-"로 시작하는 줄로 표시됩니다. "-"를 " "(공백)으로 변환하여 제거 단계를 방지할 수 있습니다.
수정된 내용:
수정된 내용은 "-" 줄(이전 내용 제거) 다음에 "+" 줄(대체 내용 추가)로 표시됩니다. "-" 줄을 " "로 변환하고 "+" 줄을 제거하여 스테이징 수정을 방지할 수 있습니다. 쌍의 절반만 수정하면 인덱스에 혼란스러운 변경이 발생할 수 있습니다.
git add
에 대한 모든 세부 정보는 git --help add
에서 확인할 수 있습니다.
vim을 사용하는 경우 fugitive 라는 훌륭한 플러그인을 사용해 볼 수 있습니다.
:Gdiff
하여 작업 복사본과 인덱스 간의 파일 차이를 dp
와 같은 고전적인 vim diff 명령을 사용하여 인덱스에 행이나 덩어리를 추가할 수 있습니다. 수정 사항을 인덱스에 저장하고 :Gcommit
커밋하면 완료됩니다.
Atlassian의 SourceTree 를 사용하는 것이 좋습니다. (무료입니다.) 이것은 사소한 일입니다. 개별 코드 덩어리 또는 개별 코드 줄을 빠르고 쉽게 준비할 수 있습니다.
새 파일에 git add --patch
를 사용 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의 대답은 내가 평소에 하는 일입니다. 가끔 많은 변경 사항이 있고 작업을 준비하는 동안 실수를 할 수 있다는 것을 알 수 있으며 두 번째 패스를 위해 다시 의지할 수 있는 커밋된 상태를 원합니다.
emacs를 사용하는 경우 emacs용 git 인터페이스를 제공하는 Magit을 살펴보십시오. 그것은 스테이징 덩어리 (파일의 일부)를 아주 잘 지원합니다.
이전 답변에 추가하여 명령줄 사용을 선호하는 경우 git add -e myfile
입력하면 커밋하려는 항목을 한 줄씩 선택할 수 있습니다. 이 명령은 다음과 같이 차이점이 있는 편집기를 열 것이기 때문입니다.
+
로 시작하는 줄은 덧셈이고 -
로 시작하는 줄은 삭제입니다. 그래서:
-
공간
. 이것은 git add -h
가 이런 방식으로 파일을 추가하는 것에 대해 말하는 것입니다(파일 패치).
추가된 내용 추가된 내용은 "+"로 시작하는 줄로 표시됩니다. 추가 라인을 삭제하여 스테이징을 방지할 수 있습니다.
제거된 내용: 제거된 내용은 "-"로 시작하는 행으로 표시됩니다. "-"를 " "(공백)으로 변환하여 제거 단계를 방지할 수 있습니다.
수정된 콘텐츠: 수정된 콘텐츠는 "-" 줄(이전 콘텐츠 제거) 다음에 "+" 줄(대체 콘텐츠 추가)로 표시됩니다. "-" 줄을 " "로 변환하고 "+" 줄을 제거하여 스테이징 수정을 방지할 수 있습니다. 쌍의 절반만 수정하면 인덱스에 혼란스러운 변경이 발생할 수 있습니다.
주의: 파일의 내용을 변경하지 마십시오. 변경하기에 적합하지 않습니다. 삭제되거나 추가된 행의 연산자를 변경하기만 하면 됩니다.
IntelliJ IDEA (및 시리즈의 다른 모든 제품)에는 v2018.1 이후 부분 커밋에 대한 지원이 내장되어 있습니다.
Git 확장 을 사용하는 사람들을 위해:
커밋 창에서 부분적으로 커밋할 파일을 선택한 다음 오른쪽 창에서 커밋할 텍스트를 선택한 다음 선택 항목을 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 '선택한 줄 준비'를 선택합니다.
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 메서드를 사용하면 커밋하기 전에 코드가 여전히 작동하는지 테스트할 수 있습니다.
VS Code를 사용하고 있다면 운이 좋은 것입니다. 스테이징할 범위를 선택한 다음 Git: Stage Selected Ranges
를 사용하여 스테이징하고 원하는 경우 커밋합니다.
나는 내가 의미하는 바를 보여주기 위해 gif를 녹음했습니다.
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 )가 정확히 커밋하는 것이 훨씬 쉽다는 것을 알았습니다. 싶은 라인.
TortoiseGit 사용:
파일을 마우스 오른쪽 버튼으로 클릭하고
Context Menu → Restore after commit
사용하십시오. 이렇게 하면 파일의 복사본이 있는 그대로 생성됩니다. 그런 다음 TortoiseGitMerge에서와 같이 파일을 편집하고 커밋하고 싶지 않은 모든 변경 사항을 취소할 수 있습니다. 변경 사항을 저장한 후 파일을 커밋할 수 있습니다.
이 질문을 받은 지 10년이 되었습니다. 그리고 이 답변이 누군가에게 유용하기를 바랍니다. GUI가 옵션이 아닌 here 답변에서 언급했듯이 Andrew Shadura의 crecord 확장 은 커밋할 줄을 선택할 수 있는 ncurses 창을 가져오는 데 도움이 됩니다.
다음과 같이 확장 프로그램을 설정합니다.
git clone https://github.com/andrewshadura/git-crecord cd git-crecord ./setup.py install ln -s $PWD/git-crecord ~/.local/bin/git-crecord
cd를 git repo로 이동하고 다음과 같이 호출합니다.
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
샘플 사용을 보여주는 스크린캐스트
Atom 사용자의 경우 github git gui
스타일의 대화형 스테이징이 포함되어 있습니다. 바로 가기는 패키지 설명서를 참조하십시오.
Atom을 사용하면 배경이 어두운 테마로 작업할 수 있습니다(기본적으로 git gui
는 배경이 흰색임).
가에 있다면 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
emacs의 경우 gitsum도 있습니다.
위의 한 답변에서 볼 수 git add --patch filename.txt
사용할 수 있습니다.
또는 짧은 형식의 git add -p filename.txt
... 그러나 이미 저장소에 있는 파일의 경우 커밋 명령에 직접 --patch 플래그를 사용하는 것이 훨씬 더 좋습니다(최신 버전의 git을 사용하는 경우): git commit --patch filename.txt
... 또는 다시 짧은 형식의 git commit -p filename.txt
... 그런 다음 커밋에 포함할 줄을 선택하기 위해 언급된 키(y/n 등)를 사용합니다.
git-meld-index -- 웹사이트에서 인용:
git-meld-index는 meld 또는 다른 git difftool(kdiff3, diffuse 등)을 실행하여 git 인덱스(git 스테이징 영역이라고도 함)에 대한 변경 사항을 대화식으로 스테이징할 수 있습니다.
이것은 git add -p 및 git add --interactive의 기능과 유사합니다. 어떤 경우에는 meld가 git add -p보다 사용하기 쉽고 빠릅니다. 예를 들어, meld를 사용하면 다음을 수행할 수 있기 때문입니다.
용법
git 저장소에서 다음을 실행합니다.
git meld-index
다음과 함께 meld(또는 구성된 git difftool) 팝업이 표시됩니다.
LEFT : 작업 트리에서 복사한 파일을 포함하는 임시 디렉토리
RIGHT : 인덱스 내용이 있는 임시 디렉토리. 여기에는 아직 색인에 없지만 작업 복사본에서 수정되거나 추적되지 않은 파일도 포함됩니다. 이 경우 HEAD에서 파일 내용을 볼 수 있습니다.
만족할 때까지 색인(오른쪽)을 편집합니다. 필요할 때 저장하는 것을 잊지 마십시오.
완료되면 meld를 닫으면 git-meld-index가 방금 편집한 meld의 오른쪽에 있는 임시 디렉토리의 내용과 일치하도록 인덱스를 업데이트합니다.
git-cola 는 훌륭한 GUI이며 이 기능도 내장되어 있습니다. 스테이징할 라인을 선택하고 S를 누르기만 하면 됩니다. 선택하지 않으면 완전한 덩어리가 준비됩니다.
Eclipse IDE를 사용할 수 있습니다. 수정된 각 로컬 파일을 준비된 영역과 비교할 수 있으며 이 나란히 비교 보기에서 로컬에서 준비된 영역으로 복사할 덩어리를 자유롭게 선택하거나 반대로 로컬 변경 사항을 롤백할 수 있습니다. 무대 공간.
하지만 더 많은 것이 있습니다. 패치 수준에서 작동하지만 패치 내용을 깨뜨릴 위험이 없는 "git add -e"와 같이 업(또는 로컬에 존재하지 않는 항목을 작성/삭제/업데이트)할 수 있습니다. 또한 diff 보기에서 일반 텍스트 편집기를 사용하므로 도움이 되는 구문 색상이 있고 텍스트 바꾸기 작업(모든 들여쓰기 유형 변경, 여러 곳에서 로컬 변수 이름 바꾸기 등)을 수행하여 일부 커밋을 별도로 시작할 수 있습니다. "실제" 변경 사항을 커밋하기 전에 다시 포맷/리팩터링하되 동일한 커밋에 모든 파일 변경 사항을 포함하지 마십시오.
물론 Eclipse는 Java 지향적이지만 강력한 git 스테이징 편집기로 인해 다른 언어에도 사용할 수 있습니다. GitEye : https://www.collab.net/downloads/giteye 라는 git 작업에만 초점을 맞춘 Eclipse 기반 무료 제품이 있지만 https://www.eclipse.org 와 같은 기본 Eclipse 배포판을 사용하는 것이 더 잘 유지되지 않는 것 같습니다. /downloads/packages/release/2020-12/r/eclipse-ide-java-developers
편집: IntelliJ 2020.3에서는 실제 git 인덱스로 작업할 수 있으므로 이제 Eclipse와 같은 준비된 영역을 직접 편집할 수 있습니다.
출처 : http:www.stackoverflow.com/questions/1085162/commit-only-part-of-a-file-in-git
event.preventDefault() 대 false 반환 (0) | 2021.10.26 |
---|---|
JavaScript 객체를 반복하거나 열거하려면 어떻게 합니까? (0) | 2021.10.26 |
Bash에서 문자열 변수를 연결하는 방법 (0) | 2021.10.26 |
Java에서 String을 int로 어떻게 변환합니까? (0) | 2021.10.26 |
jQuery에 "존재하는" 기능이 있습니까? (0) | 2021.10.09 |