Git - การจัดการสาขา
การดำเนินการสาขาช่วยให้สามารถสร้างสายการพัฒนาอื่นได้ เราสามารถใช้การดำเนินการนี้เพื่อแยกกระบวนการพัฒนาออกเป็นสองทิศทางที่แตกต่างกัน ตัวอย่างเช่นเราเปิดตัวผลิตภัณฑ์สำหรับเวอร์ชัน 6.0 และเราอาจต้องการสร้างสาขาเพื่อให้สามารถแยกการพัฒนาคุณลักษณะ 7.0 ออกจากการแก้ไขข้อบกพร่อง 6.0
สร้างสาขา
Tom สร้างสาขาใหม่โดยใช้คำสั่ง git branch <branch name> เราสามารถสร้างสาขาใหม่จากสาขาที่มีอยู่ เราสามารถใช้การกระทำหรือแท็กเฉพาะเป็นจุดเริ่มต้น หากไม่มีการระบุรหัสคอมมิตเฉพาะสาขาจะถูกสร้างขึ้นโดยมี HEAD เป็นจุดเริ่มต้น
[jerry@CentOS src]$ git branch new_branch
[jerry@CentOS src]$ git branch
* master
new_branch
มีการสร้างสาขาใหม่ Tom ใช้คำสั่ง git branch เพื่อแสดงรายการสาขาที่มี Git แสดงเครื่องหมายดอกจันก่อนที่จะเช็คเอาต์สาขา
การแสดงภาพของการดำเนินการสร้างสาขาแสดงไว้ด้านล่าง -
สลับไปมาระหว่างสาขา
Jerry ใช้คำสั่ง git checkout เพื่อสลับไปมาระหว่างสาขา
[jerry@CentOS src]$ git checkout new_branch
Switched to branch 'new_branch'
[jerry@CentOS src]$ git branch
master
* new_branch
ทางลัดเพื่อสร้างและเปลี่ยนสาขา
ในตัวอย่างข้างต้นเราได้ใช้สองคำสั่งเพื่อสร้างและสลับสาขาตามลำดับ Git ให้–bตัวเลือกที่มีคำสั่งชำระเงิน การดำเนินการนี้จะสร้างสาขาใหม่และเปลี่ยนไปใช้สาขาใหม่ทันที
[jerry@CentOS src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'
[jerry@CentOS src]$ git branch
master
new_branch
* test_branch
ลบสาขา
สามารถลบสาขาได้โดยระบุอ็อพชัน –D พร้อมคำสั่ง git branch แต่ก่อนที่จะลบสาขาที่มีอยู่ให้เปลี่ยนไปใช้สาขาอื่น
เจอร์รี่อยู่ในขณะนี้ test_branchและเขาต้องการลบสาขานั้นออก ดังนั้นเขาจึงสลับสาขาและลบสาขาตามที่แสดงด้านล่าง
[jerry@CentOS src]$ git branch
master
new_branch
* test_branch
[jerry@CentOS src]$ git checkout master
Switched to branch 'master'
[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).
ตอนนี้ Git จะแสดงเพียงสองสาขา
[jerry@CentOS src]$ git branch
* master
new_branch
เปลี่ยนชื่อสาขา
เจอร์รี่ตัดสินใจเพิ่มการรองรับอักขระแบบกว้างในโปรเจ็กต์การดำเนินการสตริงของเขา เขาได้สร้างสาขาใหม่แล้ว แต่ชื่อสาขาไม่เหมาะสม ดังนั้นเขาจึงเปลี่ยนชื่อสาขาโดยใช้–m ตามด้วย old branch name และ new branch name.
[jerry@CentOS src]$ git branch
* master
new_branch
[jerry@CentOS src]$ git branch -m new_branch wchar_support
ตอนนี้คำสั่ง git branch จะแสดงชื่อสาขาใหม่
[jerry@CentOS src]$ git branch
* master
wchar_support
รวมสองสาขา
Jerry ใช้ฟังก์ชันเพื่อส่งกลับความยาวสตริงของสตริงอักขระแบบกว้าง รหัสใหม่จะปรากฏดังนี้ -
[jerry@CentOS src]$ git branch
master
* wchar_support
[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src
[jerry@CentOS src]$ git diff
คำสั่งดังกล่าวก่อให้เกิดผลลัพธ์ต่อไปนี้ -
t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
+
const wchar_t *p = s;
+
+
while (*p)
+ ++p;
+ return (p - s);
+
}
หลังจากการทดสอบเขามุ่งมั่นและผลักดันการเปลี่ยนแปลงไปยังสาขาใหม่
[jerry@CentOS src]$ git status -s
M string_operations.c
?? string_operations
[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'
[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)
โปรดทราบว่าเจอร์รี่กำลังผลักดันการเปลี่ยนแปลงเหล่านี้ไปยังสาขาใหม่ซึ่งเป็นสาเหตุที่เขาใช้ชื่อสาขา wchar_support แทน master สาขา.
[jerry@CentOS src]$ git push origin wchar_support <−−− Observer branch_name
คำสั่งดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้
Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support
หลังจากดำเนินการเปลี่ยนแปลงสาขาใหม่จะปรากฏดังนี้ -
ทอมอยากรู้ว่าเจอร์รี่กำลังทำอะไรในสาขาส่วนตัวของเขาและเขาตรวจสอบบันทึกจากไฟล์ wchar_support สาขา.
[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
[tom@CentOS src]$ git log origin/wchar_support -2
คำสั่งดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้
commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530
Added w_strlen function to return string lenght of wchar_t string
commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530
Removed executable binary
ด้วยการดูข้อความคอมมิตทอมตระหนักว่าเจอร์รี่ใช้ฟังก์ชัน strlen สำหรับอักขระแบบกว้างและเขาต้องการฟังก์ชันเดียวกันในสาขาหลัก แทนที่จะนำไปใช้ใหม่เขาตัดสินใจที่จะใช้รหัสของเจอร์รี่โดยการรวมสาขาของเขาเข้ากับสาขาหลัก
[tom@CentOS project]$ git branch
* master
[tom@CentOS project]$ pwd
/home/tom/top_repo/project
[tom@CentOS project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
หลังจากการดำเนินการผสานสาขาหลักจะปรากฏดังนี้ -
ตอนนี้สาขา wchar_supportได้รวมเข้ากับสาขาหลักแล้ว เราสามารถตรวจสอบได้โดยดูข้อความคอมมิตหรือดูการแก้ไขที่ทำลงในไฟล์ string_operation.c
[tom@CentOS project]$ cd src/
[tom@CentOS src]$ git log -1
commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse
Date: Wed Sep 11 16:10:06 2013 +0530 Added w_strlen function to return string lenght of wchar_t string [tom@CentOS src]$ head -12 string_operations.c
คำสั่งดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้
#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
const wchar_t *p = s;
while (*p)
++p;
return (p - s);
}
หลังจากการทดสอบเขาดันเปลี่ยนรหัสไปที่สาขาหลัก
[tom@CentOS src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
5776472..64192f9 master −> master
สาขา Rebase
คำสั่ง Git rebase เป็นคำสั่งการผสานสาขา แต่ความแตกต่างคือคำสั่งปรับเปลี่ยนลำดับการคอมมิต
คำสั่ง Git merge จะพยายามใส่คอมมิตจากสาขาอื่นที่ด้านบนของ HEAD ของสาขาโลคัลปัจจุบัน ตัวอย่างเช่นสาขาในพื้นที่ของคุณได้กำหนด A−> B−> C−> D และสาขาการผสานได้คอมมิชชัน A−> B−> X−> Y จากนั้น git merge จะแปลงสาขาในพื้นที่ปัจจุบันเป็น A−> B−> C−> D−> X−> Y
คำสั่ง Git rebase พยายามค้นหาบรรพบุรุษร่วมระหว่างสาขาภายในปัจจุบันและสาขาการผสาน จากนั้นจะพุชคอมมิตไปยังสาขาในพื้นที่โดยการปรับเปลี่ยนลำดับของการคอมมิตในสาขาท้องถิ่นปัจจุบัน ตัวอย่างเช่นหากสาขาในพื้นที่ของคุณยอมรับ A−> B−> C−> D และสาขาการผสานได้ยอมรับ A−> B−> X−> Y ดังนั้น Git rebase จะแปลงสาขาท้องถิ่นปัจจุบันเป็น A something > B−> X−> Y−> C−> D.
เมื่อนักพัฒนาหลายคนทำงานบนที่เก็บระยะไกลเดียวคุณจะไม่สามารถแก้ไขลำดับของการคอมมิตในที่เก็บระยะไกล ในสถานการณ์นี้คุณสามารถใช้การดำเนินการ rebase เพื่อทำให้การคอมมิตภายในเครื่องของคุณอยู่ด้านบนของคอมมิตที่เก็บระยะไกล