source

Git에서 파일 변경 내용의 일부만 커밋

ittop 2023. 5. 17. 23:26
반응형

Git에서 파일 변경 내용의 일부만 커밋

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

예를 들어, 파일에서 변경된 30줄 중 15줄만 커밋할 수 있는 방법은 무엇입니까?

사용할 수 있는 항목:

git add --patch <filename>

또는 간단히 말하면:

git add -p <filename>

Git는 당신의 파일을 합리적인 "hunks"(파일의 일부)라고 생각되는 것으로 분해할 것입니다.그러면 다음과 같은 질문이 표시됩니다.

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

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

  • y 다음 커밋을 위해 이 촌뜨기를 무대에 올립니다.
  • n 다음 커밋을 위해 이 펑크를 준비하지 않음
  • q 종료; 이 헝크 또는 나머지 헝크를 준비하지 않음
  • a 파일에서 이 헝크와 이후의 모든 헝크를 준비합니다.
  • d 파일에서 이 헝크 또는 이후의 헝크를 스테이징하지 않음
  • g 갈 촌뜨기를 고르다
  • / 지정된 정규식과 일치하는 헝크 검색
  • j 이 촌놈은 미정으로 두고, 다음 미정의 촌놈을 보십시오.
  • J 이 촌놈은 미정으로 두고, 다음 촌놈을 봐요.
  • k 이 촌뜨기는 미정으로 두고, 이전의 미정 촌뜨기를 보십시오.
  • K 이 촌뜨기는 미정으로 두고, 이전 촌뜨기를 보세요.
  • s 현재의 허크를 더 작은 허크로 분할
  • e 현재 헝크 수동 편집
    • 그런 다음 Hunk를 교체하여 수동으로 편집할 수 있습니다.+/-타고#(vecksen 감사합니다)
  • ? 인쇄 hunk 도움말

저장소에 파일을 저장할 수 .git add -N <filename>나중에 계속할 수 있습니다.git add -p <filename>.

나중에 다음을 사용할 수 있습니다.

  • git diff --staged합니다.
  • git reset -p를 실수로 했습니다.
  • git commit -v커밋 메시지를 편집하는 동안 커밋을 봅니다.

참고로 이것은 그것과 크게 다릅니다.git format-patch를 데커밋 구분것이목명적령인다니입으로 분석하는 .patchfiles 파일

미래에 대한 참조:Git 도구 - 대화형 스테이징

사용할 수 있습니다.git add --interactive또는git add -p <file>,그리고 나서.git commit(아닙니다. git commit -a대화형 모드 git-add man 페이지를 참조하거나 지침을 따릅니다.

모던 깃 또한 가지고 있습니다.git commit --interactive)git commit --patch이는 대화형 커밋에서 패치 옵션으로 바로 가기 위한 것입니다.

GUI에서 실행하는 것이 좋다면 git-gui를 사용할 수 있습니다.커밋에 포함할 청크를 마우스 오른쪽 버튼으로 클릭하고 다음을 선택하여 간단히 표시할 수 있습니다.

커밋을 위한 Hunk 단계

헝크의 특정 선만 추가하려면 원하는 선을 선택하고 마우스 오른쪽 단추로 클릭한 후 다음을 수행할 수도 있습니다.

커밋을 위한 준비 라인

여기에 이미지 설명 입력

저는 개인적으로 사용하는 것보다 더 쉽다고 생각합니다.git add -iQGit 또는 GitX와 같은 다른 Git GUI에도 이 기능이 있을 수 있습니다.

git gui는 diff 뷰에서 이 기능을 제공합니다.관심 있는 라인을 마우스 오른쪽 단추로 클릭하면 "이 라인을 커밋할 단계" 메뉴 항목이 표시됩니다.

나는 그렇게 믿어요.git add -e myfile텍스트 편집기를 열고 준비할 줄과 준비하지 않을 줄을 선택할 수 있기 때문에 가장 쉬운 방법입니다(적어도 제가 선호하는 방법).명령 편집 정보:

추가된 내용:

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

제거된 내용:

제거된 내용은 "-"로 시작하는 줄로 표시됩니다."-"를 ""(공백)으로 변환하여 제거 스테이징을 방지할 수 있습니다.

수정된 내용:

수정된 내용은 "-" 줄(이전 내용 제거) 다음에 "+" 줄(교체 내용 추가)로 표시됩니다."-" 라인을 ""로 변환하고 "+" 라인을 제거하여 수정 준비를 방지할 수 있습니다.쌍의 절반만 수정하면 인덱스가 혼란스럽게 변경될 수 있습니다.

에 대한 정보git add에서 용가에서 할 수 .git --help add

VS Code를 사용하고 있다면 운이 좋은 것입니다.를 선택한 " " " 를 사용합니다.Git: Stage Selected Ranges그들을 무대에 올리고, 당신이 원한다면 커밋합니다.

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

여기에 이미지 설명 입력

만약 당신이 vim을 사용하고 있다면, 당신은 도망자라고 불리는 훌륭한 플러그인을 사용해 보는 것이 좋을 것입니다.

의 파일 를 업작 복사 차를볼로 할 수 .:Gdiff 그런 다음 다다음과같은고명전령인적 vimdiff 을용사하와 같은 고전적인 합니다.dp 사항을 하고 인스에저및커로 .:Gcommit그리고 당신은 끝났습니다.

소개 스크린캐스트가 아주 좋습니다(특히 파트 2 참조).

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

여기에 이미지 설명 입력

▁to▁worth를 사용하는 것에 주목할 가 있습니다.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

왜 마어의 대답은 제가 평소에 하는 것인가요? 가끔 많은 변화가 있고 제가 무언가를 준비하는 동안 실수를 할 수도 있다는 것을 제외하고는, 저는 두 번째 패스를 위해 의지할 수 있는 헌신적인 상태를 원합니다.

대답을 이 명령줄을 , " " " " (으"ㄹ 수 있습니다)를 입력하세요.git add -e myfile다음과 을 한 할 수 .

여기에 이미지 설명 입력

다으로줄아을것실다입으로 .+ 역로추시로 -삭제입니다.그래서:

  • 추가를 준비하지 않으려면 해당 줄을 삭제합니다.
  • 삭제를 준비하지 않으려면 바꾸기만 하면 됩니다.-.

이것이 무엇입니까?git add -h에서는 이러한 방식으로 파일을 추가하는 방법에 대해 설명합니다(파일 삭제).

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

제거된 내용: 제거된 내용은 "-"로 시작하는 줄로 표시됩니다."-"를 ""(공백)으로 변환하여 제거 스테이징을 방지할 수 있습니다.

수정된 내용:수정된 내용은 "-" 줄(이전 내용 제거) 다음에 "+" 줄(교체 내용 추가)로 표시됩니다."-" 라인을 ""로 변환하고 "+" 라인을 제거하여 수정 준비를 방지할 수 있습니다.쌍의 절반만 수정하면 인덱스가 혼란스럽게 변경될 수 있습니다.

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

만약 당신이 emacs를 사용한다면, emacs를 위한 git 인터페이스를 제공하는 Magit을 보세요.Hunk(파일의 일부) 스테이징을 매우 잘 지원합니다.

IntelliJ IDEA(및 시리즈의 다른 모든 제품)는 v2018.1부터 부분 커밋을 기본으로 지원합니다.

여기에 이미지 설명 입력

Git Extensions를 사용하는 사용자:

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

이 질문을 받은 지 10년이 지났습니다.그리고 이 답변이 누군가에게 유용하기를 바랍니다.GUI가 옵션이 아닌 여기에 있는 답변에서 언급했듯이 Andrej Shadura의 git-crecord 도구는 커밋할 줄을 선택할 수 있는 대화형 창을 제공합니다.

다음과 같이 확장을 설정합니다.

git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord

gitrepo에 cd를 넣고 다음과 같이 호출합니다.

git crecord

이렇게 하면 아래와 같이 사용할 수 있는 대화형 인터페이스가 나타납니다.다음 키를 누르면 특정 작업이 수행됩니다.

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

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

한 다음 diff 도구를 jdsumation에서 사항을 .그런 식으로 당신은 허크를 수동으로 매우 쉽게 편집할 수 있는데, 이것은 안에 있을 때 약간의 고통입니다.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 편집기를 떠나지 않고 다음을 사용하여 hunk를 스테이징할 수 있습니다.

:GitGutterStageHunk

이 외에도 일부 현대 IDE에서와 같이 디프사인 열과 같은 다른 멋진 기능을 제공합니다.

허크의 일부만 vim-fugitive로 준비해야 하는 경우

:Gdiff

할 수 .:'<,'>diffput또는:'<,'>diffget개별 라인 변경을 준비/실행합니다.

해봤습니다.git add -p filename.x하지만 맥에서, 저는 gitx(http://gitx.frim.nl/ 또는 https://github.com/pieter/gitx) )가 제가 원하는 대사를 정확하게 수행하는 것이 훨씬 더 쉽다는 것을 알게 되었습니다.

Torothy Git 사용:

파일을 마우스 오른쪽 버튼으로 클릭하고 사용합니다.Context Menu → Restore after commit이렇게 하면 파일의 복사본이 그대로 만들어집니다.그런 다음 TorothyGitMerge와 같은 파일을 편집하고 커밋하지 않을 모든 변경을 취소할 수 있습니다.이러한 변경 사항을 저장한 후 파일을 커밋할 수 있습니다.

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

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

켜져 있는 경우Windows내 생각에 플랫폼git gui하기에 매우 좋은 도구입니다.stage/commit에서 몇줄 몇 줄unstaged

Hunkwise:

  • 에서 합니다.unstagged Changes
  • 준비해야 하는 코드 청크를 마우스 오른쪽 버튼으로 클릭합니다.
  • 를 선택합니다.Stage Hunk for commit

줄 바꿈:

  • 에서 합니다.unstagged Changes
  • 스테이징할 라인/라인을 선택
  • 마우스 오른쪽 버튼을 클릭하고 선택합니다.Stage Lines for commit

두 줄을 제외한 전체 파일을 준비하려면:

  • 에서 합니다.unstagged Changes
  • 를 누릅니다.Ctrl+T (Stage file to commit)
  • 이제 선택한 파일이 다음으로 이동합니다.Staged Changes »
  • 준비할 라인/라인을 선택
  • 마우스 오른쪽 버튼을 클릭하고 선택합니다.UnStage Lines for commit

Emacs에는 gitsum도 있습니다.

위의 한 대답에서 알 수 있듯이, 당신은 다음을 사용할 수 있습니다. git add --patch filename.txt

형태의 는짧은형식또형식▁the▁or. git add -p filename.txt

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

의 는또, 다말면, 짧형식하입니다. git commit -p filename.txt

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

나는 도구 목록에 게으른 깃을 추가하고 싶습니다.좋은 명령줄 GUI입니다(즉, X 포워딩이 허용되지 않더라도 SSH를 통해 작동합니다).광범위한 기능(예: 커밋할 라인 선택, 대화형 리베이스), 유용한 색상 및 사용이 비교적 간단합니다.다양한 방법으로 설치할 수 있습니다(go, conda, package manager 등). 여전히 활발히 개발/유지되고 있습니다.

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

git-meld-index는 git 인덱스(git staging 영역이라고도 함)에 대한 변경사항을 대화형으로 준비할 수 있도록 meld 또는 다른 git diff 도구(kdiff3, diff 등)를 실행합니다.

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

  • 추가 컨텍스트 보기
  • 선내 차이 보기
  • 수동으로 편집하여 '라이브' 디프 업데이트 확인(키를 누를 때마다 업데이트됨)
  • 건너뛰려는 모든 변경 사항에 대해 'n'을 말하지 않고 변경 사항으로 이동

사용.

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

git meld-index

meld(또는 구성된 git diff 도구) 팝업에 다음과 같은 메시지가 나타납니다.

왼쪽: 작업 트리에서 복사한 파일을 계속하는 임시 디렉터리

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

만족할 때까지 인덱스(오른쪽)를 편집합니다.필요할 때 저장하는 것을 기억하세요.

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

Git-cola는 훌륭한 GUI이며 이 기능도 내장되어 있습니다.스테이징할 라인을 선택하고 누르면 됩니다. 선택하지 않으면 전체 허크가 스테이징됩니다.

Eclipse IDE를 사용할 수 있으며, 수정된 각 로컬 파일을 준비된 영역과 비교할 수 있으며, 이 나란히 보기에서는 로컬에서 준비된 영역으로 복사할 헝크를 자유롭게 선택하거나, 반대로 준비된 영역에서 로컬 변경 내용을 롤백할 수 있습니다.

하지만 더 있습니다:), 모든 그래픽 깃 클라이언트는 그 헝크 스테이징도 하지만(git add -p), 제가 아는 어떤 것도 그렇게 할 수 없습니다: 스테이징된 영역에서 직접 편집하여 동일한 라인 또는 동일한 헝크의 여러 변경 사항을 더 미세하게 수집할 수 있습니다(또는 로컬에 존재하지 않는 쓰기/삭제/업데이트 항목도 있음).패치 수준에서 작업하지만 패치 내용을 손상시킬 위험이 없는 "git add-e"와 같은 것입니다.또한 Diff 뷰에서 일반 텍스트 편집기를 사용하므로 도움이 되는 구문 색상이 있으며 텍스트 바꾸기 작업(모든 들여쓰기 유형 변경, 여러 장소에서 사용하는 로컬 변수 이름 변경 등)을 수행할 수 있습니다.모든 파일 변경 사항을 동일한 커밋에 포함하지 않고 "실제" 변경 사항을 커밋하기 전에 일부 재포맷/리팩터를 별도로 커밋하기 시작합니다.

물론 이클립스는 자바 지향이지만 강력한 깃 스테이징 에디터 때문에 다른 언어에도 사용할 수 있습니다.GitEye: https://www.collab.net/downloads/giteye 이라고 하는 이클립스 기반의 무료 제품이 있지만 https://www.eclipse.org/downloads/packages/release/2020-12/r/eclipse-ide-java-developers 과 같은 기본 이클립스 배포판을 사용하기에는 더 잘 유지되지 않는 것 같습니다.

편집 : IntelliJ 2020.3은 실제 깃 인덱스로 작업할 수 있기 때문에 Eclipse와 같이 준비된 영역을 직접 편집할 수 있습니다.

이 2018년 답변의 댓글 중에서:

Visual Studio에 이 옵션이 없는 것은 유감입니다.
약 10년 전에 대체 소스 제어 시스템인 Mercurial은 Visual Studio 내부에서 이 기능을 지원했습니다.나는 Git을 사용하기 때문에 그것이 정말 그립습니다.

현재(2022년 8월) 지원됩니다.

깃 라인 스테이징 출시!

Visual Studio 2022의 라인 스테이징 지원 출시를 발표하게 되어 기쁩니다.

라인 스테이징, 즉 대화형 스테이징을 사용하면 변경된 코드 라인을 서로 다른 커밋으로 분할할 수 있습니다.
라인 스테이징은 변경 사항을 커밋하기 전에 검토하는 데에도 사용될 수 있습니다.변경된 행 또는 코드 섹션을 스테이징하여 검토된 것으로 표시하고 완료되면 스테이징된 변경사항을 커밋합니다.

Visual Studio 2022를 버전 17.3 이상으로 업데이트하여 라인 스테이징 사용을 시작합니다.

VS 17.03 대화형 스테이징 -- https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2022/08/Line-stagingM.mp4

이 기능의 사용 및 사용자 지정 방법에 대한 자세한 내용은 라인 스테이징 설명서를 참조하십시오.

먼저, 우리는 변화가 무엇인지 볼 수 있습니다.

git diff <file>

서로 다른 청크로 표시되면, 우리는 사용할 수 있습니다.

git add -p <file>

변경 사항(y 또는 n)을 승인 또는 거부함으로써.

여기에 이미지 설명 입력

그렇지 않은 경우에도 VS Code의 도움을 받아 수행할 수 있습니다.

여기에 이미지 설명 입력

이 모든 도구들 중에서, 저는 포크를 가장 사랑합니다(비록 무료는 아니지만)!

다른 제품과 비교하여 매우 매끄럽고 우아하게 사용할 수 있습니다. 마우스 옆에 있는 버튼을 클릭하면 헝크 또는 라인 스테이징이 수행됩니다.

또 다른 옵션은 재미있지만 더 복잡하고 강력한 깃크라켄입니다!

언급URL : https://stackoverflow.com/questions/1085162/commit-only-part-of-a-files-changes-in-git

반응형