ช่วงนี้กำลังต่อสู้กับ git อยู่ครับ แล้วก็ยังมึนๆ กับมันอยู่ ยังไม่ค่อยเข้าใจอะไรกับมันมาก
แล้วยังกระแดะจะให้มันมาใช้คู่กับ svn อีก ก็ Capistrano บน Dreamhost มันใช้ได้แค่ svn นี่หว่า ก็มาลุยกัน
สมมติว่าติดตั้ง git-svn ไปแล้ว
ก็ clone repo ก่อน
$ git svn clone http://svn.yoursite.com/your_project --trunk=trunkมันก็จะ init ค่าต่างๆ ใน .git/config สำหรับ svn ให้ แล้วไป init ค่าสำหรับ github
$ git remote add origin git@github.com:YourUsername/your_project.git $ git push origin masterก็ลองดูใน .git/config ดูนะครับ ว่ามัน config อะไรเพิ่มไป ใส่เพิ่มว่า
[branch "master"]
remote = origin
merge = refs/heads/master
แล้วก็แก้งานไป ตามปกติ แล้วลอง
$ git status $ git add . $ git commit -m "your comment"
ณ ตรงนี้ มันจะไปแก้ refs/head/master เป็นค่าๆ นึง ซึ่งเป็นค่าใหม่
ถ้า push จะปกติดี
แต่ปัญหามันอยู่ที่ ถ้า
$ git svn dcommit
ไปก่อน มันก็จะไปจัดการในส่วนของ svn ให้ แต่มันจะไปแก้ refs/head/master เป็นอีกค่านึง(ต่อจากอันเก่า)
พอสั่ง push คราวนี้ จะไม่ได้แล้ว มันจะขึ้นว่า
error: remote 'refs/heads/master' is not a strict subset of local ref 'refs/heads/master'. maybe you are not up-to-date and need to pull first?
อันนี้ เป็นสิ่งที่ยังงงอยู่ ผมเข้าใจว่า ค่าเก่า(ก่อน commit) กับค่าใหม่(หลัง commit) มีอะไรเชื่อมกันอยู่ ถ้า push ก็จะได้ปกติ
แต่ถ้า dcommit แล้ว push มันคงเอาค่าเก่า(ก่อน commit ค่านี้จะอยู่บน github ด้วย) มาทำอะไรกับค่าใหม่กว่า(หลัง dcommit) สิ่งที่เชื่อมกันอยู่ คงจะไม่ถูกต้อง เพราะมันเหมือนกระโดดไปสอง step ใครก็ได้ กรุณาช่วยหาคำตอบให้ผมหน่อยนะครับ ขอบคุณล่วงหน้าครับ อุอุ
วิธีซ่อมคือ
$ git pull origin master
เป็นอันเสร็จพิธี
ถ้า push ก่อน แล้ว dcommit มันจะตรวจว่ามีการแก้ล่าสุดหรือเปล่า กรณี้นี้ ไม่มีการแก้ไขล่าสุด มันจะ reset refs/heads/master เป็นตัวเก่า เลยปกติ
เพราะฉะนั้น ก็ push ก่อน dcommit ละกัน
