SVN分支

分支操作創建另一條線路開發。它是有用的,當有人想開發過程叉成兩個不同的方向。讓我們假設發佈的產品版本1.0中,可能要創建新的分支,所以可以保持獨立,發展2.01.0 bug修復。

在本節中,我們將看到如何創建,遍歷和合並分支。Jerry 已經沮喪,因爲衝突,所以他決定創建新的私有分支。

[jerry@CentOS project_repo]$ ls
branches tags trunk

[jerry@CentOS project_repo]$ svn copy trunk branches/jerry_branch
A branches/jerry_branch

[jerry@CentOS project_repo]$ svn status
A + branches/jerry_branch

[jerry@CentOS project_repo]$ svn commit -m "Jerry's private branch"
Adding branches/jerry_branch
Adding branches/jerry_branch/README

Committed revision 9.
[jerry@CentOS project_repo]$

Jerry 是在他的私人分支工作。他補充說數組的排序操作。Jerry 修改後的代碼看起來是這樣的。

[jerry@CentOS project_repo]$ cd branches/jerry_branch/

[jerry@CentOS jerry_branch]$ cat array.c

上面的命令將產生以下結果

#include <stdio.h> #define MAX 16 void bubble_sort(int *arr, int n) { int i, j, temp, flag = 1; for (i = 1; i < n && flag == 1; ++i) { flag = 0; for (j = 0; j < n - i; ++j) { if (arr[j] > arr[j + 1]) { flag = 1; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } void accept_input(int *arr, int n) { int i; for (i = 0; i < n; ++i) scanf("%d", &arr[i]); } void display(int *arr, int n) { int i; for (i = 0; i < n; ++i) printf("|%d| ", arr[i]); printf("
"); } int main(void) { int i, n, key, ret, arr[MAX]; printf("Enter the total number of elements: "); scanf("%d", &n); /* Error handling for array overflow */ if (n >MAX) { fprintf(stderr, "Number of elements must be less than %d
", MAX); return 1; } printf("Enter the elements
"); accept_input(arr, n); printf("Array has following elements
"); display(arr, n); printf("Sorted data is
"); bubble_sort(arr, n); display(arr, n); return 0; }

Jerry 編譯並測試自己的代碼和準備提交他修改的變化。

[jerry@CentOS jerry_branch]$ make array
cc array.c -o array

[jerry@CentOS jerry_branch]$ ./array

上面的命令將產生以下結果

Enter the total number of elements: 5
Enter the elements
10
-4
2
7
9
Array has following elements
|10| |-4| |2| |7| |9|
Sorted data is
|-4| |2| |7| |9| |10|

[jerry@CentOS jerry_branch]$ svn status
? array
M array.c

[jerry@CentOS jerry_branch]$ svn commit -m "Added sort operation"
Sending jerry_branch/array.c
Transmitting file data .
Committed revision 10.

同時通過軀幹,Tom決定執行搜索操作。Tom搜索操作添加代碼,他的代碼看起來像這樣。

[tom@CentOS trunk]$ svn diff

上面的命令將產生以下結果

Index: array.c

--- array.c (revision 10)
+++ array.c (working copy)
@@ -2,6 +2,27 @@

#define MAX 16

+int bin_search(int *arr, int n, int key)
+{

  • int low, high, mid;

  • low = 0;

  • high = n - 1;

  • mid = low + (high - low) / 2;

  • while (low <= high) {

  •  if (arr\[mid\] == key)
  •     return mid;
  •  if (arr\[mid\] > key)
  •     high = mid - 1;
  •  else
  •     low = mid + 1;
  •  mid = low + (high - low) / 2;
  • }

  • return -1;

  • }

  • void accept_input(int *arr, int n)
    {
    int i;
    @@ -22,7 +43,7 @@

    int main(void)
    {

  • int i, n, arr[MAX];
  • int i, n, ret, key, arr[MAX];

    printf("Enter the total number of elements: ");
    scanf("%d", &n);
    @@ -39,5 +60,16 @@
    printf("Array has following elements
    ");
    display(arr, n);

  • printf("Enter the element to be searched: ");

  • scanf("%d", &key);

  • ret = bin_search(arr, n, key);

  • if (ret < 0) {

  •  fprintf(stderr, "%d element not present in array

    ", key);

  •  return 1;
  • }

  • printf("%d element found at location %d
    ", key, ret + 1);

  • return 0;
    }

審查後,他提交了他修改的變化。

[tom@CentOS trunk]$ svn status
? array
M array.c

[tom@CentOS trunk]$ svn commit -m "Added search operation"
Sending trunk/array.c
Transmitting file data .
Committed revision 11.

但Tom 好奇爲什麼 Jerry 一直在做他的私人分支。

[tom@CentOS trunk]$ cd ../branches/
[tom@CentOS branches]$ svn up
A jerry_branch
A jerry_branch/array.c
A jerry_branch/README

[tom@CentOS branches]$ svn log

r9 | jerry | 2013-08-27 21:56:51 +0530 (Tue, 27 Aug 2013) | 1 line

Added sort operation

查看Subversion的日誌消息,Tom發現,Jerry實現的排序操作。Tom執行搜索操作使用二進制搜索算法,它總是希望數據的排序順序。但是,如果用戶提供的數據,未排序的順序呢?在這種情況下的二進制搜索操作將失敗。於是,他決定採用Jerry 的代碼,搜索操作前對數據進行排序。於是,他會要求Subversion的從Jerry的分支到主幹合併代碼。

[tom@CentOS trunk]$ pwd
/home/tom/project_repo/trunk

[tom@CentOS trunk]$ svn merge ../branches/jerry_branch/
--- Merging r9 through r11 into '.':
U array.c

合併後array.c的這個樣子。

[tom@CentOS trunk]$ cat array.c

上面的命令將產生以下結果

#include <stdio.h> #define MAX 16 void bubble_sort(int *arr, int n) { int i, j, temp, flag = 1; for (i = 1; i < n && flag == 1; ++i) { flag = 0; for (j = 0; j < n - i; ++j) { if (arr[j] > arr[j + 1]) { flag = 1; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } int bin_search(int *arr, int n, int key) { int low, high, mid; low = 0; high = n - 1; mid = low + (high - low) / 2; while (low <= high) { if (arr[mid] == key) return mid; if (arr[mid] > key) high = mid - 1; else low = mid + 1; mid = low + (high - low) / 2; } return -1; } void accept_input(int *arr, int n) { int i; for (i = 0; i < n; ++i) scanf("%d", &arr[i]); } void display(int *arr, int n) { int i; for (i = 0; i < n; ++i) printf("|%d| ", arr[i]); printf("
"); } int main(void) { int i, n, ret, key, arr[MAX]; printf("Enter the total number of elements: "); scanf("%d", &n); /* Error handling for array overflow */ if (n > MAX) { fprintf(stderr, "Number of elements must be less than %d
", MAX); return 1; } printf("Enter the elements
"); accept_input(arr, n); printf("Array has following elements
"); display(arr, n); printf("Sorted data is
"); bubble_sort(arr, n); display(arr, n); printf("Enter the element to be searched: "); scanf("%d", &key); ret = bin_search(arr, n, key); if (ret < 0) { fprintf(stderr, "%d element not present in array
", key); return 1; } printf("%d element found at location %d
", key, ret + 1); return 0; }

Tom 測試完成後,提交他的修改到版本庫。

[tom@CentOS trunk]$ make array
cc array.c -o array

[tom@CentOS trunk]$ ./array
Enter the total number of elements: 5
Enter the elements
10
-2
8
15
3
Array has following elements
|10| |-2| |8| |15| |3|
Sorted data is
|-2| |3| |8| |10| |15|
Enter the element to be searched: -2
-2 element found at location 1

[tom@CentOS trunk]$ svn commit -m "Merge changes from Jerry's code"
Sending trunk
Sending trunk/array.c
Transmitting file data .
Committed revision 12.

[tom@CentOS trunk]$