web-dev-qa-db-ja.com

すでに分割されているハンクをgitで分割できますか?

Gitのpatchコマンドに対するaddオプションを最近発見しましたが、これは本当に素晴らしい機能であると言わざるを得ません。また、大きなハンクを押すことで小さなハンクに分割できることも発見しました s コミットの精度を高めるキー。しかし、分割されたハンクが十分に小さくない場合、さらに高い精度が必要な場合はどうなりますか?

たとえば、既に分割されているこのハンクを考えてみましょう。

@@ -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オプションは使用できなくなりました!

177
greg0ire

git add -pを使用していて、さらに分割した後でも s、あなたは十分に小さな変更を持っていません、あなたは使用することができます e パッチを直接編集します。

これは少しわかりにくいかもしれませんが、carefullyを押した後に開かれるエディターウィンドウの指示に従ってください e それで大丈夫です。引用した場合、これらの行の先頭で-をスペースに置き換えます。

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

...そして次の行、つまり+で始まる行を削除します。その後、エディターを保存して終了すると、CSSコメントの削除のみがステージングされます。

225
Mark Longair

あなたの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;
}

それは簡単でした。今度はコミットしましょう。 しかし、待って、単純な段階的なコードレビューのためにバージョン管理の変更の論理的な分離を維持したいので、私のチームと私はコミット履歴で詳細を簡単に検索できます。

古いコードの削除は、他のスタイルセレクターの変更とは論理的に分離されています。 2つの別個のコミットが必要になるので、パッチにハンクを追加しましょう。

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はそれらを一緒に探しました。

押してsplitしようとしても s 分割は精度の変更に十分な粒度ではないため、同じ結果になります。 変更された行の間に変更されていない行が必要です、gitがパッチを自動的に分割できるようにします。

だから、手動で編集してみましょう e

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コメント削除を追加するにはどうすればよいですか?

これを2つのコミットに分割します。

  1. 最初のコミットには、いくつかの行の削除が含まれます(コメントの削除)。

    コメントされた行を削除するには、そのままにしておきます。それらは既にマークされており、バージョン管理で削除を追跡できるようになっています。

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

  2. 2番目のコミットは変更であり、削除と追加の両方を記録することによって追跡されます。

    • 削除(古いセレクター行を削除)

      古いセレクター行を保持する(このコミット中にそれらを削除しないでください)ために...

      「-」行を削除するには、「」にします

      ...これは文字通りマイナス-記号とスペース文字

      これら3行は...

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

      ...(notice3行すべての最初の単一スペース):


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

    • 追加(新しいセレクター行が追加されました)

      このコミット中に追加された新しいセレクター行に注意を払わないために、...

      「+」行を削除するには、削除します。

      ...これは文字通り行全体を削除することを意味します:

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

      (ボーナス:エディターとして vim を使用している場合、 dd 行を削除します。 ナノ ユーザーが押す Ctrl+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 <[email protected]>
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 <[email protected]>
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;
 }

最後に、最後のコミットにセレクターの変更のみが含まれていることがわかります。

51
Jeff Puckett

Git guiを使用できる場合、行ごとに変更をステージングできます。残念ながら、私はコマンドラインからそれを行う方法を知りません-またはそれが可能であっても。

私が過去に使用したもう1つのオプションは、変更の一部をロールバックし(エディターを開いたままにする)、必要な部分をコミットし、エディターから取り消して再保存することです。あまりエレガントではありませんが、仕事を成し遂げます。 :)


編集(git-guiの使用):

Git-guiがmsysgitとlinuxのバージョンで同じかどうかはわかりませんが、msysgitだけを使用しました。ただし、同じ場合、実行すると4つのペインがあります。左上のペインは作業ディレクトリの変更、左下はステージの変更、右上は選択したファイルの差分(作業ディレクトリ)またはステージング)、右下はコミットの説明用です(必要ないと思われます)。右上のファイルをクリックすると、差分が表示されます。 diff行を右クリックすると、コンテキストメニューが表示されます。注意すべき2つのオプションは、「コミットのステージハンク」と「コミットのステージライン」です。コミットする行で「コミットのステージ行」を選択し続けると、完了です。必要に応じて、複数の行を選択してステージングすることもできます。ステージングボックスでいつでもファイルをクリックして、コミットする内容を確認できます。

コミットに関しては、GUIツールまたはコマンドラインのいずれかを使用できます。

9
vhallac

それを行う1つの方法は、チャンクをスキップすることです、git add必要なものは何でも、それからgit addもう一度。これが唯一のチャンクである場合は、分割できます。

コミットの順序が心配な場合は、git rebase -i

1
Abizern