我能把已经分裂的大块头和少不要脸的人分开吗?

我最近发现git的patch选项add命令,我必须说这真的是一个很棒的功能。 我还发现,通过按年代键,一个大块可以被分割成更小的块,这增加了提交的精度。 但是如果我想要更精确,如果分割的大块不够小呢?< / p >

例如,考虑这个已经分裂的大块:

@@ -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选项不再可用!

48351 次浏览

一种方法是跳过块,git add无论你需要什么,然后再次运行git add。如果这是唯一的一块,你就可以把它分开。

如果你担心提交的顺序,只需使用git rebase -i

如果您可以使用git gui,它允许您逐行进行更改。不幸的是,我不知道如何从命令行完成它——甚至不知道它是否可能。

我过去使用的另一个选项是回滚部分更改(保持编辑器打开),提交我想要的位,从编辑器中撤消并重新保存。不是很优雅,但能完成任务。:)


编辑(git-gui用法):

我不确定git-gui在msysgit和linux版本中是否相同,我只使用了msysgit的一个。但假设它是相同的,当您运行它时,有四个窗格:左上窗格是您的工作目录更改,左下窗格是您的阶段更改,右上窗格是所选文件的差异(无论是工作目录还是阶段),右下窗格是提交的描述(我怀疑您不需要它)。当你点击右上角的文件时,你会看到一个差异,如果你右键单击一个差异行,你会看到一个上下文菜单。需要注意的两个选项是“提交的stage hunk”和“提交的stage line”。在想要提交的行上继续选择“stage line for commit”,就完成了。如果你愿意,你甚至可以选择几句台词并将它们上演。您总是可以单击登台框中的文件来查看将要提交的内容。

至于提交,您可以使用gui工具或命令行。

如果你正在使用git add -p,即使在使用年代分割之后,你也没有足够小的变化,你可以使用e直接编辑补丁。

这可能有点令人困惑,但如果你遵循编辑器窗口中的说明,按下e后会打开,那么你就没问题了。在你引用的情况下,你会想要在这些行开头用空格替换-:

-
-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能够自动分割补丁。

因此,让我们通过按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注释删除只到下一次提交?

我们想把它分成两个提交:

  1. 第一次提交涉及删除一些行(删除注释)。

    要删除注释行,就不要去管它们,它们已经被标记为在版本控制中跟踪删除,就像我们想要的那样。

    < p > -/*#field_teacher_id { < br > - display: block; < br > 李-} */ < / p > < / >
  2. 第二次提交是一个更改,通过记录删除和添加来跟踪:

    • 删除(旧的选择器行删除)

      为了保留旧的选择器行(在提交期间不要删除它们),我们需要…

      要删除“-”行,请将它们改为“”

      ...字面意思是替换负-符号使用空格字符。

      这三行…

      < p > - < br > -form.table-form #field_teacher + label, < br > -form.table-form #field_producer_distributor + label { < / p >

      ...将变成(请注意所有3行的第一行的单个空格):

      < p > < br > form.table-form #field_teacher + label, < br > 李form.table-form #field_producer_distributor + label { < / p > < / >
    • 添加(添加新的选择器行)

      为了不注意在此提交期间添加的新选择器行,我们想要…

      要删除“+”行,请删除它们。

      ...字面意思是删除整行:

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

      (奖励:如果你碰巧使用vim作为你的编辑器,按dd删除一行。纳米用户按Ctrl+K)

    • 李< / ul > < / >

当你保存时,你的编辑器应该是这样的:

# 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;
}

最后,您可以看到最后一次提交只包括选择器更改。