sourcetip

이미 갈라진 헝크를 깃으로 나눌 수 있습니까?

fileupload 2023. 6. 27. 22:29
반응형

이미 갈라진 헝크를 깃으로 나눌 수 있습니까?

나는 최근에 Git's를 발견했습니다.patch에 대한 add명령입니다. 정말 환상적인 기능입니다.저는 또한 키를 눌러 큰 덩어리를 작은 덩어리로 나눌 수 있다는 것을 발견했고, 이것은 커밋의 정확성을 더해줍니다.하지만 만약 제가 더 정확한 것을 원한다면, 만약 스플릿 허크가 충분히 작지 않다면요?

예를 들어, 다음과 같이 이미 분할된 헝크를 생각해 보십시오.

@@ -34,12 +34,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

어떻게 하면 다음 커밋에만 CSS 댓글 제거를 추가할 수 있습니까?s옵션을 더 이상 사용할 수 없습니다!

를 사용하는 git add -p그리고 로 분할한 후에도 충분히 작은 변경 사항이 없으므로 를 사용하여 패치를 직접 편집할 수 있습니다.

이것은 조금 헷갈릴 수 있지만, 편집기 창에서 누른 후에 열리는 지시사항을 주의 깊게 따르면 괜찮을 것입니다.당신이 인용한 경우, 당신은 그것을 대체하기를 원할 것입니다.-다음 행의 시작 부분에 공백이 있습니다.

-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {

그고다음행, 즉다로시행삭으로 합니다.+그런 다음 편집기를 저장하고 종료하면 CSS 주석 제거만 준비됩니다.

예를 들면 당신의example.css다음과 같이 표시됩니다.

.classname {
  width: 440px;
}

/*#field_teacher_id {
  display: block;
} */

form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
  width: 300px;
}

.another {
  width: 420px;
}

이제 중간 블록의 스타일 선택기를 변경하고, 사용하는 동안 더 이상 필요하지 않은 오래된 코멘트 아웃 스타일을 삭제합니다.

.classname {
  width: 440px;
}

#user-register form.table-form .field-type-checkbox label {
  width: 300px;
}

.another {
  width: 420px;
}

그건 쉬웠어요, 이제 약속하죠.그러나 잠시만요, 간단한 단계별 코드 검토를 위해 버전 제어 변경 사항을 논리적으로 분리하여 유지하고 팀원들과 함께 커밋 기록을 쉽게 검색하여 세부 사항을 확인하고 싶습니다.

이전 코드를 삭제하는 것은 다른 스타일 선택기 변경과 논리적으로 별개입니다.두 개의 서로 다른 커밋이 필요하므로 패치에 헝크를 추가합니다.

git add --patch
diff --git a/example.css b/example.css
index 426449d..50ecff9 100644
--- a/example.css
+++ b/example.css
@@ -2,12 +2,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

Stage this hunk [y,n,q,a,d,/,e,?]?

이런, 변화가 너무 가까운 것 같아서, Git이 그것들을 한데 묶었습니다.

프레스를 통해 분할을 시도해도 정밀도를 변경할 수 없을 정도로 분할이 세분화되지 않기 때문에 동일한 결과를 얻을 수 있습니다.Git가 패치를 자동으로 분할하려면 변경라인 간에 변경되지 않은 라인이 필요합니다.

를 눌러 수동으로 편집합니다.

Stage this hunk [y,n,q,a,d,/,e,?]? e

git는 우리가 선택한 편집기에서 패치를 열 것입니다.

# Manual hunk edit mode -- see bottom for a quick guide
@@ -2,12 +2,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

# ---
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
#
# If the patch applies cleanly, the edited hunk will immediately be
# marked for staging. If it does not apply cleanly, you will be given
# an opportunity to edit again. If all lines of the hunk are removed,
# then the edit is aborted and the hunk is left unchanged.

목표를 검토해 보겠습니다.

어떻게 하면 다음 커밋에만 CSS 댓글 제거를 추가할 수 있습니까?

이를 두 가지 커밋으로 나누고자 합니다.

  1. 첫 번째 커밋에는 일부 행을 삭제하는 작업(주석 제거)이 포함됩니다.

    주석이 달린 행을 제거하려면 그대로 두십시오. 해당 행은 이미 버전 제어에서 원하는 대로 삭제 내용을 추적하도록 표시되어 있습니다.

    -/*#field_teacher_id {
    - display: block;
    -} */

  2. 두 번째 커밋은 변경 사항으로, 삭제와 추가를 모두 기록하여 추적합니다.

    • 삭제(이전 선택기 선이 제거됨)

      이전 선택기 라인을 유지하려면(이 커밋하는 동안 삭제하지 않음) 다음을 수행해야 합니다.

      '-'줄을 제거하려면 '로 합니다.

      그 말은 문자 그대로 마이너스를 대체하는 것을 의미합니다.-공백 문자가 있는 기호입니다.

      그럼 이 세 줄은...

      -
      -form.table-form #field_teacher + label,
      -form.table-form #field_producer_distributor + label {

      ...는 다음과 같이 됩니다( 줄 중 첫 번째에 있는 단일 공간을 나타냄).


      form.table-form #field_teacher + label,
      form.table-form #field_producer_distributor + label {

    • 추가사항(새 선택기 라인 추가)

      이 커밋 중에 추가된 새 셀렉터 라인에 주의를 기울이지 않기 위해, 우리는...

      '+'줄을 제거하려면 해당 줄을 삭제합니다.

      ...말 그대로 전체 줄을 삭제하는 것을 의미합니다.

      +#user-register form.table-form .field-type-checkbox label {

      (Bonus: 혹시 vim을 편집기로 사용하고 있다면 를 눌러 행을 삭제합니다.나노 사용자가 +)K를 누릅니다.

저장할 때 편집기의 모양은 다음과 같습니다.

# Manual hunk edit mode -- see bottom for a quick guide
@@ -2,12 +2,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */

 form.table-form #field_teacher + label,
 form.table-form #field_producer_distributor + label {
   width: 300px;
 }

# ---
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
#
# If the patch applies cleanly, the edited hunk will immediately be
# marked for staging. If it does not apply cleanly, you will be given
# an opportunity to edit again. If all lines of the hunk are removed,
# then the edit is aborted and the hunk is left unchanged.

이제 약속을 하죠.

git commit -m "remove old code"

그리고 만약을 위해, 마지막 커밋에서 변경된 사항을 살펴보겠습니다.

git show
commit 572ecbc7beecca495c8965ce54fbccabdd085112
Author: Jeff Puckett <jeff@jeffpuckett.com>
Date:   Sat Jun 11 17:06:48 2016 -0500

    remove old code

diff --git a/example.css b/example.css
index 426449d..d04c832 100644
--- a/example.css
+++ b/example.css
@@ -2,9 +2,6 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */

 form.table-form #field_teacher + label,
 form.table-form #field_producer_distributor + label {

완벽 - 삭제 내용만 해당 원자적 커밋에 포함되었음을 알 수 있습니다.이제 일을 끝내고 나머지는 커밋합시다.

git add .
git commit -m "change selectors"
git show
commit 83ec3c16b73bca799e4ed525148cf303e0bd39f9
Author: Jeff Puckett <jeff@jeffpuckett.com>
Date:   Sat Jun 11 17:09:12 2016 -0500

    change selectors

diff --git a/example.css b/example.css
index d04c832..50ecff9 100644
--- a/example.css
+++ b/example.css
@@ -2,9 +2,7 @@
   width: 440px;
 }

-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

마지막으로 마지막 커밋에는 선택기 변경사항만 포함됩니다.

git gui를 사용할 수 있는 경우 변경 사항을 한 줄씩 준비할 수 있습니다.안타깝게도 명령줄에서 수행하는 방법이나 가능한 경우에도 수행할 수 없습니다.

이전에 사용한 다른 옵션 중 하나는 변경사항의 일부를 롤백(편집기를 열어두고)하고, 원하는 비트를 커밋하고, 실행 취소하고 편집기에서 다시 저장하는 것입니다.우아하지는 않지만, 일을 끝냅니다.:)


EDIT(git-gui 사용):

저는 git-gui가 msysgit과 linux 버전이 같은지 잘 모르겠습니다, 저는 msysgit 하나만 사용했습니다.그러나 동일하다고 가정할 때 이를 실행하면 네 개의 창이 있습니다. 상단 왼쪽 창은 작업 디렉토리 변경, 하단 왼쪽 창은 단계 변경, 상단 오른쪽 창은 선택한 파일의 디프(작업 중인 파일이든 스테이징된 파일이든), 하단 오른쪽 창은 커밋에 대한 설명입니다(필요하지 않을 것 같습니다).오른쪽 상단에 있는 파일을 클릭하면 차이가 나타납니다.다른 줄을 마우스 오른쪽 단추로 클릭하면 상황에 맞는 메뉴가 나타납니다.주의해야 할 두 가지 옵션은 "커밋을 위한 hunk 스테이지"와 "커밋을 위한 stage line"입니다.커밋할 줄에서 "커밋 단계 줄"을 계속 선택하면 완료됩니다.원하는 경우 여러 줄을 선택하여 스테이징할 수도 있습니다.언제든지 준비 상자에서 파일을 눌러 커밋하려는 항목을 확인할 수 있습니다.

커밋의 경우 gui 도구 또는 명령줄을 사용할 수 있습니다.

것입니다.git add필요한 것은 무엇이든지 간에, 그리고 나서 도망가세요.git add다시 한 번. 만약 이것이 유일한 덩어리라면, 당신은 그것을 나눌 수 있을 것입니다.

커밋 순서가 걱정되는 경우 그냥 사용git rebase -i.

언급URL : https://stackoverflow.com/questions/6276752/can-i-split-an-already-split-hunk-with-git

반응형