読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

[git] gitのお勉強 - その4

git

[git] gitのお勉強 - その3 - yomi322 blogの続き。今回はブランチに変更をマージしてみる。

前回作ったnewブランチに新しいarray.cを追加する。

% ls
array.c  forloop.c
% cat array.c
#include <stdio.h>

int main(void) {
    int i;
    int array[10];

    for (i = 0; i < 10; i++) {
        array[i] = i * 2;
    }

    for (i = 0; i < 10; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }

    return 0;
}

% git add array.c
% git commit -m "add array.c"
[new 345c7bd] add array.c
 1 files changed, 17 insertions(+), 0 deletions(-)
 create mode 100644 array.c

この変更をmasterブランチにマージする。マージするときは、マージ先のブランチに移ってからgit mergeする。

% git checkout master
Switched to branch 'master'
% git merge new
Updating 0c7e6dc..345c7bd
Fast-forward
 array.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)
 create mode 100644 array.c

マージするときにすべてのコミットの中から必要な分を選ぶこともできる。この時はgit cherry-pickというコマンドを使う。まず、newブランチに移っていくつかコミットをする。

% git checkout new
Switched to branch 'new'
% cat if.c
#include <stdio.h>

int main(void) {
    int i = 5;

    if (i > 0) {
        printf("greater than 0.\n");
    }

    return 0;
}

% git add if.c
% git commit -m "add if.c"
[new 4dc8ea7] add if.c
 1 files changed, 12 insertions(+), 0 deletions(-)
 create mode 100644 if.c
% git diff if.c
diff --git a/if.c b/if.c
index 39313f7..21cca7b 100644
--- a/if.c
+++ b/if.c
@@ -5,6 +5,8 @@ int main(void) {
 
     if (i > 0) {
         printf("greater than 0.\n");
+    } else if (i < 0) {
+        printf("less than 0.\n");
     }
 
     return 0;
% git commit -a -m "add behavior of negative value"
[new 353bd37] add behavior of negative value
 1 files changed, 2 insertions(+), 0 deletions(-)
% git diff
diff --git a/if.c b/if.c
index 21cca7b..477b727 100644
--- a/if.c
+++ b/if.c
@@ -7,6 +7,8 @@ int main(void) {
         printf("greater than 0.\n");
     } else if (i < 0) {
         printf("less than 0.\n");
+    } else {
+        printf("equal to 0.\n");
     }
 
     return 0;
% git commit -a -m "add behavior of 0"
[new d105d2f] add behavior of 0
 1 files changed, 2 insertions(+), 0 deletions(-)

これで新しく3つのコミットができた。

% git log -3
commit d105d2fd34d1b59761247105752c8a00e9a404ed
Author: yomi322 <yomi322@gmail.com>
Date:   Wed Apr 25 21:13:23 2012 +0900

    add behavior of 0

commit 353bd3738f9d1f38b212eee427c3593c97608d27
Author: yomi322 <yomi322@gmail.com>
Date:   Wed Apr 25 21:11:17 2012 +0900

    add behavior of negative value

commit 4dc8ea723414b648b6910fd513537eebd7b9230a
Author: yomi322 <yomi322@gmail.com>
Date:   Wed Apr 25 21:01:59 2012 +0900

    add if.c

このうち、最初の変更をマージするにはコミットのハッシュ値4dc8ea7...を指定してgit cherry-pickする。ハッシュ値はユニークに決まればすべて書く必要はない。

% git checkout master 
Switched to branch 'master'
% git cherry-pick 4dc8ea7
[master 01c00c9] add if.c
 1 files changed, 12 insertions(+), 0 deletions(-)
 create mode 100644 if.c
% git log -1
commit 01c00c9d5225436d27ec868f11415084a265874d
Author: yomi322 <yomi322@gmail.com>
Date:   Wed Apr 25 21:01:59 2012 +0900

    add if.c

これでmasterブランチにマージされた。git cherry-pickに-nオプションをつけるとコミットされずにステージングエリアに上げられる。これはいくつかのコミットをまとめてチェリーピックするときに便利だったりする。

% git cherry-pick -n 353bd37 d105d2f
% git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   if.c
#
% git diff --cached if.c
diff --git a/if.c b/if.c
index 39313f7..477b727 100644
--- a/if.c
+++ b/if.c
@@ -5,6 +5,10 @@ int main(void) {
 
     if (i > 0) {
         printf("greater than 0.\n");
+    } else if (i < 0) {
+        printf("less than 0.\n");
+    } else {
+        printf("equal to 0.\n");
     }
 
     return 0;
% git commit -m "add behavior of negative or 0 value"
[master 212fce9] add behavior of negative or 0 value
 1 files changed, 4 insertions(+), 0 deletions(-)
% git log -2
commit 212fce92f7c13fd80210493a6fdb6fd6136bf8d4
Author: yomi322 <yomi322@gmail.com>
Date:   Wed Apr 25 21:32:43 2012 +0900

    add behavior of negative or 0 value

commit 01c00c9d5225436d27ec868f11415084a265874d
Author: yomi322 <yomi322@gmail.com>
Date:   Wed Apr 25 21:01:59 2012 +0900

    add if.c

今回はここまで。