git format-patchで時系列に沿った形の一連のパッチ作成。
リポジトリを初期化して、ファイルを追加
[masami@moon:~/build/hello]% git init Initialized empty Git repository in /home/masami/build/hello/.git/ [masami@moon:~/build/hello]% emacs hello.c [masami@moon:~/build/hello]% git add hello.c [masami@moon:~/build/hello]% git commit -a [master (root-commit) f0e33a4] first commit. 1 files changed, 6 insertions(+), 0 deletions(-) create mode 100644 hello.c
この時点ではこんな感じ
#include <stdio.h> int main(int argc, char **argv) { return 0; }
hello-testブランチを作ってそちらで作業する。
[masami@moon:~/build/hello]% git checkout -b hello-test master Switched to a new branch 'hello-test' [masami@moon:~/build/hello]% emacs hello.c [masami@moon:~/build/hello]% git commit -a [hello-test daa6520] added say_hello(). 1 files changed, 6 insertions(+), 0 deletions(-)
最初に、say_hello()を追加。
#include <stdio.h> void say_hello(char **argv) { } int main(int argc, char **argv) { say_hello(argv); return 0; }
次にsay_hello()の中身を実装。
[masami@moon:~/build/hello]% emacs hello.c [masami@moon:~/build/hello]% git commit -a [hello-test ad2e558] implement say_hello(). 1 files changed, 3 insertions(+), 0 deletions(-)
#include <stdio.h> void say_hello(char **argv) { while (*argv) printf("%s ", *argv++); putchar('\n'); } int main(int argc, char **argv) { say_hello(argv); return 0; }
ここで、masterブランチで変更を入れる
[masami@moon:~/build/hello]% git checkout master Switched to branch 'master' [masami@moon:~/build/hello]% emacs hello.c [masami@moon:~/build/hello]% git commit -a [master 3f66a64] added comment. 1 files changed, 3 insertions(+), 0 deletions(-)
masterブランチはファイルの先頭にコメントを追加。
/** * this is a sample code */ #include <stdio.h> int main(int argc, char **argv) { return 0; }
またhello-testブランチに戻る
[masami@moon:~/build/hello]% git checkout hello-test Switched to branch 'hello-test'
masterブランチの変更を取り込むのだが、git rebaseを使ってhello-testで行っている一連の変更を保たせる。
[masami@moon:~/build/hello]% git rebase master First, rewinding head to replay your work on top of it... Applying: added say_hello(). error: patch failed: hello.c:1 error: hello.c: patch does not apply Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging hello.c Applying: implement say_hello(). [masami@moon:~/build/hello]% emacs hello.c [masami@moon:~/build/hello]% git commit -a [hello-test 9f82d08] say_hello() should be static method. 1 files changed, 1 insertions(+), 1 deletions(-)
say_hello()をstaticに変更。
/** * this is a sample code */ #include <stdio.h> static void say_hello(char **argv) { while (*argv) printf("%s ", *argv++); putchar('\n'); } int main(int argc, char **argv) { say_hello(argv); return 0; }
最後に以下のコマンドでmasterとの差分を作成。-sオプションでSigned-off-byの行を追加できます。
fromとSigned-off-byの名前とメアドは変えましたが、メール送信出来る形でパッチが作成できます。
[masami@moon:~/build/hello]% git format-patch -s master
0001-added-say_hello.patch
0002-implement-say_hello.patch
0003-say_hello-should-be-static-method.patch
[masami@moon:~/build/hello]% cat 0001-added-say_hello.patch
From e78f286df1376b2cb01aaf0eb685e798d7e888e2 Mon Sep 17 00:00:00 2001
From: foo <mail address>
Date: Thu, 25 Jun 2009 22:30:10 +0900
Subject: [PATCH 1/3] added say_hello().
Signed-off-by: foo <mail address>
---
hello.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/hello.c b/hello.c
index b029e64..8535e02 100644
--- a/hello.c
+++ b/hello.c
@@ -3,7 +3,13 @@
*/
#include <stdio.h>
+void say_hello(char **argv)
+{
+}
+
int main(int argc, char **argv)
{
+ say_hello(argv);
+
return 0;
}
--
1.6.3.1
[masami@moon:~/build/hello]% cat 0002-implement-say_hello.patch
From 069deb249439ef11c159102cb539a8dd844d308d Mon Sep 17 00:00:00 2001
From: foo <mail address>
Date: Thu, 25 Jun 2009 22:31:05 +0900
Subject: [PATCH 2/3] implement say_hello().
Signed-off-by: foo <mail address>
---
hello.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/hello.c b/hello.c
index 8535e02..c2788fa 100644
--- a/hello.c
+++ b/hello.c
@@ -5,6 +5,9 @@
void say_hello(char **argv)
{
+ while (*argv)
+ printf("%s ", *argv++);
+ putchar('\n');
}
int main(int argc, char **argv)
--
1.6.3.1
[masami@moon:~/build/hello]% cat 0003-say_hello-should-be-static-method.patch
From 9f82d0835bf95b0cf6c3ea8ca966e72254734f90 Mon Sep 17 00:00:00 2001
From: foo <mail address>
Date: Thu, 25 Jun 2009 22:32:34 +0900
Subject: [PATCH 3/3] say_hello() should be static method.
Signed-off-by: foo <mail address>
---
hello.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/hello.c b/hello.c
index c2788fa..cff1bd9 100644
--- a/hello.c
+++ b/hello.c
@@ -3,7 +3,7 @@
*/
#include <stdio.h>
-void say_hello(char **argv)
+static void say_hello(char **argv)
{
while (*argv)
printf("%s ", *argv++);
--
1.6.3.1
[masami@moon:~/build/hello]%