1. คำแนะนำโดยละเอียดเกี่ยวกับ Git สำหรับผู้เริ่มต้น
วันนี้เราจะพูดถึงระบบควบคุมเวอร์ชันที่เรียกว่า Git
คุณไม่สามารถเป็นโปรแกรมเมอร์ที่เต็มเปี่ยมได้หากไม่รู้จักและเข้าใจเครื่องมือนี้ แน่นอน คุณไม่จำเป็นต้องเก็บคำสั่งและคุณลักษณะทั้งหมดของ Git ไว้ในหัวเพื่อที่จะใช้งานได้อย่างต่อเนื่อง คุณจำเป็นต้องรู้ชุดคำสั่งที่จะช่วยให้คุณเข้าใจทุกสิ่งที่เกิดขึ้น
พื้นฐาน Git
Git คือระบบควบคุมเวอร์ชันแบบกระจายสำหรับโค้ดของเรา ทำไมเราต้องการมัน? ทีมต้องการระบบบางอย่างในการจัดการงานของพวกเขา จำเป็นต้องติดตามการเปลี่ยนแปลงที่เกิดขึ้นเมื่อเวลาผ่านไป
นั่นคือเราต้องสามารถเห็นทีละขั้นตอนว่าไฟล์ใดมีการเปลี่ยนแปลงและอย่างไร นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อคุณตรวจสอบสิ่งที่เปลี่ยนแปลงในบริบทของงานเดียว ทำให้สามารถย้อนกลับการเปลี่ยนแปลงได้
ลองนึกภาพสถานการณ์ต่อไปนี้: เรามีโค้ดที่ใช้งานได้ ทุกอย่างในนั้นดี แต่จากนั้นเราตัดสินใจปรับปรุงหรือปรับแต่งบางอย่าง ไม่ใช่เรื่องใหญ่ แต่ "การปรับปรุง" ของเราได้ทำลายคุณลักษณะของโปรแกรมไปครึ่งหนึ่งและทำให้ไม่สามารถทำงานได้ แล้วตอนนี้ล่ะ? หากไม่มี Git คุณจะต้องนั่งครุ่นคิดอยู่หลายชั่วโมง พยายามจดจำว่าเดิมทีทุกอย่างเป็นอย่างไร แต่ด้วย Git เราเพียงแค่ย้อนกลับการคอมมิต — แค่นั้น
หรือจะเป็นอย่างไรหากมีนักพัฒนาสองคนทำการเปลี่ยนแปลงโค้ดของตนเองพร้อมกัน หากไม่มี Git ก็จะคัดลอกไฟล์โค้ดต้นฉบับและแก้ไขแยกกัน มีเวลาที่ทั้งคู่ต้องการเพิ่มการเปลี่ยนแปลงในไดเร็กทอรีหลัก คุณจะทำอย่างไรในกรณีนี้?
จะไม่มีปัญหาดังกล่าวหากคุณใช้ Git
การติดตั้ง Git
มาติดตั้ง Java บนคอมพิวเตอร์ของคุณกันเถอะ กระบวนการนี้แตกต่างกันเล็กน้อยสำหรับระบบปฏิบัติการที่แตกต่างกัน
การติดตั้งบน Windows
ตามปกติ คุณต้องดาวน์โหลดและเรียกใช้ไฟล์ exe ทุกอย่างง่ายที่นี่: คลิกที่ลิงค์แรกของ Googleทำการติดตั้ง เท่านี้ก็เรียบร้อย ในการทำเช่นนี้ เราจะใช้ bash Console ที่ Windows จัดเตรียมไว้ให้
ใน Windows คุณต้องเรียกใช้ Git Bash นี่คือลักษณะที่ปรากฏในเมนูเริ่ม:
![](https://cdn.codegym.cc/images/article/b99e1066-843c-42d1-98a8-41df931eb359/800.jpeg)
นี่คือพรอมต์คำสั่งที่คุณสามารถใช้งานได้
เพื่อหลีกเลี่ยงการต้องไปที่โฟลเดอร์ที่มีโปรเจ็กต์ทุกครั้งเพื่อเปิด Git ที่นั่น คุณสามารถเปิดพรอมต์คำสั่งในโฟลเดอร์โปรเจ็กต์ด้วยปุ่มเมาส์ขวาพร้อมพาธที่เราต้องการ:
![](https://cdn.codegym.cc/images/article/e368af6a-71d4-41d9-8824-f10512660bd1/800.jpeg)
การติดตั้งบน Linux
โดยปกติแล้ว Git จะเป็นส่วนหนึ่งของลีนุกซ์ดิสทริบิวชั่นและติดตั้งไว้แล้ว เนื่องจากมันเป็นเครื่องมือที่เดิมเขียนขึ้นสำหรับการพัฒนาเคอร์เนลของลินุกซ์ แต่มีบางสถานการณ์ที่ไม่เป็นเช่นนั้น ในการตรวจสอบ คุณต้องเปิดเทอร์มินัลแล้วเขียน: git --version หากคุณได้รับคำตอบที่เข้าใจได้ ก็ไม่จำเป็นต้องติดตั้งอะไร
เปิดเทอร์มินัลและติดตั้ง สำหรับ Ubuntu คุณต้องเขียน: sudo apt-get install git เท่านี้ก็เรียบร้อย ตอนนี้คุณสามารถใช้ Git ในเทอร์มินัลใดก็ได้
การติดตั้งบน macOS
ก่อนอื่นคุณต้องตรวจสอบว่ามี Git อยู่แล้วหรือไม่ (ดูด้านบนเหมือนกับบน Linux)
หากคุณยังไม่มี วิธีที่ง่ายที่สุดในการดาวน์โหลดคือดาวน์โหลดเวอร์ชันล่าสุด หากติดตั้ง Xcode แล้ว Git จะถูกติดตั้งโดยอัตโนมัติอย่างแน่นอน
การตั้งค่าคอมไพล์
Git มีการตั้งค่าผู้ใช้สำหรับผู้ใช้ที่จะส่งงาน สิ่งนี้สมเหตุสมผลและจำเป็น เนื่องจาก Git นำข้อมูลนี้ไปใช้ในฟิลด์ Author เมื่อมีการสร้างคอมมิต
ตั้งค่าชื่อผู้ใช้และรหัสผ่านสำหรับโครงการทั้งหมดของคุณโดยเรียกใช้คำสั่งต่อไปนี้:
หากคุณต้องการเปลี่ยนผู้เขียนสำหรับโครงการใดโครงการหนึ่ง (เช่น โครงการส่วนบุคคล) คุณสามารถลบ "--global" ได้ สิ่งนี้จะทำให้เราได้สิ่งต่อไปนี้:
ทฤษฎีเล็กน้อย
ในการดำดิ่งสู่หัวข้อนี้ เราควรแนะนำคุณเกี่ยวกับคำศัพท์และการกระทำใหม่ๆ สองสามคำ... มิฉะนั้นจะไม่มีอะไรให้พูดถึง แน่นอนว่านี่เป็นศัพท์แสงที่มาจากภาษาอังกฤษ ดังนั้นฉันจะเพิ่มคำแปลในวงเล็บ
คำพูดและการกระทำใด
- ที่เก็บคอมไพล์
- ให้สัญญา
- สาขา
- ผสาน
- ความขัดแย้ง
- ดึง
- ดัน
- วิธีละเว้นบางไฟล์ (.gitignore)
และอื่น ๆ
สถานะใน Git
Git มีรูปปั้นหลายอย่างที่ต้องเข้าใจและจดจำ:
- ไม่ได้ติดตาม
- แก้ไข
- จัดฉาก
- มุ่งมั่น
คุณควรเข้าใจเรื่องนี้อย่างไร?
นี่คือสถานะที่ใช้กับไฟล์ที่มีรหัสของเรา กล่าวอีกนัยหนึ่ง วงจรชีวิตของพวกมันมักจะมีลักษณะดังนี้:
- ไฟล์ที่สร้างขึ้นแต่ยังไม่ได้เพิ่มไปยังที่เก็บมีสถานะ "ไม่ถูกติดตาม"
- เมื่อเราทำการเปลี่ยนแปลงไฟล์ที่เพิ่มไปยังที่เก็บ Git แล้ว สถานะของไฟล์จะเป็น "แก้ไข"
- ในบรรดาไฟล์ที่เราเปลี่ยนแปลง เราเลือกไฟล์ที่เราต้องการ (เช่น เราไม่ต้องการคลาสที่คอมไพล์แล้ว) และคลาสเหล่านี้จะเปลี่ยนเป็นสถานะ "จัดฉาก"
- การคอมมิตถูกสร้างขึ้นจากไฟล์ที่เตรียมไว้ในสถานะสเตจและไปที่ที่เก็บ Git หลังจากนั้น จะไม่มีไฟล์ที่มีสถานะ "จัดฉาก" แต่อาจมีไฟล์ที่มีสถานะ "แก้ไข"
นี่คือลักษณะ:
![](https://cdn.codegym.cc/images/article/1bae5457-4d7d-40b4-b2d0-7aa55ecc3c13/512.jpeg)
คอมมิตคืออะไร?
คอมมิชชันเป็นเหตุการณ์หลักเมื่อพูดถึงการควบคุมเวอร์ชัน ประกอบด้วยการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นตั้งแต่การคอมมิตเริ่มต้นขึ้น คอมมิชชันจะเชื่อมโยงเข้าด้วยกันเหมือนรายการที่เชื่อมโยงรายการเดียว
โดยเฉพาะอย่างยิ่ง มีการกระทำครั้งแรก เมื่อคอมมิทที่สองถูกสร้างขึ้น มัน (อันที่สอง) จะรู้ว่าอะไรจะเกิดขึ้นหลังจากอันแรก และในลักษณะนี้สามารถติดตามข้อมูลได้
นอกจากนี้ การคอมมิตยังมีข้อมูลของตัวเองอีกด้วย ซึ่งเรียกว่าข้อมูลเมตา:
- ตัวระบุเฉพาะของคอมมิชชัน ซึ่งสามารถใช้ค้นหาได้
- ชื่อของผู้เขียนคอมมิท ผู้สร้างมันขึ้นมา
- วันที่สร้างคอมมิท
- ความคิดเห็นที่อธิบายถึงสิ่งที่ทำระหว่างการกระทำ
นี่คือลักษณะ:
![](https://cdn.codegym.cc/images/article/d3a9c778-0590-4669-abe7-1c1be88eebae/512.jpeg)
สาขาคืออะไร?
![](https://cdn.codegym.cc/images/article/86022f61-9bca-4fe5-9af6-e77cad628b2a/512.jpeg)
สาขาเป็นตัวชี้ไปยังการกระทำบางอย่าง เนื่องจากการคอมมิตรู้ว่าคอมมิชชันใดอยู่ก่อนหน้า เมื่อสาขาชี้ไปที่คอมมิชชัน คอมมิชชันก่อนหน้านี้ทั้งหมดจะมีผลกับคอมมิตนั้นด้วย
ดังนั้น เราสามารถพูดได้ว่าคุณสามารถมีสาขาได้มากเท่าที่คุณต้องการโดยชี้ไปที่การกระทำเดียวกัน
งานเกิดขึ้นในสาขา ดังนั้นเมื่อมีการสร้างคอมมิชชันใหม่ สาขาจะย้ายตัวชี้ไปยังคอมมิชชันล่าสุด
เริ่มต้นใช้งาน Git
คุณสามารถทำงานกับที่เก็บข้อมูลในเครื่องเพียงอย่างเดียวเช่นเดียวกับรีโมต
หากต้องการฝึกใช้คำสั่งที่จำเป็น คุณสามารถจำกัดตัวเองไว้ที่ที่เก็บในเครื่อง โดยจะเก็บข้อมูลทั้งหมดของโครงการไว้ในโฟลเดอร์ .git เท่านั้น
หากเรากำลังพูดถึงพื้นที่เก็บข้อมูลระยะไกล ข้อมูลทั้งหมดจะถูกเก็บไว้ที่ใดที่หนึ่งบนเซิร์ฟเวอร์ระยะไกล: เฉพาะสำเนาของโครงการเท่านั้นที่จัดเก็บไว้ในเครื่อง การเปลี่ยนแปลงที่ทำกับสำเนาในเครื่องของคุณสามารถพุช (git push) ไปยังที่เก็บระยะไกลได้
ในการสนทนาของเราที่นี่และด้านล่าง เรากำลังพูดถึงการทำงานกับ Git ในคอนโซล แน่นอน คุณสามารถใช้โซลูชันที่ใช้ GUI บางประเภทได้ (เช่น IntelliJ IDEA) แต่ก่อนอื่น คุณควรทราบก่อนว่าคำสั่งใดถูกเรียกใช้งานและความหมายของคำสั่งเหล่านั้น
ทำงานกับ Git ในที่เก็บในเครื่อง
ในการสร้างที่เก็บในเครื่อง คุณต้องเขียน:
![](https://cdn.codegym.cc/images/article/1b966c96-94e4-4457-a206-2aab492e5c45/800.jpeg)
สิ่งนี้จะสร้างโฟลเดอร์ .git ที่ซ่อนอยู่ในไดเร็กทอรีปัจจุบันของคอนโซล
โฟลเดอร์ .git เก็บข้อมูลทั้งหมดเกี่ยวกับที่เก็บ Git อย่าลบนะ ;)
ถัดไป ไฟล์จะถูกเพิ่มในโครงการ และกำหนดสถานะเป็น "Untracked" หากต้องการตรวจสอบสถานะปัจจุบันของงานของคุณ ให้เขียนสิ่งนี้:
![](https://cdn.codegym.cc/images/article/84d7d32f-0b38-48e4-b314-bcfe863ed6c1/800.jpeg)
เราอยู่ในสาขาหลัก และเราจะอยู่ที่นี่จนกว่าเราจะเปลี่ยนไปใช้สาขาอื่น
นี่แสดงว่าไฟล์ใดมีการเปลี่ยนแปลงแต่ยังไม่ได้เพิ่มในสถานะ "staged" หากต้องการเพิ่มลงในสถานะ "จัดฉาก" คุณต้องเขียน "git add" เรามีตัวเลือกบางอย่างที่นี่ เช่น:
- git add -A — เพิ่มไฟล์ทั้งหมดในสถานะ "staged"
- คอมไพล์เพิ่ม . — เพิ่มไฟล์ทั้งหมดจากโฟลเดอร์นี้และโฟลเดอร์ย่อยทั้งหมด โดยพื้นฐานแล้วเหมือนกับก่อนหน้านี้
- git add <file name> — เพิ่มไฟล์ที่ต้องการ ที่นี่คุณสามารถใช้นิพจน์ทั่วไปเพื่อเพิ่มไฟล์ตามรูปแบบบางอย่างได้ ตัวอย่างเช่น git add *.java: หมายความว่าคุณต้องการเพิ่มไฟล์ที่มีนามสกุล java เท่านั้น
สองตัวเลือกแรกนั้นง่ายอย่างชัดเจน สิ่งที่น่าสนใจยิ่งขึ้นด้วยการเพิ่มล่าสุด ดังนั้นมาเขียน:
ในการตรวจสอบสถานะเราใช้คำสั่งที่เรารู้จักแล้ว:
![](https://cdn.codegym.cc/images/article/97edaa45-bf20-4b81-8351-3f9fef5a7f7d/800.jpeg)
ที่นี่คุณจะเห็นว่านิพจน์ทั่วไปทำงานได้อย่างถูกต้อง: ขณะนี้ test_resource.txt มีสถานะเป็น "staged"
และสุดท้าย ขั้นตอนสุดท้ายสำหรับการทำงานกับที่เก็บในเครื่อง (ยังมีอีกขั้นตอนหนึ่งเมื่อทำงานกับที่เก็บระยะไกล ;)) — การสร้างคอมมิชชันใหม่:
![](https://cdn.codegym.cc/images/article/e9cdc244-b44b-4cc7-b0ee-b5d6d9e20f9f/800.jpeg)
ถัดไปเป็นคำสั่งที่ดีสำหรับการดูประวัติการกระทำในสาขา มาใช้ประโยชน์จากมันกันเถอะ:
![](https://cdn.codegym.cc/images/article/7fbf41ba-ae17-4e11-b2a8-0cd68b6b9ba0/800.jpeg)
ที่นี่คุณจะเห็นว่าเราได้สร้างคอมมิชชันแรกของเราและรวมถึงข้อความที่เราให้ไว้ในบรรทัดคำสั่ง สิ่งสำคัญคือต้องเข้าใจว่าข้อความนี้ควรอธิบายอย่างถูกต้องที่สุดเท่าที่จะเป็นไปได้ว่าได้ทำอะไรไประหว่างการกระทำนี้ สิ่งนี้จะช่วยเราได้หลายครั้งในอนาคต
ผู้อ่านที่อยากรู้อยากเห็นที่ยังไม่หลับอาจสงสัยว่าเกิดอะไรขึ้นกับไฟล์ GitTest.java มาดูกันตอนนี้ ในการทำเช่นนี้ เราใช้:
![](https://cdn.codegym.cc/images/article/5169fe2f-0e70-422a-b81a-381a2bee1217/800.jpeg)
อย่างที่คุณเห็น มันยังคง "ไม่ถูกติดตาม" และกำลังรออยู่ในปีก แต่ถ้าเราไม่ต้องการเพิ่มในโครงการเลยล่ะ บางครั้งก็เกิดขึ้น
เพื่อให้สิ่งต่าง ๆ น่าสนใจยิ่งขึ้น มาลองเปลี่ยนไฟล์ test_resource.txt กัน มาเพิ่มข้อความที่นั่นและตรวจสอบสถานะ:
![](https://cdn.codegym.cc/images/article/5ae28510-9fd2-4d9a-8c91-b1fe1d8ccf90/800.jpeg)
ที่นี่ คุณจะเห็นความแตกต่างระหว่างสถานะ "ไม่ได้ติดตาม" และ "แก้ไข" ได้อย่างชัดเจน
GitTest.java เป็น "ไม่ได้ติดตาม" ในขณะที่ test_resource.txt เป็น "แก้ไข"
ตอนนี้เรามีไฟล์ในสถานะแก้ไขแล้ว เราสามารถตรวจสอบการเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์เหล่านั้นได้ สามารถทำได้โดยใช้คำสั่งต่อไปนี้:
![](https://cdn.codegym.cc/images/article/a33326e3-9f91-4c9d-b90f-88fb3484528c/800.jpeg)
นั่นคือคุณสามารถเห็นสิ่งที่ฉันเพิ่มลงในไฟล์ข้อความของเราได้อย่างชัดเจนที่นี่: สวัสดีชาวโลก!
มาเพิ่มการเปลี่ยนแปลงของเราในไฟล์ข้อความและสร้างคอมมิท:
หากต้องการดูคอมมิชชันทั้งหมด ให้เขียน:
![](https://cdn.codegym.cc/images/article/d4f5620e-b416-4284-bb74-e3f9ad498a62/800.jpeg)
อย่างที่คุณเห็น ตอนนี้เรามีสองคอมมิชชัน
เราจะเพิ่ม GitTest.java ด้วยวิธีเดียวกัน ไม่มีความคิดเห็นที่นี่ เพียงคำสั่ง:
![](https://cdn.codegym.cc/images/article/ba4eafbb-bb4b-4ea3-9e37-f0e86308baeb/800.jpeg)
ทำงานกับ .gitignore
เห็นได้ชัดว่าเราต้องการเก็บซอร์สโค้ดเพียงอย่างเดียวและไม่ต้องการอย่างอื่นในที่เก็บข้อมูล แล้วจะมีอะไรอีก? อย่างน้อยที่สุด คอมไพล์คลาสและ/หรือไฟล์ที่สร้างโดยสภาพแวดล้อมการพัฒนา
ในการบอกให้ Git เพิกเฉย เราต้องสร้างไฟล์พิเศษ ทำสิ่งนี้: สร้างไฟล์ชื่อ .gitignore ในรูทของโปรเจ็กต์ แต่ละบรรทัดในไฟล์นี้แสดงถึงรูปแบบที่จะละเว้น
ในตัวอย่างนี้ ไฟล์ .gitignore จะมีลักษณะดังนี้:
เป้าหมาย/
*.iml
.idea/
ลองดู:
- บรรทัดแรกคือการละเว้นไฟล์ทั้งหมดที่มีนามสกุล .class
- บรรทัดที่สองคือการละเว้นโฟลเดอร์ "เป้าหมาย" และทุกอย่างที่อยู่ในนั้น
- บรรทัดที่สามคือการละเว้นไฟล์ทั้งหมดที่มีนามสกุล .iml
- บรรทัดที่สี่คือการละเว้นโฟลเดอร์ .idea
ลองใช้ตัวอย่างกัน หากต้องการดูวิธีการทำงาน ให้เพิ่ม GitTest.class ที่คอมไพล์แล้วลงในโปรเจ็กต์และตรวจสอบสถานะโปรเจ็กต์:
![](https://cdn.codegym.cc/images/article/2332f40d-82bf-4578-9905-3a59bc68c2ca/800.jpeg)
เห็นได้ชัดว่าเราไม่ต้องการเพิ่มคลาสที่คอมไพล์แล้วในโครงการโดยไม่ตั้งใจ (โดยใช้ git add -A) ในการทำเช่นนี้ ให้สร้างไฟล์ .gitignore และเพิ่มทุกอย่างที่อธิบายไว้ก่อนหน้านี้:
![](https://cdn.codegym.cc/images/article/27f06471-d0a9-4cec-8eac-423c63ab2a2b/800.jpeg)
ตอนนี้ให้ใช้การยืนยันเพื่อเพิ่มไฟล์ .gitignore ในโครงการ:
และตอนนี้เป็นช่วงเวลาแห่งความจริง: เรามีคลาส GitTest.class ที่คอมไพล์แล้วซึ่ง "ไม่ติดตาม" ซึ่งเราไม่ต้องการเพิ่มในที่เก็บ Git
ตอนนี้เราควรเห็นผลกระทบของไฟล์ .gitignore:
![](https://cdn.codegym.cc/images/article/27531cd0-8316-4692-89f2-a35df55c436d/800.jpeg)
สมบูรณ์แบบ! .gitignore +1 :)
ทำงานกับสาขา
โดยปกติแล้ว การทำงานในสาขาเดียวนั้นไม่สะดวกสำหรับนักพัฒนาคนเดียว และเป็นไปไม่ได้เมื่อมีมากกว่าหนึ่งคนในทีม นี่คือเหตุผลที่เรามีสาขา
สาขาเป็นเพียงตัวชี้ที่เคลื่อนย้ายได้เพื่อกระทำ
ในส่วนนี้ เราจะสำรวจการทำงานในสาขาต่างๆ: วิธีผสานการเปลี่ยนแปลงจากสาขาหนึ่งไปยังอีกสาขาหนึ่ง ความขัดแย้งที่อาจเกิดขึ้น และอื่นๆ อีกมากมาย
หากต้องการดูรายชื่อสาขาทั้งหมดในที่เก็บและเข้าใจว่าคุณอยู่สาขาใด คุณต้องเขียน:
![](https://cdn.codegym.cc/images/article/8ce8198b-3020-4c86-bc02-848427291a0f/800.jpeg)
คุณจะเห็นว่าเรามีสาขาหลักเพียงแห่งเดียว เครื่องหมายดอกจันข้างหน้าแสดงว่าเราอยู่ในนั้น คุณยังสามารถใช้คำสั่ง "git status" เพื่อดูว่าเราอยู่ในสาขาใด
จากนั้นมีตัวเลือกมากมายสำหรับการสร้างสาขา (อาจมีมากกว่านี้ — นี่คือตัวเลือกที่ฉันใช้):
- สร้างสาขาใหม่ตามสาขาที่เราอยู่ (99% ของกรณี)
- สร้างสาขาตามการกระทำเฉพาะ (1% ของกรณี)
มาสร้างสาขาตามการกระทำเฉพาะ
เราจะใช้ตัวระบุเฉพาะของการกระทำ เพื่อค้นหาเราเขียน:
![](https://cdn.codegym.cc/images/article/9bd03635-859b-423a-b13e-39cadb6cd492/800.jpeg)
เราได้เน้นการกระทำด้วยความคิดเห็น "เพิ่มสวัสดีชาวโลก..." ตัวระบุเฉพาะของมันคือ 6c44e53d06228f888f2f454d3cb8c1c976dd73f8 เราต้องการสร้างสาขา "การพัฒนา" ที่เริ่มต้นจากการกระทำนี้ ในการทำเช่นนี้ เราเขียน:
สาขาถูกสร้างขึ้นโดยมีเพียงสองรายการแรกจากสาขาหลัก ในการตรวจสอบสิ่งนี้ ขั้นแรกเราต้องแน่ใจว่าได้เปลี่ยนไปใช้สาขาอื่นแล้วดูจำนวนคอมมิชชันที่นั่น:
![](https://cdn.codegym.cc/images/article/10717a93-669c-4a24-95c2-4db2a3c2483b/800.jpeg)
และตามที่คาดไว้ เรามีสองคอมมิชชัน อย่างไรก็ตาม ประเด็นที่น่าสนใจก็คือ ยังไม่มีไฟล์ .gitignore ในสาขานี้ ดังนั้นไฟล์ที่คอมไพล์แล้ว (GitTest.class) จึงถูกเน้นด้วยสถานะ "ไม่ติดตาม"
ตอนนี้เราสามารถตรวจสอบสาขาของเราอีกครั้งโดยเขียนสิ่งนี้:
![](https://cdn.codegym.cc/images/article/43b973d9-f6a4-4bc2-a053-87db5995be1b/800.jpeg)
คุณจะเห็นว่ามีสองสาขา: "ต้นแบบ" และ "การพัฒนา" ขณะนี้เรากำลังอยู่ในระหว่างการพัฒนา
มาสร้างสาขาตามสาขาปัจจุบันกันเถอะ
วิธีที่สองในการสร้างสาขาคือสร้างจากสาขาอื่น เราต้องการสร้างสาขาตามสาขาหลัก ขั้นแรก เราต้องเปลี่ยนไปใช้มัน และขั้นตอนต่อไปคือการสร้างใหม่ ลองดู:
- git checkout master — เปลี่ยนเป็นสาขาหลัก
- git status — ยืนยันว่าเราอยู่ใน master branch จริงๆ
![](https://cdn.codegym.cc/images/article/0ea5f721-9a07-4944-a7f2-7d587e1219c5/800.jpeg)
ที่นี่คุณจะเห็นว่าเราเปลี่ยนไปใช้สาขาหลัก ไฟล์ .gitignore มีผลบังคับใช้ และคลาสที่คอมไพล์แล้วจะไม่เน้นเป็น "untracked" อีกต่อไป
ตอนนี้เราสร้างสาขาใหม่ตามสาขาหลัก:
![](https://cdn.codegym.cc/images/article/d97d1c17-b3fe-47a2-8807-52f053b4206b/800.jpeg)
หากคุณไม่แน่ใจว่าสาขานี้เหมือนกับ "master" หรือไม่ คุณสามารถตรวจสอบได้ง่ายๆ โดยดำเนินการ "git log" และดูที่คอมมิชชันทั้งหมด ควรมีสี่คน
แก้ปัญหาความขัดแย้ง
ก่อนที่เราจะสำรวจว่าความขัดแย้งคืออะไร เราต้องพูดถึงการรวมสาขาหนึ่งเข้ากับอีกสาขาหนึ่ง
ภาพนี้แสดงขั้นตอนการรวมสาขาหนึ่งเข้ากับอีกสาขาหนึ่ง:
![](https://cdn.codegym.cc/images/article/b87da9da-ca0d-4273-a9e2-662efcf4acc2/512.jpeg)
ที่นี่เรามีสาขาหลัก ในบางจุด สาขารองจะถูกสร้างขึ้นจากสาขาหลักและแก้ไขแล้ว เมื่อทำงานเสร็จแล้ว เราต้องรวมสาขาหนึ่งเข้ากับอีกสาขาหนึ่ง
ในตัวอย่างของเรา เราได้สร้างสาขาของฟีเจอร์/อัพเดต-txt-ไฟล์ ตามชื่อสาขา เรากำลังปรับปรุงข้อความ
![](https://cdn.codegym.cc/images/article/433b626f-155e-48a3-b2cc-f54a4ee6db47/800.jpeg)
ตอนนี้เราต้องสร้างคอมมิชชันใหม่สำหรับงานนี้:
![](https://cdn.codegym.cc/images/article/82072317-e44a-4dd9-8f89-1079181006bb/800.jpeg)
ตอนนี้ หากเราต้องการรวมสาขาของ feature/update-txt-files เข้ากับ master เราต้องไปที่ master และเขียน "git merge feature/update-txt-files":
![](https://cdn.codegym.cc/images/article/6dba57d4-87f1-46bf-82b6-8d2bb650ab65/800.jpeg)
ด้วยเหตุนี้ มาสเตอร์แบรนช์จึงมีคอมมิชชันที่เพิ่มไปยังไฟล์ฟีเจอร์/อัปเดต-txt-
ฟังก์ชันนี้ถูกเพิ่มเข้ามา คุณจึงสามารถลบฟีเจอร์สาขาได้ ในการทำเช่นนี้ เราเขียน:
มาทำให้สถานการณ์ซับซ้อนขึ้น: ตอนนี้สมมติว่าคุณต้องเปลี่ยนไฟล์ txt อีกครั้ง แต่ตอนนี้ไฟล์นี้จะถูกเปลี่ยนในสาขาหลักเช่นกัน กล่าวอีกนัยหนึ่งก็จะเปลี่ยนขนานกันไป Git จะไม่สามารถทราบได้ว่าต้องทำอย่างไรเมื่อเราต้องการรวมรหัสใหม่ของเราเข้ากับสาขาหลัก
เราจะสร้างสาขาใหม่ตามต้นแบบ ทำการเปลี่ยนแปลง text_resource.txt และสร้างการคอมมิตสำหรับงานนี้:
... เราทำการเปลี่ยนแปลงไฟล์
![](https://cdn.codegym.cc/images/article/ea8e0c09-182f-433d-b78d-75b454450bf3/800.jpeg)
![](https://cdn.codegym.cc/images/article/3a34c7df-6d0f-462e-b8bc-0df6905184d4/800.jpeg)
ไปที่สาขาหลักและอัปเดตไฟล์ข้อความนี้ในบรรทัดเดียวกับในสาขาคุณลักษณะ:
… เราอัปเดต test_resource.txt
![](https://cdn.codegym.cc/images/article/00ec4058-b488-41b1-b1d9-7617c744dd48/800.jpeg)
และตอนนี้จุดที่น่าสนใจที่สุด: เราจำเป็นต้องรวมการเปลี่ยนแปลงจากสาขาคุณลักษณะ/ส่วนหัวของส่วนเสริมเข้ากับต้นแบบ เราอยู่ในสาขาหลัก ดังนั้นเราต้องเขียน:
แต่ผลลัพธ์จะขัดแย้งกันในไฟล์ test_resource.txt:
![](https://cdn.codegym.cc/images/article/2a035c91-af85-4660-871b-40e0d2960d6d/800.jpeg)
ที่นี่เราจะเห็นว่า Git ไม่สามารถตัดสินใจได้เองว่าจะรวมรหัสนี้อย่างไร มันบอกเราว่าเราต้องแก้ไขข้อขัดแย้งก่อน แล้วจึงดำเนินการกระทำเท่านั้น
ตกลง. เราเปิดไฟล์ที่มีข้อขัดแย้งในโปรแกรมแก้ไขข้อความและดู:
![](https://cdn.codegym.cc/images/article/f8a71988-c82d-4b6d-9861-38558a7c7eef/800.jpeg)
เพื่อทำความเข้าใจว่า Git ทำอะไรที่นี่ เราต้องจำการเปลี่ยนแปลงที่เราทำและที่ แล้วเปรียบเทียบ:
- การเปลี่ยนแปลงที่อยู่ในบรรทัดนี้ในสาขาหลักจะอยู่ระหว่าง "<<<<<<< HEAD" และ "======="
- การเปลี่ยนแปลงที่อยู่ในสาขาคุณลักษณะ/ส่วนเพิ่มส่วนหัวอยู่ระหว่าง "=======" และ ">>>>>>> คุณลักษณะ/ส่วนเพิ่มส่วนหัว"
นี่คือวิธีที่ Git บอกเราว่าไม่สามารถหาวิธีผสานที่ตำแหน่งนี้ในไฟล์ได้ แบ่งส่วนนี้ออกเป็นสองส่วนจากสาขาต่างๆ และเชื้อเชิญให้เราแก้ไขข้อขัดแย้งในการผสานด้วยตนเอง
ยุติธรรมเพียงพอ ฉันตัดสินใจลบทุกอย่างอย่างกล้าหาญเหลือเพียงคำว่า "ส่วนหัว":
![](https://cdn.codegym.cc/images/article/97bb4eb6-47eb-4017-a9d2-ac6dec7a5fe2/800.jpeg)
มาดูสถานะของการเปลี่ยนแปลงกัน คำอธิบายจะแตกต่างกันเล็กน้อย แทนที่จะเป็นสถานะ "แก้ไข" เรามี "ยกเลิกการรวม" เราจะพูดถึงสถานะที่ห้าได้ไหม? ฉันไม่คิดว่านี่เป็นสิ่งจำเป็น มาดูกัน:
![](https://cdn.codegym.cc/images/article/bbcca912-c5d6-4043-bb5a-8f9cfe5f893e/800.jpeg)
เราสามารถโน้มน้าวตนเองได้ว่านี่เป็นกรณีพิเศษและไม่ธรรมดา ดำเนินการต่อ:
![](https://cdn.codegym.cc/images/article/3d5ae004-f402-41bb-b677-f2d63aad1db8/800.jpeg)
คุณอาจสังเกตเห็นว่าคำอธิบายแนะนำให้เขียนเฉพาะ "git commit" มาลองเขียนว่า:
![](https://cdn.codegym.cc/images/article/73595e92-6b14-4d4c-936c-1e232045a0c9/800.jpeg)
และเช่นเดียวกับที่เราทำได้ เราแก้ไขข้อขัดแย้งในคอนโซล
แน่นอนว่าสิ่งนี้สามารถทำได้ง่ายขึ้นเล็กน้อยในสภาพแวดล้อมการพัฒนาแบบบูรณาการ ตัวอย่างเช่น ใน IntelliJ IDEA ทุกอย่างได้รับการตั้งค่าอย่างดีเพื่อให้คุณสามารถดำเนินการที่จำเป็นทั้งหมดได้ภายในนั้น แต่ IDE ทำสิ่งต่างๆ มากมาย "ภายใต้ประทุน" และเรามักไม่เข้าใจว่าเกิดอะไรขึ้นที่นั่น และเมื่อขาดความเข้าใจก็จะเกิดปัญหาขึ้นได้
การทำงานกับที่เก็บข้อมูลระยะไกล
ขั้นตอนสุดท้ายคือการหาคำสั่งเพิ่มเติมที่จำเป็นสำหรับการทำงานกับที่เก็บระยะไกล
ดังที่ฉันได้กล่าวไปแล้ว พื้นที่เก็บข้อมูลระยะไกลเป็นสถานที่ที่จัดเก็บพื้นที่เก็บข้อมูลและคุณสามารถโคลนได้
มีที่เก็บข้อมูลระยะไกลประเภทใดบ้าง ตัวอย่าง:
- GitHub เป็นแพลตฟอร์มการจัดเก็บข้อมูลที่ใหญ่ที่สุดสำหรับพื้นที่เก็บข้อมูลและการพัฒนาร่วมกัน
- GitLab เป็นเครื่องมือบนเว็บสำหรับวงจรชีวิตของ DevOps ด้วยโอเพ่นซอร์ส เป็นระบบที่ใช้ Git สำหรับจัดการที่เก็บโค้ดด้วย wiki, ระบบติดตามบั๊ก, ไปป์ไลน์ CI/CD และฟังก์ชันอื่นๆ
- BitBucket เป็นบริการเว็บสำหรับการโฮสต์โครงการและการพัฒนาร่วมกันโดยใช้ระบบควบคุมเวอร์ชันของ Mercurial และ Git ครั้งหนึ่งมันมีข้อได้เปรียบเหนือ GitHub ตรงที่ให้พื้นที่เก็บข้อมูลส่วนตัวฟรี ปีที่แล้ว GitHub ยังแนะนำความสามารถนี้ให้กับทุกคนฟรี
- และอื่น ๆ ...
เมื่อทำงานกับที่เก็บระยะไกล สิ่งแรกที่ต้องทำคือโคลนโครงการไปยังที่เก็บในเครื่องของคุณ
สำหรับสิ่งนี้ เราได้ส่งออกโครงการที่เราสร้างขึ้นในเครื่อง ตอนนี้ทุกคนสามารถโคลนมันด้วยตัวเองโดยเขียน:
ขณะนี้มีสำเนาที่สมบูรณ์ของโครงการในเครื่องแล้ว เพื่อให้แน่ใจว่าสำเนาของโปรเจ็กต์ในเครื่องเป็นเวอร์ชันล่าสุด คุณต้องดึงโปรเจ็กต์โดยเขียน:
![](https://cdn.codegym.cc/images/article/8c67c8bb-1a56-4ff2-bdee-78396d2472fb/800.jpeg)
ในกรณีของเรา ไม่มีอะไรเปลี่ยนแปลงในรีโมต repository ในปัจจุบัน ดังนั้นคำตอบคือ: อัปเดตแล้ว
แต่ถ้าเราทำการเปลี่ยนแปลงใด ๆ กับรีโมต repository รีโมต repository นั้นจะถูกอัพเดตหลังจากที่เราดึงมา
และสุดท้าย คำสั่งสุดท้ายคือการพุชข้อมูลไปยังที่เก็บระยะไกล เมื่อเราทำบางอย่างในเครื่องแล้วและต้องการส่งไปยังที่เก็บระยะไกล เราต้องสร้างคอมมิชชันใหม่ภายในเครื่องก่อน เพื่อแสดงสิ่งนี้ ลองเพิ่มสิ่งอื่นในไฟล์ข้อความของเรา:
![](https://cdn.codegym.cc/images/article/e8baa1a1-915f-4476-93b4-8012cd2994ff/800.jpeg)
ตอนนี้ค่อนข้างเป็นเรื่องธรรมดาสำหรับเรา - เราสร้างความมุ่งมั่นสำหรับงานนี้:
คำสั่งเพื่อส่งสิ่งนี้ไปยังที่เก็บระยะไกลคือ:
แค่นี้ก่อน!
ลิงค์ที่มีประโยชน์ |
---|
|
2. วิธีการทำงานกับ Git ใน IntelliJ IDEA
ในส่วนนี้ คุณจะได้เรียนรู้วิธีการทำงานกับ Git ใน IntelliJ IDEA
อินพุตที่จำเป็น:
- อ่าน ทำตาม และทำความเข้าใจในส่วนที่แล้ว สิ่งนี้จะช่วยให้แน่ใจว่าทุกอย่างถูกตั้งค่าและพร้อมใช้งาน
- ติดตั้ง IntelliJ IDEA ทุกอย่างควรจะเป็นระเบียบที่นี่ :)
- จัดสรรเวลาหนึ่งชั่วโมงเพื่อให้ได้ความเชี่ยวชาญที่สมบูรณ์
มาทำงานกับโครงการสาธิตที่ฉันใช้สำหรับบทความเกี่ยวกับ Git
โคลนโครงการในเครื่อง
มีสองตัวเลือกที่นี่:
- หากคุณมีบัญชี GitHub อยู่แล้วและต้องการผลักดันบางอย่างในภายหลัง จะเป็นการดีกว่าที่จะแยกโครงการและคัดลอกสำเนาของคุณเอง คุณสามารถอ่านเกี่ยวกับวิธีสร้างส้อมได้ในบทความอื่นภายใต้หัวข้อตัวอย่างของเวิร์กโฟลว์การฟอร์ก
- โคลนพื้นที่เก็บข้อมูลและทำทุกอย่างในเครื่องโดยไม่ต้องพุชสิ่งทั้งหมดไปยังเซิร์ฟเวอร์
ในการโคลนโครงการจาก GitHub คุณต้องคัดลอกลิงก์โครงการและส่งต่อไปยัง IntelliJ IDEA:
-
คัดลอกที่อยู่โครงการ:
-
เปิด IntelliJ IDEA แล้วเลือก "รับจากการควบคุมเวอร์ชัน":
-
คัดลอกและวางที่อยู่โครงการ:
-
คุณจะได้รับแจ้งให้สร้างโครงการ IntelliJ IDEA ยอมรับข้อเสนอ:
-
เนื่องจากไม่มีระบบการสร้าง เราจึงเลือก "สร้างโครงการจากแหล่งที่มาที่มีอยู่":
-
ถัดไปคุณจะเห็นหน้าจอที่สวยงามนี้:
ตอนนี้เราทราบเรื่องการโคลนนิ่งแล้ว คุณสามารถดูรอบๆ ได้
ดูครั้งแรกที่ IntelliJ IDEA ในฐานะ Git UI
ลองดูโปรเจ็กต์โคลนให้ละเอียดยิ่งขึ้น: คุณสามารถรับข้อมูลมากมายเกี่ยวกับระบบควบคุมเวอร์ชันได้แล้ว
ขั้นแรก เรามีบานหน้าต่างการควบคุมเวอร์ชันที่มุมล่างซ้าย ที่นี่คุณสามารถค้นหาการเปลี่ยนแปลงในเครื่องทั้งหมดและรับรายการคอมมิชชัน (คล้ายกับ "git log")
ไปที่การสนทนาของ Log กันเถอะ มีการสร้างภาพข้อมูลบางอย่างที่ช่วยให้เราเข้าใจว่าการพัฒนาดำเนินไปอย่างไร ตัวอย่างเช่น คุณจะเห็นว่ามีการสร้างสาขาใหม่โดยเพิ่มส่วนหัวลงใน txt commit ซึ่งต่อมาจะรวมเข้ากับสาขาหลัก หากคุณคลิกที่คอมมิต คุณจะเห็นข้อมูลทั้งหมดเกี่ยวกับการคอมมิตที่มุมขวา: การเปลี่ยนแปลงและข้อมูลเมตาทั้งหมด
![](https://cdn.codegym.cc/images/article/5338d3df-792f-4ed8-8f56-f1932d3d0577/1024.jpeg)
นอกจากนี้ยังสามารถเห็นการเปลี่ยนแปลงที่เกิดขึ้นจริง เรายังเห็นว่าความขัดแย้งได้รับการแก้ไขที่นั่น IDEA ก็นำเสนอเรื่องนี้ได้เป็นอย่างดี
หากคุณดับเบิลคลิกที่ไฟล์ที่มีการเปลี่ยนแปลงระหว่างการคอมมิตนี้ เราจะดูว่าข้อขัดแย้งได้รับการแก้ไขอย่างไร:
![](https://cdn.codegym.cc/images/article/782af919-8aea-4bc1-8980-97fe6b5d7ed5/1024.jpeg)
เราทราบว่าทางด้านซ้ายและด้านขวาเรามีไฟล์เดียวกันสองเวอร์ชันซึ่งจำเป็นต้องรวมเป็นไฟล์เดียว และตรงกลาง เราได้ผลการรวมสุดท้าย
เมื่อโครงการมีสาขา คอมมิชชัน และผู้ใช้จำนวนมาก คุณต้องค้นหาแยกกันตามสาขา ผู้ใช้ และวันที่:
![](https://cdn.codegym.cc/images/article/14a82cc6-c0cc-4154-89ba-6420b9ea63a1/1024.jpeg)
ก่อนเริ่มต้นควรอธิบายวิธีทำความเข้าใจว่าเราอยู่ในสาขาใด
ที่มุมขวาล่าง มีปุ่ม "Git: master" สิ่งที่ตามมา "Git:" คือสาขาปัจจุบัน หากคุณคลิกปุ่ม คุณจะสามารถทำสิ่งที่มีประโยชน์ได้มากมาย: เปลี่ยนไปใช้สาขาอื่น สร้างสาขาใหม่ เปลี่ยนชื่อสาขาที่มีอยู่ และอื่นๆ
![](https://cdn.codegym.cc/images/article/df1b2a92-8ab0-4e59-9a69-04c502b040e8/1024.jpeg)
การทำงานกับที่เก็บข้อมูล
ปุ่มลัดที่มีประโยชน์
สำหรับงานในอนาคต คุณต้องจำปุ่มลัดที่มีประโยชน์มากสองสามตัว:
- CTRL+T — รับการเปลี่ยนแปลงล่าสุดจากที่เก็บระยะไกล (git pull)
- CTRL+K — สร้างคอมมิชชัน / ดูการเปลี่ยนแปลงปัจจุบันทั้งหมด ซึ่งรวมถึงไฟล์ที่ไม่ได้ติดตามและแก้ไข (คอมไพล์คอมไพล์)
- CTRL+SHIFT+K — นี่คือคำสั่งสำหรับการพุชการเปลี่ยนแปลงไปยังที่เก็บระยะไกล คอมมิชชันทั้งหมดที่สร้างขึ้นในเครื่องและยังไม่ได้อยู่ในที่เก็บระยะไกลจะถูกพุช (git push)
- ALT+CTRL+Z — ย้อนกลับการเปลี่ยนแปลงในไฟล์ที่ระบุเป็นสถานะของการกระทำล่าสุดที่สร้างขึ้นในพื้นที่เก็บข้อมูลในเครื่อง หากคุณเลือกทั้งโครงการที่มุมซ้ายบน คุณสามารถย้อนกลับการเปลี่ยนแปลงในไฟล์ทั้งหมดได้
เราต้องการอะไร
เพื่อให้งานสำเร็จ เราจำเป็นต้องเชี่ยวชาญสถานการณ์พื้นฐานที่ใช้ทุกที่
วัตถุประสงค์คือเพื่อใช้งานฟังก์ชันใหม่ในสาขาที่แยกจากกัน จากนั้นพุชไปยังที่เก็บระยะไกล (จากนั้นคุณต้องสร้างคำขอดึงไปยังสาขาหลักด้วย แต่นั่นอยู่นอกเหนือขอบเขตของบทเรียนนี้)
สิ่งที่จำเป็นในการทำเช่นนี้?
-
รับการเปลี่ยนแปลงปัจจุบันทั้งหมดในสาขาหลัก (เช่น "ต้นแบบ")
-
จากสาขาหลักนี้ ให้สร้างสาขาแยกต่างหากสำหรับงานของคุณ
-
ใช้ฟังก์ชันใหม่
-
ไปที่สาขาหลักและตรวจสอบว่ามีการเปลี่ยนแปลงใหม่ในขณะที่เรากำลังดำเนินการอยู่หรือไม่ ถ้าไม่เช่นนั้นทุกอย่างก็เรียบร้อยดี แต่ถ้ามีการเปลี่ยนแปลงเราจะทำสิ่งต่อไปนี้: ไปที่สาขาที่ทำงานและรีบูตการเปลี่ยนแปลงจากสาขาหลักเป็นของเรา ถ้าทุกอย่างเป็นไปด้วยดีก็ดี แต่เป็นไปได้ทั้งหมดที่จะมีความขัดแย้ง เมื่อมันเกิดขึ้น พวกเขาสามารถแก้ไขได้ล่วงหน้า โดยไม่ต้องเสียเวลาในที่เก็บระยะไกล
คุณสงสัยหรือไม่ว่าทำไมคุณต้องทำสิ่งนี้? เป็นมารยาทที่ดีและป้องกันไม่ให้ความขัดแย้งเกิดขึ้นหลังจากส่งสาขาของคุณไปยังที่เก็บในเครื่อง (แน่นอนว่ามีความเป็นไปได้ที่ความขัดแย้งจะยังคงเกิดขึ้น แต่มันจะเล็กลงมาก )
-
พุชการเปลี่ยนแปลงของคุณไปยังที่เก็บระยะไกล
จะรับการเปลี่ยนแปลงจากเซิร์ฟเวอร์ระยะไกลได้อย่างไร
เราได้เพิ่มคำอธิบายใน README ด้วยคอมมิตใหม่และต้องการรับการเปลี่ยนแปลงเหล่านี้ หากมีการเปลี่ยนแปลงทั้งในที่เก็บข้อมูลในเครื่องและในรีโมต เราได้รับเชิญให้เลือกระหว่างการรวมและการรีเบส เราเลือกที่จะผสาน
ป้อน CTRL+T :
![](https://cdn.codegym.cc/images/article/cf224b05-d24d-4ccc-b9c8-34adc2d72202/1024.jpeg)
ตอนนี้คุณสามารถดูได้ว่า README มีการเปลี่ยนแปลงอย่างไร กล่าวคือ การเปลี่ยนแปลงจากที่เก็บระยะไกลถูกดึงเข้ามา และที่มุมล่างขวา คุณสามารถดูรายละเอียดทั้งหมดของการเปลี่ยนแปลงที่มาจากเซิร์ฟเวอร์
![](https://cdn.codegym.cc/images/article/5b7278ab-32f6-4c0c-801e-698999b34c28/1024.jpeg)
สร้างสาขาใหม่ตามต้นแบบ
ทุกอย่างเรียบง่ายที่นี่
ไปที่มุมล่างขวาแล้วคลิกGit: master เลือก+ สาขาใหม่
![](https://cdn.codegym.cc/images/article/328d4315-f521-4cd2-9d9f-8ca4196bcb7e/512.jpeg)
![](https://cdn.codegym.cc/images/article/c5548b15-e67b-4ab8-bf8d-3dbc0e0ee20d/512.jpeg)
Git: masterจะเปลี่ยนเป็น Git : readme-improver
มาจำลองการทำงานแบบคู่ขนานกัน
เพื่อให้ความขัดแย้งปรากฏขึ้น ต้องมีคนสร้างมันขึ้นมา
เราจะแก้ไข README ด้วยการคอมมิทใหม่ผ่านเบราว์เซอร์ ซึ่งจะเป็นการจำลองการทำงานแบบคู่ขนาน ราวกับว่ามีคนทำการเปลี่ยนแปลงในไฟล์เดียวกันในขณะที่เรากำลังแก้ไขอยู่ ผลที่ตามมาคือความขัดแย้ง เราจะลบคำว่า "fully" ออกจากบรรทัดที่ 10
ใช้ฟังก์ชันของเรา
งานของเราคือเปลี่ยน README และเพิ่มคำอธิบายให้กับบทความใหม่ นั่นคืองานใน Git ต้องผ่าน IntelliJ IDEA เพิ่มสิ่งนี้:
![](https://cdn.codegym.cc/images/article/55af2f94-068d-45a2-b236-25683da22923/1024.jpeg)
การเปลี่ยนแปลงเสร็จสิ้น ตอนนี้เราสามารถสร้างคอมมิชชันได้แล้ว กดCTRL+Kซึ่งจะให้เรา:
![](https://cdn.codegym.cc/images/article/9c46eceb-cefd-4d22-b383-62b652dbf580/800.jpeg)
ก่อนสร้างคอมมิท เราจำเป็นต้องพิจารณาอย่างใกล้ชิดว่าหน้าต่างนี้นำเสนออะไร
ใน ส่วน Commit Messageเราเขียนข้อความที่เกี่ยวข้องกับ Commit จากนั้นในการสร้าง เราต้องคลิกยอมรับ .
เราเขียนว่า README มีการเปลี่ยนแปลงและสร้างการคอมมิต การแจ้งเตือนปรากฏขึ้นที่มุมซ้ายล่างพร้อมชื่อของการคอมมิต:
![](https://cdn.codegym.cc/images/article/ad1b12f2-a9a3-4f03-be03-65138d3f0fce/512.jpeg)
ตรวจสอบว่าสาขาหลักมีการเปลี่ยนแปลงหรือไม่
เราเสร็จสิ้นภารกิจของเรา มันได้ผล. เราเขียนการทดสอบ ทุกอย่างปกติดี. แต่ก่อนที่จะส่งไปยังเซิร์ฟเวอร์ เรายังคงต้องตรวจสอบว่ามีการเปลี่ยนแปลงใด ๆ ในสาขาหลักในระหว่างนี้หรือไม่ มันเกิดขึ้นได้อย่างไร? ค่อนข้างง่าย: มีคนรับงานต่อจากคุณ และมีคนทำงานนั้นเสร็จเร็วกว่าคุณทำงานให้เสร็จ
ดังนั้นเราต้องไปที่สาขาหลัก ในการทำเช่นนี้ เราต้องทำตามที่แสดงในมุมล่างขวาของภาพด้านล่าง:
![](https://cdn.codegym.cc/images/article/47aeed84-70c0-4c2c-bd3d-23ded477331f/512.jpeg)
ในสาขาหลัก ให้กดCTRL+Tเพื่อรับการเปลี่ยนแปลงล่าสุดจากเซิร์ฟเวอร์ระยะไกล เมื่อพิจารณาถึงการเปลี่ยนแปลง คุณจะเห็นสิ่งที่เกิดขึ้นได้อย่างง่ายดาย:
![](https://cdn.codegym.cc/images/article/8841f8a3-26b7-4951-b9ae-fce4c6ee963d/1024.jpeg)
คำว่า "fully" ถูกลบออก อาจมีบางคนจากฝ่ายการตลาดตัดสินใจว่าไม่ควรเขียนแบบนั้นและให้งานแก่นักพัฒนาในการอัปเดต
ตอนนี้เรามีสำเนาของมาสเตอร์แบรนช์เวอร์ชันล่าสุดในเครื่องแล้ว กลับไปreadme-ปรับปรุง
ตอนนี้เราจำเป็นต้องรีบูตการเปลี่ยนแปลงจากสาขาหลักเป็นของเรา เราทำสิ่งนี้:
หากคุณทำทุกอย่างถูกต้องและทำตามกับฉัน ผลลัพธ์ควรแสดงความขัดแย้งในไฟล์ README:
![](https://cdn.codegym.cc/images/article/87da0371-4afa-45b9-8a17-26288d4ed82b/800.jpeg)
ที่นี่เรายังมีข้อมูลมากมายให้ทำความเข้าใจและดื่มด่ำ นี่คือรายการของไฟล์ (ในกรณีของเราคือหนึ่งไฟล์) ที่มีข้อขัดแย้ง เราสามารถเลือกได้สามตัวเลือกคือ
- ยอมรับของคุณ — ยอมรับเฉพาะการเปลี่ยนแปลงจาก readme-improver
- ยอมรับของพวกเขา — ยอมรับการเปลี่ยนแปลงจากเจ้านายเท่านั้น
- รวม — เลือกด้วยตัวคุณเองว่าคุณต้องการเก็บอะไรและทิ้งอะไร
ยังไม่ชัดเจนว่ามีการเปลี่ยนแปลงอะไร หากมีการเปลี่ยนแปลงเป็นสาขาหลัก จำเป็นต้องมีการเปลี่ยนแปลงที่นั่น ดังนั้นเราจึงไม่สามารถยอมรับการเปลี่ยนแปลงของเราได้ ดังนั้น เราเลือกผสาน :
เราจะเห็นว่ามีสามส่วน:
- นี่คือการเปลี่ยนแปลงจากโปรแกรมปรับปรุง readme
- ผลลัพธ์ที่ผสาน สำหรับตอนนี้ สิ่งที่มีอยู่ก่อนการเปลี่ยนแปลง
- การเปลี่ยนแปลงจากสาขาหลัก
เราจำเป็นต้องสร้างผลลัพธ์ที่ผสานกันซึ่งจะทำให้ทุกคนพึงพอใจ เมื่อทบทวนสิ่งที่เปลี่ยนแปลงก่อนการเปลี่ยนแปลงของเรา เราพบว่าพวกเขาเพียงแค่ลบคำว่า "fully" ได้ไม่มีปัญหา! นั่นหมายความว่าเราจะลบออกในผลลัพธ์ที่ผสานแล้วเพิ่มการเปลี่ยนแปลงของเรา เมื่อเราแก้ไขผลลัพธ์ที่ผสานแล้ว เราสามารถคลิกใช้
จากนั้นการแจ้งเตือนจะปรากฏขึ้นเพื่อบอกเราว่าการรีเบสสำเร็จแล้ว:
![](https://cdn.codegym.cc/images/article/91e5c63a-32b4-4c22-8e87-1948f4155d16/512.jpeg)
ที่นั่น! เราแก้ไขข้อขัดแย้งแรกของเราผ่าน IntelliJ IDEA
ผลักดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ระยะไกล
ขั้นตอนต่อไปคือการผลักดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ระยะไกลและสร้างคำขอดึง ในการทำเช่นนี้ เพียงกดCTRL+SHIFT+ K จากนั้นเราจะได้รับ:
![](https://cdn.codegym.cc/images/article/daa1f58f-5272-4fa8-ac9e-4fe5269b980d/800.jpeg)
ทางด้านซ้ายจะมีรายการคอมมิชชันที่ยังไม่ได้ส่งไปยังที่เก็บระยะไกล ทางด้านขวาจะเป็นไฟล์ทั้งหมดที่มีการเปลี่ยนแปลง และนั่นแหล่ะ! กดPushแล้วคุณจะพบความสุข :)
หากพุชสำเร็จ คุณจะเห็นการแจ้งเตือนแบบนี้ที่มุมล่างขวา:
![](https://cdn.codegym.cc/images/article/6baae013-ef6b-4e95-870c-95fd9fc6b593/512.jpeg)
โบนัส: สร้างคำขอดึง
ไปที่ที่เก็บ GitHub แล้วเราจะเห็นว่า GitHub รู้แล้วว่าเราต้องการอะไร:
![](https://cdn.codegym.cc/images/article/53ed0d01-b0af-4a11-bcb0-b52d136efc31/1024.jpeg)
คลิกเปรียบเทียบ & ดึงคำขอ จากนั้นคลิกสร้างคำขอดึงข้อมูล เนื่องจากเราแก้ไขข้อขัดแย้งล่วงหน้า ตอนนี้เมื่อสร้างคำขอดึง เราสามารถผสานได้ทันที:
แค่นี้ก่อน!
GO TO FULL VERSION