git add -p が使えない場合の代替操作
Gitに乗り換えよう、と決意したきっかけの1つが
「変更したファイルの一部だけをコミットできる」点。
しかしそのためのコマンド、
git add -p
が、何故か使えませんでした・・・*1
git add -i
で代替する操作方法。
きっかけは、機能追加中にPHP Noticeが出てることに気づいた*2ので、Noticeつぶし分だけコミットしようとしたこと。
git add -pした場合の結果。
[cake@cake AjaxChat]$ git add -p lib/trpg.php usage: git-add [-n] [-v] [-f] [--interactive | -i] [-u] [--] <filepattern>...
「-p? そんなオプションはねえ!」って言われましたー (T-T)
でも、この
[--interactive | -i]
というのが、引っかかる。
interactive な git addの使い方に参考したサイト。
http://progit.org/book/ja/ch6-2.html
では、git add -iした場合に表示される、「5: patch」のコマンド指定して。。
[cake@cake AjaxChat]$ git add -i
staged unstaged path
1: unchanged +20/-7 lib/trpg.php
2: unchanged +2/-1 setup/orig/config-data-trpg.php
3: unchanged +1/-1 write.php
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 5
staged unstaged path
1: unchanged +20/-7 lib/trpg.php
2: unchanged +2/-1 setup/orig/config-data-trpg.php
3: unchanged +1/-1 write.phpコミットしたい差分が含まれるファイル、「1」を選んでみる。
Patch update> 1
diff --git a/lib/trpg.php b/lib/trpg.php
index cba4bbd..c08e165 100644
--- a/lib/trpg.php
+++ b/lib/trpg.php
@@ -10,10 +10,14 @@
* 入力内容をダイス変換
*/
function convert_dice($string) {
+ if (!isset($GLOBAL['AJAX_CHAT_TRPG']['count'])) {
+ $GLOBAL['AJAX_CHAT_TRPG']['count'] = 0;
+ }
+
// 基本ダイス変換
// [2d6+5@u(l)o4cr6mfz1]/3
if (preg_match("/(.*)[[]([0-9]+)(d)([0-9]+)([-\+\*\/\s]*[0-9-\+\*\/\s]*)@?([ul][0-9]+s?o?)?(cr?[0-9\-]+m?)?(f?z?[0-9\-]*)[\]]([\/\*]{0,1}[1-9]*)(.*$)/i", $string, $dice)) {
- $GLOBAL['AJAX_CHAT_TRPG']['count_one'] = true;
+ $GLOBAL['AJAX_CHAT_TRPG']['count']++;
$dice_result = dice_convert($dice[2], $dice[4], $dice[5], $dice[6], $dice[7], $dice[8], $dice[9]);
$string = $dice[1].$dice_result.$dice[10];
}
Stage this hunk [y/n/a/d/j/J/s/?]? このファイルの全差分が出てるっぽい。
先程の参照サイトを参考に、
「s - split the current hunk into smaller hunks」
をしてみる。
Stage this hunk [y/n/a/d/j/J/s/?]? s
Split into 3 hunks.
@@ -10,4 +10,8 @@
* 入力内容をダイス変換
*/
function convert_dice($string) {
+ if (!isset($GLOBAL['AJAX_CHAT_TRPG']['count'])) {
+ $GLOBAL['AJAX_CHAT_TRPG']['count'] = 0;
+ }
+
// 基本ダイス変換
Stage this hunk [y/n/a/d/j/J/?]?よし!差分一箇所だけになった!! (^^)
では差分ごとにadd指定。
ひとまずこれはまだコミットしないので「n」と・・・
Stage this hunk [y/n/a/d/j/J/?]? n
@@ -13,3 +17,3 @@
// 基本ダイス変換
- // [2d6+5@u(l)o4cr6mfz1]/3
+ // [2d6+5@u(l)o4cr6mfz1]/3
if (preg_match("/(.*)[[]([0-9]+)(d)([0-9]+)([-\+\*\/\s]*[0-9-\+\*\/\s]*)@?([ul][0-9]+s?o?)?(cr?[0-9\-]+m?)?(f?z?[0-9\-]*)[\]]([\/\*]{0,1}[1-9]*)(.*$)/i", $string, $dice)) {
Stage this hunk [y/n/a/d/K/j/J/?]?次の差分が表示されました。
この調子で指定していくと、
Stage this hunk [y/n/a/d/K/j/J/s/?]? n
@@ -248,9 +261,9 @@ function dice_main($dicenum, $dicenumber, $revision, $c, $f, $pickup) {
// ファンブルは0点の場合
if (preg_match("/^fz([0-9]+)([\-]*)$/i", $f)) {
- define(F_ZERO, true);
+ define('F_ZERO', true);
} else {
- define(F_ZERO, false);
+ define('F_ZERO', false);
}
// roll
Stage this hunk [y/n/a/d/K/j/J/s/?]?あ、これは要る。
と思ったら、「y」。
Stage this hunk [y/n/a/d/K/j/J/s/?]? y
@@ -310,7 +323,7 @@ function dice_main($dicenum, $dicenumber, $revision, $c, $f, $pickup) {
// 合計値
//最大値のみ加算する場合
- if ($pickup_one) {
+ if (isset($pickup_one) && $pickup_one) {
if ((int)$d_result[$i]['add_number'] > (int)$d_result['result_max']) {
$d_result['result_max'] = (int)$d_result[$i]['add_number'];
}
Stage this hunk [y/n/a/d/K/j/J/?]?以下略。
ファイルの終端まで行ったら、コマンド選択画面に戻ります。
*** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> 7 Bye.
他に追加点無いので、「7:quit」。
部分指定できたことを確認。
[cake@cake AjaxChat]$ git status # On branch trpgchat_ver263 # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: lib/trpg.php # # Changed but not updated: # (use "git add <file>..." to update what will be committed) # # modified: lib/trpg.php # modified: setup/orig/config-data-trpg.php # modified: write.php # [cake@cake AjaxChat]$ git diff lib/trpg.php (略)
あとはgit commit!