Friday, May 15, 2009

ย้าย commit ใน git

ปัญหาก็คือ branch ของผมมีหน้าตาเป็นแบบนี้

A deploy
/
D---E---F---G master

แต่ผมอยากย้าย commit G ไปอยู่ใน branch deploy
ให้มีหน้าตาแบบนี้

G--A deploy
/
D---E---F master

หลังจากนั่งทดลองอยู่นาน ก็พบว่า คำตอบนั้นง่ายนิดเดียว

git checkout master
git reset --hard HEAD^

Related link from Roti

6 comments:

TAP said...
This comment has been removed by the author.
TAP said...

คอมเมนต์อันก่อน มัน indent ไม่ได้อย่างใจ เลยลบทิ้ง เนื้อหาที่ต้องการเป็นตามข้างล่างนี้หนะครับ

เพราะว่าการ visualize tree มันดันเป็นแบบนี้ เลยแอบสร้างความเข้าใจผิดให้เราโดยไม่รู้ตัว

เช่น branch รูปนี้
                    A deploy
                  /
D---E---F---G---H master

ถ้ามันอยู่ในรูปนี้
                    A deploy
                  /
D---E---F---G
                  \
                    H master

จะทำให้พี่แก้ปัญหานี้ได้เร็วขึ้นมาก

polawat phetra said...

คำถามให้น้อง TAP

จากรูปของ TAP ถ้าต้องการ move commit H จาก master ไป branch 'deploy' จะต้องสั่งอย่างไร

TAP said...

ตามที่เข้าใจก็คงต้อง merge อย่างเดียวครับ เพราะว่า commit H กับ branch deploy มันเป็นคนละเส้นกันแล้ว
แต่ที่วาดรูปนี้ให้ดู จะแสดงให้เห็นถึงเรื่องว่า จากเจ้าตัว visualize tree เนี้ย อาจจะทำให้ผู้ใช้บางท่าน ลืมไป ได้ว่า D E F G ก็ถือว่าเป็น commit ของสาย deploy เหมือนกัน

polawat phetra said...

มีบางสถานะการณ์ที่เราไม่อยากทิ้ง H ไว้ที่ branch master
กรณีของผมก็คือ branch master ใช้การ pull จาก svn อย่างเดียว (one-way) ส่วน branch deploy ใช้เป็น custom configuration ของ site หนึ่งๆ

กรณีนี้เราแก้โดย
git checkout deploy
git rebase master
git checkout master
git reset --hard HEAD^

(สองขั้นสุดท้ายก็คือ ขั้นที่พี่อธิบายใน POST)

TAP said...

โอ้ น่าสนใจมาก ขอบคุณครับ ไม่เคยรู้เลยว่า rebase เอาไว้ทำอะไร