etc./StackOverFlow

Git에서 파일의 일부만 커밋

청렴결백한 만능 재주꾼 2021. 10. 26. 04:48
반응형

질문자 :freddiefujiwara


Git에서 파일을 변경할 때 변경 사항 중 일부만 커밋하려면 어떻게 해야 합니까?

예를 들어 파일에서 변경된 30줄 중 15줄만 커밋하려면 어떻게 해야 합니까?



git add --patch <filename> (또는 -p )을 사용할 수 있으며 git은 파일을 합리적인 "덩어리"(파일의 일부)로 분류하기 시작합니다. 그러면 다음과 같은 질문이 표시됩니다.

 Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

다음은 각 옵션에 대한 설명입니다.

  • y 다음 커밋을 위해 이 덩어리를 준비합니다.
  • n 다음 커밋을 위해 이 덩어리를 준비하지 마십시오.
  • q 종료; 이 덩어리 또는 나머지 덩어리를 준비하지 마십시오.
  • 상기 파일에이 덩어리와 이후의 모든 심술쟁이 무대
  • d 파일에서 이 덩어리 또는 이후 덩어리를 스테이징하지 마십시오.
  • g 갈 큰 덩어리를 선택하십시오
  • / 주어진 정규식과 일치하는 덩어리 검색
  • j 이 덩어리를 미정으로 두고 다음 미정 덩어리를 봅니다.
  • J 이 덩어리를 미정으로 두고 다음 덩어리를 참조하십시오.
  • k 이 덩어리를 미정으로 두고, 이전 미정 덩어리를 참조하십시오.
  • K 이 덩어리를 미정으로 둡니다. 이전 덩어리를 참조하십시오.
  • 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 도구 - 대화형 스테이징


Community Wiki

당신은 사용할 수 있습니다 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에도 이 기능이 있을 수 있습니다.


Jakub Narębski

git gui 는 diff 보기에서 이 기능을 제공합니다. 관심 있는 라인을 마우스 오른쪽 버튼으로 클릭하면 "이 라인을 커밋할 준비" 메뉴 항목이 표시되어야 합니다.


Ionuț G. Stan

git add -e myfile 이 가장 쉬운 방법(최소한 내 취향)이라고 생각합니다. 왜냐하면 단순히 텍스트 편집기를 열고 어떤 줄을 준비하고 어떤 줄을 만들지 않을지 선택할 수 있기 때문입니다. 편집 명령에 관하여:

추가된 콘텐츠:

추가된 콘텐츠는 "+"로 시작하는 줄로 표시됩니다. 추가 라인을 삭제하여 스테이징을 방지할 수 있습니다.

제거된 콘텐츠:

제거된 콘텐츠는 "-"로 시작하는 줄로 표시됩니다. "-"를 " "(공백)으로 변환하여 제거 단계를 방지할 수 있습니다.

수정된 내용:

수정된 내용은 "-" 줄(이전 내용 제거) 다음에 "+" 줄(대체 내용 추가)로 표시됩니다. "-" 줄을 " "로 변환하고 "+" 줄을 제거하여 스테이징 수정을 방지할 수 있습니다. 쌍의 절반만 수정하면 인덱스에 혼란스러운 변경이 발생할 수 있습니다.

git add 에 대한 모든 세부 정보는 git --help add 에서 확인할 수 있습니다.


theFreedomBanana

vim을 사용하는 경우 fugitive 라는 훌륭한 플러그인을 사용해 볼 수 있습니다.

:Gdiff 하여 작업 복사본과 인덱스 간의 파일 차이를 dp 와 같은 고전적인 vim diff 명령을 사용하여 인덱스에 행이나 덩어리를 추가할 수 있습니다. 수정 사항을 인덱스에 저장하고 :Gcommit 커밋하면 완료됩니다.

여기에 아주 좋은 소개 스크린캐스트가 있습니다(특히 2부 참조).


François

Atlassian의 SourceTree 를 사용하는 것이 좋습니다. (무료입니다.) 이것은 사소한 일입니다. 개별 코드 덩어리 또는 개별 코드 줄을 빠르고 쉽게 준비할 수 있습니다.

여기에 이미지 설명 입력


user486646

새 파일에 git add --patch 를 사용 git add --intent-to-add 하여 색인에 파일을 추가해야 합니다.

 git add -N file git add -p file

user1338062

많은 변경 사항이 있고 변경 사항에서 몇 가지 커밋을 생성하게 될 때 작업을 준비하기 전에 시작점을 임시로 저장하고 싶습니다.

이와 같이:

 $ 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의 대답은 내가 평소에 하는 일입니다. 가끔 많은 변경 사항이 있고 작업을 준비하는 동안 실수를 할 수 있다는 것을 알 수 있으며 두 번째 패스를 위해 다시 의지할 수 있는 커밋된 상태를 원합니다.


jdsumsion

emacs를 사용하는 경우 emacs용 git 인터페이스를 제공하는 Magit을 살펴보십시오. 그것은 스테이징 덩어리 (파일의 일부)를 아주 잘 지원합니다.


Mark van Lent

이전 답변에 추가하여 명령줄 사용을 선호하는 경우 git add -e myfile 입력하면 커밋하려는 항목을 한 줄씩 선택할 수 있습니다. 이 명령은 다음과 같이 차이점이 있는 편집기를 열 것이기 때문입니다.

여기에 이미지 설명 입력

+ 로 시작하는 줄은 덧셈이고 - 로 시작하는 줄은 삭제입니다. 그래서:

  • 추가를 준비하지 않으려면 해당 행을 삭제하십시오.
  • 삭제를 준비하지 않으려면 바로 교체 - 공간 .

이것은 git add -h 가 이런 방식으로 파일을 추가하는 것에 대해 말하는 것입니다(파일 패치).

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

제거된 내용: 제거된 내용은 "-"로 시작하는 행으로 표시됩니다. "-"를 " "(공백)으로 변환하여 제거 단계를 방지할 수 있습니다.

수정된 콘텐츠: 수정된 콘텐츠는 "-" 줄(이전 콘텐츠 제거) 다음에 "+" 줄(대체 콘텐츠 추가)로 표시됩니다. "-" 줄을 " "로 변환하고 "+" 줄을 제거하여 스테이징 수정을 방지할 수 있습니다. 쌍의 절반만 수정하면 인덱스에 혼란스러운 변경이 발생할 수 있습니다.

주의: 파일의 내용을 변경하지 마십시오. 변경하기에 적합하지 않습니다. 삭제되거나 추가된 행의 연산자를 변경하기만 하면 됩니다.


Community Wiki

IntelliJ IDEA (및 시리즈의 다른 모든 제품)에는 v2018.1 이후 부분 커밋에 대한 지원이 내장되어 있습니다.

여기에 이미지 설명 입력


Holger Brandl

Git 확장 을 사용하는 사람들을 위해:

커밋 창에서 부분적으로 커밋할 파일을 선택한 다음 오른쪽 창에서 커밋할 텍스트를 선택한 다음 선택 항목을 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 '선택한 줄 준비'를 선택합니다.


srgstm

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 메서드를 사용하면 커밋하기 전에 코드가 여전히 작동하는지 테스트할 수 있습니다.


derhoch

VS Code를 사용하고 있다면 운이 좋은 것입니다. 스테이징할 범위를 선택한 다음 Git: Stage Selected Ranges 를 사용하여 스테이징하고 원하는 경우 커밋합니다.

나는 내가 의미하는 바를 보여주기 위해 gif를 녹음했습니다.

여기에 이미지 설명 입력


Wenfang Du

vim-gitgutter 플러그인은 다음을 사용하여 vim 편집기를 떠나지 않고 덩어리를 준비할 수 있습니다.

 :GitGutterStageHunk

이 외에도 일부 최신 IDE에서와 같이 diff 기호 열과 같은 다른 멋진 기능을 제공합니다.

덩어리의 일부만 vim-fugitive를 무대에 올려야 하는 경우

 :Gdiff

가시 범위 선택을 허용한 다음 :'<,'>diffput 또는 :'<,'>diffget 을 사용하여 개별 라인 변경을 스테이지/되돌릴 수 있습니다.


c0ffeeartc

git add -p filename.x 시도했지만 Mac에서는 gitx ( http://gitx.frim.nl/ 또는 https://github.com/pieter/gitx )가 정확히 커밋하는 것이 훨씬 쉽다는 것을 알았습니다. 싶은 라인.


jasongregori

TortoiseGit 사용:

파일을 마우스 오른쪽 버튼으로 클릭하고 Context Menu → Restore after commit 사용하십시오. 이렇게 하면 파일의 복사본이 있는 그대로 생성됩니다. 그런 다음 TortoiseGitMerge에서와 같이 파일을 편집하고 커밋하고 싶지 않은 모든 변경 사항을 취소할 수 있습니다. 변경 사항을 저장한 후 파일을 커밋할 수 있습니다.


Fr0sT

이 질문을 받은 지 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

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


Arun

Atom 사용자의 경우 github git gui 스타일의 대화형 스테이징이 포함되어 있습니다. 바로 가기는 패키지 설명서를 참조하십시오.

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


Ioannis Filippidis

가에 있다면 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

Anvesh Yalamarthy

emacs의 경우 gitsum도 있습니다.


zut

위의 한 답변에서 볼 수 git add --patch filename.txt 사용할 수 있습니다.

또는 짧은 형식의 git add -p filename.txt

... 그러나 이미 저장소에 있는 파일의 경우 커밋 명령에 직접 --patch 플래그를 사용하는 것이 훨씬 더 좋습니다(최신 버전의 git을 사용하는 경우): git commit --patch filename.txt

... 또는 다시 짧은 형식의 git commit -p filename.txt

... 그런 다음 커밋에 포함할 줄을 선택하기 위해 언급된 키(y/n 등)를 사용합니다.


Samuel Lampa

git-meld-index -- 웹사이트에서 인용:

git-meld-index는 meld 또는 다른 git difftool(kdiff3, diffuse 등)을 실행하여 git 인덱스(git 스테이징 영역이라고도 함)에 대한 변경 사항을 대화식으로 스테이징할 수 있습니다.

이것은 git add -p 및 git add --interactive의 기능과 유사합니다. 어떤 경우에는 meld가 git add -p보다 사용하기 쉽고 빠릅니다. 예를 들어, meld를 사용하면 다음을 수행할 수 있기 때문입니다.

  • 더 많은 컨텍스트 보기
  • 라인 내 diff 참조
  • 손으로 편집하고 '라이브' diff 업데이트 보기(키를 누를 때마다 업데이트됨)
  • 건너뛰려는 모든 변경 사항에 대해 'n'이라고 말하지 않고 변경 사항으로 이동

용법

git 저장소에서 다음을 실행합니다.

 git meld-index

다음과 함께 meld(또는 구성된 git difftool) 팝업이 표시됩니다.

LEFT : 작업 트리에서 복사한 파일을 포함하는 임시 디렉토리

RIGHT : 인덱스 내용이 있는 임시 디렉토리. 여기에는 아직 색인에 없지만 작업 복사본에서 수정되거나 추적되지 않은 파일도 포함됩니다. 이 경우 HEAD에서 파일 내용을 볼 수 있습니다.

만족할 때까지 색인(오른쪽)을 편집합니다. 필요할 때 저장하는 것을 잊지 마십시오.

완료되면 meld를 닫으면 git-meld-index가 방금 편집한 meld의 오른쪽에 있는 임시 디렉토리의 내용과 일치하도록 인덱스를 업데이트합니다.


Croad Langshan

git-cola 는 훌륭한 GUI이며 이 기능도 내장되어 있습니다. 스테이징할 라인을 선택하고 S를 누르기만 하면 됩니다. 선택하지 않으면 완전한 덩어리가 준비됩니다.


AndiDog

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와 같은 준비된 영역을 직접 편집할 수 있습니다.


Sylvain K.

출처 : http:www.stackoverflow.com/questions/1085162/commit-only-part-of-a-file-in-git

반응형