一つのファイルの中にたくさん変更を行ったんだけど、コミットする単位は小分けにしたいというケースがあります。
そんな時は、git add -p
すると良いようです。試してみましょう。
$ git add -p app/models/blog.rb
diff --git a/app/models/blog.rb b/app/models/blog.rb
index 17bb72a..88634db 100644
--- a/app/models/blog.rb
+++ b/app/models/blog.rb
@@ -1,7 +1,10 @@
# coding: utf-8
-
require_relative 'post'
+module Conversions
+
+end
+
class Blog
attr_writer :post_source
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
差分があるところが切りだされて、「ここはStagingに乗せる?」と聞いてきます。
Stagingに乗せる場合は、「y」と答えます。そうでない場合は「n」と答えます。
今回は、「n」と答えます。すると、次の差分が出てきます。
@@ -35,12 +38,29 @@ class Blog
fetch_entries
end
+ def tags
+ Post.all_tags_alphabetical
+ #entries.all_tags_alphabetical
+ end
def filter_by_tag(tag)
FilteredBlog.new(self, tag)
end
private
+ class FilteredBlog < DelegateClass(Blog)
+ include ::Conversions
+
+ def initialize(blog, tag)
+ super(blog)
+ @tag = tag
+ end
+
+ def entries
+ Taggable(super).tagged(@tag)
+ end
+ end
+
def post_source
@post_source ||= Post.public_method(:new)
end
Stage this hunk [y,n,q,a,d,/,K,g,s,e,?]?
出てきた差分のうち、class FilteredBlog < DelegateClass(Blog)
の部分だけをStagingに乗せようと思います。
そこで「e」を押すと、エディタが表示されます。
私の環境ではVimが表示され、先ほどの差分が表示されました。更に最後までスクロールすると、次のように書かれています。
# ---
# 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.
英語で書かれていますが、まとめると、
- '-'の行をaddしたくなければ、'-'を' '(空白)にする。
- '+'の行をaddしたくなければ、'+'の行を消す。
- 先頭に#と書かれている行はaddされません。
ということです。
今回の例では、次のようにすればOKです。
def tags
からend
までの行を単純に削除しました。これを保存します。
git status
とすると、同じファイルなのにStagingにいるものとStagingに居ないものとに分かれています。
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: app/models/blog.rb
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: app/models/blog.rb
$
更に確認がしたい場合は、git diff --cached
でStaging環境にあるものの差分が、git diff
でStaging環境にないものの差分が確認できますので、コミットする前に確認してもよいでしょう。
後は普通にgit commit
でコミットすればOKです。