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 เพื่อทำให้การคอมมิตภายในเครื่องของคุณอยู่ด้านบนของคอมมิตที่เก็บระยะไกล