我最近发现了patch
命令的git 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
选项不再可用了!
答案 0 :(得分:215)
如果您正在使用git add -p
,甚至在使用 s 拆分后,您没有足够小的更改,您可以使用 e 进行编辑补丁直接。
这可能有点令人困惑,但如果您 小心 ,请按照编辑器窗口中的说明操作,这些说明将在按 e 后打开那你就没事了。在您引用的情况下,您可能希望将-
替换为这些行开头的空格:
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
...并删除以下行,即以+
开头的行。如果您随后保存并退出编辑器,则只会删除CSS注释。
答案 1 :(得分:49)
让我们说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将它们混为一谈。
即使按 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注释删除添加到下一次提交?
我们希望将其拆分为两个提交:
第一次提交涉及删除一些行(删除注释)。
要删除注释行,只需将它们保持不变,它们已被标记为跟踪版本控制中的删除,就像我们想要的那样。
-/*#field_teacher_id {
- display: block;
-} */
第二次提交是一项更改,通过记录删除和添加来跟踪:
删除(删除旧选择线)
要保留旧的选择器行(在此提交期间不要删除它们),我们需要...
删除' - '线条,使他们' '
...字面意思是用空格-
字符替换负符号。
所以这三条线......
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
...将成为(通知所有3行中第一个的单个空格):
form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
添加(添加了新的选择线)
要注意在此提交期间添加的新选择器行,我们需要...
要删除' +'行,删除它们。
...字面意思是删除整行:
+#user-register form.table-form .field-type-checkbox label {
保存时,您的编辑器应如下所示:
# 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; }
最后,您可以看到最后一次提交仅包括选择器更改。
答案 2 :(得分:9)
如果你可以使用git gui,它允许你逐行进行更改。不幸的是,我不知道如何从命令行执行此操作 - 或者即使可能。
我过去使用的另一个选项是回滚部分更改(保持编辑器打开),提交我想要的位,撤消并从编辑器重新保存。不是很优雅,但完成工作。 :)
编辑(git-gui用法):
我不确定msysgit和linux版本中的git-gui是否相同,我只使用了msysgit。但假设它是相同的,当你运行它时,有四个窗格:左上窗格是你的工作目录更改,左下角是你的阶段更改,右上角是所选文件的差异(是工作目录)或者分阶段),右下角用于描述提交(我怀疑你不需要它)。当您单击右上角的文件时,您将看到差异。如果右键单击diff线,您将看到一个上下文菜单。需要注意的两个选项是“提交阶段大块”和“提交阶段线”。您继续在要提交的行上选择“提交阶段行”,您就完成了。您甚至可以选择多行并根据需要进行分级。您始终可以单击暂存框中的文件以查看您要提交的内容。
对于提交,您可以使用gui工具或命令行。
答案 3 :(得分:1)
一种方法是跳过块,git add
无论你需要什么,然后再次运行git add
。如果这是唯一的块,您将能够拆分它。
如果您担心提交顺序,请使用git rebase -i
。