1. คำแนะนำโดยละเอียดเกี่ยวกับ Git สำหรับผู้เริ่มต้น

วันนี้เราจะพูดถึงระบบควบคุมเวอร์ชันที่เรียกว่า Git

คุณไม่สามารถเป็นโปรแกรมเมอร์ที่เต็มเปี่ยมได้หากไม่รู้จักและเข้าใจเครื่องมือนี้ แน่นอน คุณไม่จำเป็นต้องเก็บคำสั่งและคุณลักษณะทั้งหมดของ Git ไว้ในหัวเพื่อที่จะใช้งานได้อย่างต่อเนื่อง คุณจำเป็นต้องรู้ชุดคำสั่งที่จะช่วยให้คุณเข้าใจทุกสิ่งที่เกิดขึ้น

พื้นฐาน Git

Git คือระบบควบคุมเวอร์ชันแบบกระจายสำหรับโค้ดของเรา ทำไมเราต้องการมัน? ทีมต้องการระบบบางอย่างในการจัดการงานของพวกเขา จำเป็นต้องติดตามการเปลี่ยนแปลงที่เกิดขึ้นเมื่อเวลาผ่านไป

นั่นคือเราต้องสามารถเห็นทีละขั้นตอนว่าไฟล์ใดมีการเปลี่ยนแปลงและอย่างไร นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อคุณตรวจสอบสิ่งที่เปลี่ยนแปลงในบริบทของงานเดียว ทำให้สามารถย้อนกลับการเปลี่ยนแปลงได้

ลองนึกภาพสถานการณ์ต่อไปนี้: เรามีโค้ดที่ใช้งานได้ ทุกอย่างในนั้นดี แต่จากนั้นเราตัดสินใจปรับปรุงหรือปรับแต่งบางอย่าง ไม่ใช่เรื่องใหญ่ แต่ "การปรับปรุง" ของเราได้ทำลายคุณลักษณะของโปรแกรมไปครึ่งหนึ่งและทำให้ไม่สามารถทำงานได้ แล้วตอนนี้ล่ะ? หากไม่มี Git คุณจะต้องนั่งครุ่นคิดอยู่หลายชั่วโมง พยายามจดจำว่าเดิมทีทุกอย่างเป็นอย่างไร แต่ด้วย Git เราเพียงแค่ย้อนกลับการคอมมิต — แค่นั้น

หรือจะเป็นอย่างไรหากมีนักพัฒนาสองคนทำการเปลี่ยนแปลงโค้ดของตนเองพร้อมกัน หากไม่มี Git ก็จะคัดลอกไฟล์โค้ดต้นฉบับและแก้ไขแยกกัน มีเวลาที่ทั้งคู่ต้องการเพิ่มการเปลี่ยนแปลงในไดเร็กทอรีหลัก คุณจะทำอย่างไรในกรณีนี้?

จะไม่มีปัญหาดังกล่าวหากคุณใช้ Git

การติดตั้ง Git

มาติดตั้ง Java บนคอมพิวเตอร์ของคุณกันเถอะ กระบวนการนี้แตกต่างกันเล็กน้อยสำหรับระบบปฏิบัติการที่แตกต่างกัน

การติดตั้งบน Windows

ตามปกติ คุณต้องดาวน์โหลดและเรียกใช้ไฟล์ exe ทุกอย่างง่ายที่นี่: คลิกที่ลิงค์แรกของ Googleทำการติดตั้ง เท่านี้ก็เรียบร้อย ในการทำเช่นนี้ เราจะใช้ bash Console ที่ Windows จัดเตรียมไว้ให้

ใน Windows คุณต้องเรียกใช้ Git Bash นี่คือลักษณะที่ปรากฏในเมนูเริ่ม:

นี่คือพรอมต์คำสั่งที่คุณสามารถใช้งานได้

เพื่อหลีกเลี่ยงการต้องไปที่โฟลเดอร์ที่มีโปรเจ็กต์ทุกครั้งเพื่อเปิด Git ที่นั่น คุณสามารถเปิดพรอมต์คำสั่งในโฟลเดอร์โปรเจ็กต์ด้วยปุ่มเมาส์ขวาพร้อมพาธที่เราต้องการ:

การติดตั้งบน Linux

โดยปกติแล้ว Git จะเป็นส่วนหนึ่งของลีนุกซ์ดิสทริบิวชั่นและติดตั้งไว้แล้ว เนื่องจากมันเป็นเครื่องมือที่เดิมเขียนขึ้นสำหรับการพัฒนาเคอร์เนลของลินุกซ์ แต่มีบางสถานการณ์ที่ไม่เป็นเช่นนั้น ในการตรวจสอบ คุณต้องเปิดเทอร์มินัลแล้วเขียน: git --version หากคุณได้รับคำตอบที่เข้าใจได้ ก็ไม่จำเป็นต้องติดตั้งอะไร

เปิดเทอร์มินัลและติดตั้ง สำหรับ Ubuntu คุณต้องเขียน: sudo apt-get install git เท่านี้ก็เรียบร้อย ตอนนี้คุณสามารถใช้ Git ในเทอร์มินัลใดก็ได้

การติดตั้งบน macOS

ก่อนอื่นคุณต้องตรวจสอบว่ามี Git อยู่แล้วหรือไม่ (ดูด้านบนเหมือนกับบน Linux)

หากคุณยังไม่มี วิธีที่ง่ายที่สุดในการดาวน์โหลดคือดาวน์โหลดเวอร์ชันล่าสุด หากติดตั้ง Xcode แล้ว Git จะถูกติดตั้งโดยอัตโนมัติอย่างแน่นอน

การตั้งค่าคอมไพล์

Git มีการตั้งค่าผู้ใช้สำหรับผู้ใช้ที่จะส่งงาน สิ่งนี้สมเหตุสมผลและจำเป็น เนื่องจาก Git นำข้อมูลนี้ไปใช้ในฟิลด์ Author เมื่อมีการสร้างคอมมิต

ตั้งค่าชื่อผู้ใช้และรหัสผ่านสำหรับโครงการทั้งหมดของคุณโดยเรียกใช้คำสั่งต่อไปนี้:

git config --global user.name "Ivan Ivanov" git config --global user.email ivan.ivanov@gmail.com

หากคุณต้องการเปลี่ยนผู้เขียนสำหรับโครงการใดโครงการหนึ่ง (เช่น โครงการส่วนบุคคล) คุณสามารถลบ "--global" ได้ สิ่งนี้จะทำให้เราได้สิ่งต่อไปนี้:

git config user.name "Ivan Ivanov" git config user.email ivan.ivanov@gmail.com

ทฤษฎีเล็กน้อย

ในการดำดิ่งสู่หัวข้อนี้ เราควรแนะนำคุณเกี่ยวกับคำศัพท์และการกระทำใหม่ๆ สองสามคำ... มิฉะนั้นจะไม่มีอะไรให้พูดถึง แน่นอนว่านี่เป็นศัพท์แสงที่มาจากภาษาอังกฤษ ดังนั้นฉันจะเพิ่มคำแปลในวงเล็บ

คำพูดและการกระทำใด

  • ที่เก็บคอมไพล์
  • ให้สัญญา
  • สาขา
  • ผสาน
  • ความขัดแย้ง
  • ดึง
  • ดัน
  • วิธีละเว้นบางไฟล์ (.gitignore)

และอื่น ๆ

สถานะใน Git

Git มีรูปปั้นหลายอย่างที่ต้องเข้าใจและจดจำ:

  • ไม่ได้ติดตาม
  • แก้ไข
  • จัดฉาก
  • มุ่งมั่น

คุณควรเข้าใจเรื่องนี้อย่างไร?

นี่คือสถานะที่ใช้กับไฟล์ที่มีรหัสของเรา กล่าวอีกนัยหนึ่ง วงจรชีวิตของพวกมันมักจะมีลักษณะดังนี้:

  • ไฟล์ที่สร้างขึ้นแต่ยังไม่ได้เพิ่มไปยังที่เก็บมีสถานะ "ไม่ถูกติดตาม"
  • เมื่อเราทำการเปลี่ยนแปลงไฟล์ที่เพิ่มไปยังที่เก็บ Git แล้ว สถานะของไฟล์จะเป็น "แก้ไข"
  • ในบรรดาไฟล์ที่เราเปลี่ยนแปลง เราเลือกไฟล์ที่เราต้องการ (เช่น เราไม่ต้องการคลาสที่คอมไพล์แล้ว) และคลาสเหล่านี้จะเปลี่ยนเป็นสถานะ "จัดฉาก"
  • การคอมมิตถูกสร้างขึ้นจากไฟล์ที่เตรียมไว้ในสถานะสเตจและไปที่ที่เก็บ Git หลังจากนั้น จะไม่มีไฟล์ที่มีสถานะ "จัดฉาก" แต่อาจมีไฟล์ที่มีสถานะ "แก้ไข"

นี่คือลักษณะ:

คอมมิตคืออะไร?

คอมมิชชันเป็นเหตุการณ์หลักเมื่อพูดถึงการควบคุมเวอร์ชัน ประกอบด้วยการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นตั้งแต่การคอมมิตเริ่มต้นขึ้น คอมมิชชันจะเชื่อมโยงเข้าด้วยกันเหมือนรายการที่เชื่อมโยงรายการเดียว

โดยเฉพาะอย่างยิ่ง มีการกระทำครั้งแรก เมื่อคอมมิทที่สองถูกสร้างขึ้น มัน (อันที่สอง) จะรู้ว่าอะไรจะเกิดขึ้นหลังจากอันแรก และในลักษณะนี้สามารถติดตามข้อมูลได้

นอกจากนี้ การคอมมิตยังมีข้อมูลของตัวเองอีกด้วย ซึ่งเรียกว่าข้อมูลเมตา:

  • ตัวระบุเฉพาะของคอมมิชชัน ซึ่งสามารถใช้ค้นหาได้
  • ชื่อของผู้เขียนคอมมิท ผู้สร้างมันขึ้นมา
  • วันที่สร้างคอมมิท
  • ความคิดเห็นที่อธิบายถึงสิ่งที่ทำระหว่างการกระทำ

นี่คือลักษณะ:

สาขาคืออะไร?

สาขาเป็นตัวชี้ไปยังการกระทำบางอย่าง เนื่องจากการคอมมิตรู้ว่าคอมมิชชันใดอยู่ก่อนหน้า เมื่อสาขาชี้ไปที่คอมมิชชัน คอมมิชชันก่อนหน้านี้ทั้งหมดจะมีผลกับคอมมิตนั้นด้วย

ดังนั้น เราสามารถพูดได้ว่าคุณสามารถมีสาขาได้มากเท่าที่คุณต้องการโดยชี้ไปที่การกระทำเดียวกัน

งานเกิดขึ้นในสาขา ดังนั้นเมื่อมีการสร้างคอมมิชชันใหม่ สาขาจะย้ายตัวชี้ไปยังคอมมิชชันล่าสุด

เริ่มต้นใช้งาน Git

คุณสามารถทำงานกับที่เก็บข้อมูลในเครื่องเพียงอย่างเดียวเช่นเดียวกับรีโมต

หากต้องการฝึกใช้คำสั่งที่จำเป็น คุณสามารถจำกัดตัวเองไว้ที่ที่เก็บในเครื่อง โดยจะเก็บข้อมูลทั้งหมดของโครงการไว้ในโฟลเดอร์ .git เท่านั้น

หากเรากำลังพูดถึงพื้นที่เก็บข้อมูลระยะไกล ข้อมูลทั้งหมดจะถูกเก็บไว้ที่ใดที่หนึ่งบนเซิร์ฟเวอร์ระยะไกล: เฉพาะสำเนาของโครงการเท่านั้นที่จัดเก็บไว้ในเครื่อง การเปลี่ยนแปลงที่ทำกับสำเนาในเครื่องของคุณสามารถพุช (git push) ไปยังที่เก็บระยะไกลได้

ในการสนทนาของเราที่นี่และด้านล่าง เรากำลังพูดถึงการทำงานกับ Git ในคอนโซล แน่นอน คุณสามารถใช้โซลูชันที่ใช้ GUI บางประเภทได้ (เช่น IntelliJ IDEA) แต่ก่อนอื่น คุณควรทราบก่อนว่าคำสั่งใดถูกเรียกใช้งานและความหมายของคำสั่งเหล่านั้น

ทำงานกับ Git ในที่เก็บในเครื่อง

ในการสร้างที่เก็บในเครื่อง คุณต้องเขียน:

เริ่มต้นคอมไพล์

สิ่งนี้จะสร้างโฟลเดอร์ .git ที่ซ่อนอยู่ในไดเร็กทอรีปัจจุบันของคอนโซล

โฟลเดอร์ .git เก็บข้อมูลทั้งหมดเกี่ยวกับที่เก็บ Git อย่าลบนะ ;)

ถัดไป ไฟล์จะถูกเพิ่มในโครงการ และกำหนดสถานะเป็น "Untracked" หากต้องการตรวจสอบสถานะปัจจุบันของงานของคุณ ให้เขียนสิ่งนี้:

สถานะคอมไพล์

เราอยู่ในสาขาหลัก และเราจะอยู่ที่นี่จนกว่าเราจะเปลี่ยนไปใช้สาขาอื่น

นี่แสดงว่าไฟล์ใดมีการเปลี่ยนแปลงแต่ยังไม่ได้เพิ่มในสถานะ "staged" หากต้องการเพิ่มลงในสถานะ "จัดฉาก" คุณต้องเขียน "git add" เรามีตัวเลือกบางอย่างที่นี่ เช่น:

  • git add -A — เพิ่มไฟล์ทั้งหมดในสถานะ "staged"
  • คอมไพล์เพิ่ม . — เพิ่มไฟล์ทั้งหมดจากโฟลเดอร์นี้และโฟลเดอร์ย่อยทั้งหมด โดยพื้นฐานแล้วเหมือนกับก่อนหน้านี้
  • git add <file name> — เพิ่มไฟล์ที่ต้องการ ที่นี่คุณสามารถใช้นิพจน์ทั่วไปเพื่อเพิ่มไฟล์ตามรูปแบบบางอย่างได้ ตัวอย่างเช่น git add *.java: หมายความว่าคุณต้องการเพิ่มไฟล์ที่มีนามสกุล java เท่านั้น

สองตัวเลือกแรกนั้นง่ายอย่างชัดเจน สิ่งที่น่าสนใจยิ่งขึ้นด้วยการเพิ่มล่าสุด ดังนั้นมาเขียน:

คอมไพล์เพิ่ม *.txt

ในการตรวจสอบสถานะเราใช้คำสั่งที่เรารู้จักแล้ว:

สถานะคอมไพล์

ที่นี่คุณจะเห็นว่านิพจน์ทั่วไปทำงานได้อย่างถูกต้อง: ขณะนี้ test_resource.txt มีสถานะเป็น "staged"

และสุดท้าย ขั้นตอนสุดท้ายสำหรับการทำงานกับที่เก็บในเครื่อง (ยังมีอีกขั้นตอนหนึ่งเมื่อทำงานกับที่เก็บระยะไกล ;)) — การสร้างคอมมิชชันใหม่:

git commit -m “ไฟล์ txt ทั้งหมดถูกเพิ่มในโครงการ”

ถัดไปเป็นคำสั่งที่ดีสำหรับการดูประวัติการกระทำในสาขา มาใช้ประโยชน์จากมันกันเถอะ:

บันทึกคอมไพล์

ที่นี่คุณจะเห็นว่าเราได้สร้างคอมมิชชันแรกของเราและรวมถึงข้อความที่เราให้ไว้ในบรรทัดคำสั่ง สิ่งสำคัญคือต้องเข้าใจว่าข้อความนี้ควรอธิบายอย่างถูกต้องที่สุดเท่าที่จะเป็นไปได้ว่าได้ทำอะไรไประหว่างการกระทำนี้ สิ่งนี้จะช่วยเราได้หลายครั้งในอนาคต

ผู้อ่านที่อยากรู้อยากเห็นที่ยังไม่หลับอาจสงสัยว่าเกิดอะไรขึ้นกับไฟล์ GitTest.java มาดูกันตอนนี้ ในการทำเช่นนี้ เราใช้:

สถานะคอมไพล์

อย่างที่คุณเห็น มันยังคง "ไม่ถูกติดตาม" และกำลังรออยู่ในปีก แต่ถ้าเราไม่ต้องการเพิ่มในโครงการเลยล่ะ บางครั้งก็เกิดขึ้น

เพื่อให้สิ่งต่าง ๆ น่าสนใจยิ่งขึ้น มาลองเปลี่ยนไฟล์ test_resource.txt กัน มาเพิ่มข้อความที่นั่นและตรวจสอบสถานะ:

สถานะคอมไพล์

ที่นี่ คุณจะเห็นความแตกต่างระหว่างสถานะ "ไม่ได้ติดตาม" และ "แก้ไข" ได้อย่างชัดเจน

GitTest.java เป็น "ไม่ได้ติดตาม" ในขณะที่ test_resource.txt เป็น "แก้ไข"

ตอนนี้เรามีไฟล์ในสถานะแก้ไขแล้ว เราสามารถตรวจสอบการเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์เหล่านั้นได้ สามารถทำได้โดยใช้คำสั่งต่อไปนี้:

คอมไพล์แตกต่าง

นั่นคือคุณสามารถเห็นสิ่งที่ฉันเพิ่มลงในไฟล์ข้อความของเราได้อย่างชัดเจนที่นี่: สวัสดีชาวโลก!

มาเพิ่มการเปลี่ยนแปลงของเราในไฟล์ข้อความและสร้างคอมมิท:

git เพิ่ม test_resource.txt
git commit -m “เพิ่มคำสวัสดี! เพื่อ test_resource.txt”

หากต้องการดูคอมมิชชันทั้งหมด ให้เขียน:

บันทึกคอมไพล์

อย่างที่คุณเห็น ตอนนี้เรามีสองคอมมิชชัน

เราจะเพิ่ม GitTest.java ด้วยวิธีเดียวกัน ไม่มีความคิดเห็นที่นี่ เพียงคำสั่ง:

git เพิ่ม GitTest.java
git commit -m “เพิ่ม GitTest.java”
สถานะคอมไพล์

ทำงานกับ .gitignore

เห็นได้ชัดว่าเราต้องการเก็บซอร์สโค้ดเพียงอย่างเดียวและไม่ต้องการอย่างอื่นในที่เก็บข้อมูล แล้วจะมีอะไรอีก? อย่างน้อยที่สุด คอมไพล์คลาสและ/หรือไฟล์ที่สร้างโดยสภาพแวดล้อมการพัฒนา

ในการบอกให้ Git เพิกเฉย เราต้องสร้างไฟล์พิเศษ ทำสิ่งนี้: สร้างไฟล์ชื่อ .gitignore ในรูทของโปรเจ็กต์ แต่ละบรรทัดในไฟล์นี้แสดงถึงรูปแบบที่จะละเว้น

ในตัวอย่างนี้ ไฟล์ .gitignore จะมีลักษณะดังนี้:

*.class
เป้าหมาย/
*.iml
.idea/

ลองดู:

  • บรรทัดแรกคือการละเว้นไฟล์ทั้งหมดที่มีนามสกุล .class
  • บรรทัดที่สองคือการละเว้นโฟลเดอร์ "เป้าหมาย" และทุกอย่างที่อยู่ในนั้น
  • บรรทัดที่สามคือการละเว้นไฟล์ทั้งหมดที่มีนามสกุล .iml
  • บรรทัดที่สี่คือการละเว้นโฟลเดอร์ .idea

ลองใช้ตัวอย่างกัน หากต้องการดูวิธีการทำงาน ให้เพิ่ม GitTest.class ที่คอมไพล์แล้วลงในโปรเจ็กต์และตรวจสอบสถานะโปรเจ็กต์:

สถานะคอมไพล์

เห็นได้ชัดว่าเราไม่ต้องการเพิ่มคลาสที่คอมไพล์แล้วในโครงการโดยไม่ตั้งใจ (โดยใช้ git add -A) ในการทำเช่นนี้ ให้สร้างไฟล์ .gitignore และเพิ่มทุกอย่างที่อธิบายไว้ก่อนหน้านี้:

ตอนนี้ให้ใช้การยืนยันเพื่อเพิ่มไฟล์ .gitignore ในโครงการ:

git เพิ่ม .gitignore
git commit -m “เพิ่มไฟล์ .gitignore”

และตอนนี้เป็นช่วงเวลาแห่งความจริง: เรามีคลาส GitTest.class ที่คอมไพล์แล้วซึ่ง "ไม่ติดตาม" ซึ่งเราไม่ต้องการเพิ่มในที่เก็บ Git

ตอนนี้เราควรเห็นผลกระทบของไฟล์ .gitignore:

สถานะคอมไพล์

สมบูรณ์แบบ! .gitignore +1 :)

ทำงานกับสาขา

โดยปกติแล้ว การทำงานในสาขาเดียวนั้นไม่สะดวกสำหรับนักพัฒนาคนเดียว และเป็นไปไม่ได้เมื่อมีมากกว่าหนึ่งคนในทีม นี่คือเหตุผลที่เรามีสาขา

สาขาเป็นเพียงตัวชี้ที่เคลื่อนย้ายได้เพื่อกระทำ

ในส่วนนี้ เราจะสำรวจการทำงานในสาขาต่างๆ: วิธีผสานการเปลี่ยนแปลงจากสาขาหนึ่งไปยังอีกสาขาหนึ่ง ความขัดแย้งที่อาจเกิดขึ้น และอื่นๆ อีกมากมาย

หากต้องการดูรายชื่อสาขาทั้งหมดในที่เก็บและเข้าใจว่าคุณอยู่สาขาใด คุณต้องเขียน:

คอมไพล์สาขา -a

คุณจะเห็นว่าเรามีสาขาหลักเพียงแห่งเดียว เครื่องหมายดอกจันข้างหน้าแสดงว่าเราอยู่ในนั้น คุณยังสามารถใช้คำสั่ง "git status" เพื่อดูว่าเราอยู่ในสาขาใด

จากนั้นมีตัวเลือกมากมายสำหรับการสร้างสาขา (อาจมีมากกว่านี้ — นี่คือตัวเลือกที่ฉันใช้):

  • สร้างสาขาใหม่ตามสาขาที่เราอยู่ (99% ของกรณี)
  • สร้างสาขาตามการกระทำเฉพาะ (1% ของกรณี)

มาสร้างสาขาตามการกระทำเฉพาะ

เราจะใช้ตัวระบุเฉพาะของการกระทำ เพื่อค้นหาเราเขียน:

บันทึกคอมไพล์

เราได้เน้นการกระทำด้วยความคิดเห็น "เพิ่มสวัสดีชาวโลก..." ตัวระบุเฉพาะของมันคือ 6c44e53d06228f888f2f454d3cb8c1c976dd73f8 เราต้องการสร้างสาขา "การพัฒนา" ที่เริ่มต้นจากการกระทำนี้ ในการทำเช่นนี้ เราเขียน:

git ชำระเงิน -b การพัฒนา 6c44e53d06228f888f2f454d3cb8c1c976dd73f8

สาขาถูกสร้างขึ้นโดยมีเพียงสองรายการแรกจากสาขาหลัก ในการตรวจสอบสิ่งนี้ ขั้นแรกเราต้องแน่ใจว่าได้เปลี่ยนไปใช้สาขาอื่นแล้วดูจำนวนคอมมิชชันที่นั่น:

สถานะคอมไพล์
บันทึกคอมไพล์

และตามที่คาดไว้ เรามีสองคอมมิชชัน อย่างไรก็ตาม ประเด็นที่น่าสนใจก็คือ ยังไม่มีไฟล์ .gitignore ในสาขานี้ ดังนั้นไฟล์ที่คอมไพล์แล้ว (GitTest.class) จึงถูกเน้นด้วยสถานะ "ไม่ติดตาม"

ตอนนี้เราสามารถตรวจสอบสาขาของเราอีกครั้งโดยเขียนสิ่งนี้:

คอมไพล์สาขา -a

คุณจะเห็นว่ามีสองสาขา: "ต้นแบบ" และ "การพัฒนา" ขณะนี้เรากำลังอยู่ในระหว่างการพัฒนา

มาสร้างสาขาตามสาขาปัจจุบันกันเถอะ

วิธีที่สองในการสร้างสาขาคือสร้างจากสาขาอื่น เราต้องการสร้างสาขาตามสาขาหลัก ขั้นแรก เราต้องเปลี่ยนไปใช้มัน และขั้นตอนต่อไปคือการสร้างใหม่ ลองดู:

  • git checkout master — เปลี่ยนเป็นสาขาหลัก
  • git status — ยืนยันว่าเราอยู่ใน master branch จริงๆ

ที่นี่คุณจะเห็นว่าเราเปลี่ยนไปใช้สาขาหลัก ไฟล์ .gitignore มีผลบังคับใช้ และคลาสที่คอมไพล์แล้วจะไม่เน้นเป็น "untracked" อีกต่อไป

ตอนนี้เราสร้างสาขาใหม่ตามสาขาหลัก:

git checkout -b คุณลักษณะ/update-txt-files

หากคุณไม่แน่ใจว่าสาขานี้เหมือนกับ "master" หรือไม่ คุณสามารถตรวจสอบได้ง่ายๆ โดยดำเนินการ "git log" และดูที่คอมมิชชันทั้งหมด ควรมีสี่คน

แก้ปัญหาความขัดแย้ง

ก่อนที่เราจะสำรวจว่าความขัดแย้งคืออะไร เราต้องพูดถึงการรวมสาขาหนึ่งเข้ากับอีกสาขาหนึ่ง

ภาพนี้แสดงขั้นตอนการรวมสาขาหนึ่งเข้ากับอีกสาขาหนึ่ง:

ที่นี่เรามีสาขาหลัก ในบางจุด สาขารองจะถูกสร้างขึ้นจากสาขาหลักและแก้ไขแล้ว เมื่อทำงานเสร็จแล้ว เราต้องรวมสาขาหนึ่งเข้ากับอีกสาขาหนึ่ง

ในตัวอย่างของเรา เราได้สร้างสาขาของฟีเจอร์/อัพเดต-txt-ไฟล์ ตามชื่อสาขา เรากำลังปรับปรุงข้อความ

ตอนนี้เราต้องสร้างคอมมิชชันใหม่สำหรับงานนี้:

คอมไพล์เพิ่ม *.txt
git commit -m “อัพเดทไฟล์ txt”
บันทึกคอมไพล์

ตอนนี้ หากเราต้องการรวมสาขาของ feature/update-txt-files เข้ากับ master เราต้องไปที่ master และเขียน "git merge feature/update-txt-files":

คอมไพล์เช็คเอาต์มาสเตอร์
คุณลักษณะการผสาน git/update-txt-files
บันทึกคอมไพล์

ด้วยเหตุนี้ มาสเตอร์แบรนช์จึงมีคอมมิชชันที่เพิ่มไปยังไฟล์ฟีเจอร์/อัปเดต-txt-

ฟังก์ชันนี้ถูกเพิ่มเข้ามา คุณจึงสามารถลบฟีเจอร์สาขาได้ ในการทำเช่นนี้ เราเขียน:

git branch -D คุณลักษณะ/update-txt-files

มาทำให้สถานการณ์ซับซ้อนขึ้น: ตอนนี้สมมติว่าคุณต้องเปลี่ยนไฟล์ txt อีกครั้ง แต่ตอนนี้ไฟล์นี้จะถูกเปลี่ยนในสาขาหลักเช่นกัน กล่าวอีกนัยหนึ่งก็จะเปลี่ยนขนานกันไป Git จะไม่สามารถทราบได้ว่าต้องทำอย่างไรเมื่อเราต้องการรวมรหัสใหม่ของเราเข้ากับสาขาหลัก

เราจะสร้างสาขาใหม่ตามต้นแบบ ทำการเปลี่ยนแปลง text_resource.txt และสร้างการคอมมิตสำหรับงานนี้:

git checkout -b คุณลักษณะ/ส่วนเสริมส่วนหัว

... เราทำการเปลี่ยนแปลงไฟล์

คอมไพล์เพิ่ม *.txt
git commit -m “เพิ่มส่วนหัวให้กับ txt”

ไปที่สาขาหลักและอัปเดตไฟล์ข้อความนี้ในบรรทัดเดียวกับในสาขาคุณลักษณะ:

คอมไพล์เช็คเอาต์มาสเตอร์

… เราอัปเดต test_resource.txt

git เพิ่ม test_resource.txt
git commit -m “เพิ่ม master header ให้กับ txt”

และตอนนี้จุดที่น่าสนใจที่สุด: เราจำเป็นต้องรวมการเปลี่ยนแปลงจากสาขาคุณลักษณะ/ส่วนหัวของส่วนเสริมเข้ากับต้นแบบ เราอยู่ในสาขาหลัก ดังนั้นเราต้องเขียน:

คุณลักษณะการรวมคอมไพล์ / ส่วนหัวส่วนเสริม

แต่ผลลัพธ์จะขัดแย้งกันในไฟล์ test_resource.txt:

ที่นี่เราจะเห็นว่า Git ไม่สามารถตัดสินใจได้เองว่าจะรวมรหัสนี้อย่างไร มันบอกเราว่าเราต้องแก้ไขข้อขัดแย้งก่อน แล้วจึงดำเนินการกระทำเท่านั้น

ตกลง. เราเปิดไฟล์ที่มีข้อขัดแย้งในโปรแกรมแก้ไขข้อความและดู:

เพื่อทำความเข้าใจว่า Git ทำอะไรที่นี่ เราต้องจำการเปลี่ยนแปลงที่เราทำและที่ แล้วเปรียบเทียบ:

  1. การเปลี่ยนแปลงที่อยู่ในบรรทัดนี้ในสาขาหลักจะอยู่ระหว่าง "<<<<<<< HEAD" และ "======="
  2. การเปลี่ยนแปลงที่อยู่ในสาขาคุณลักษณะ/ส่วนเพิ่มส่วนหัวอยู่ระหว่าง "=======" และ ">>>>>>> คุณลักษณะ/ส่วนเพิ่มส่วนหัว"

นี่คือวิธีที่ Git บอกเราว่าไม่สามารถหาวิธีผสานที่ตำแหน่งนี้ในไฟล์ได้ แบ่งส่วนนี้ออกเป็นสองส่วนจากสาขาต่างๆ และเชื้อเชิญให้เราแก้ไขข้อขัดแย้งในการผสานด้วยตนเอง

ยุติธรรมเพียงพอ ฉันตัดสินใจลบทุกอย่างอย่างกล้าหาญเหลือเพียงคำว่า "ส่วนหัว":

มาดูสถานะของการเปลี่ยนแปลงกัน คำอธิบายจะแตกต่างกันเล็กน้อย แทนที่จะเป็นสถานะ "แก้ไข" เรามี "ยกเลิกการรวม" เราจะพูดถึงสถานะที่ห้าได้ไหม? ฉันไม่คิดว่านี่เป็นสิ่งจำเป็น มาดูกัน:

สถานะคอมไพล์

เราสามารถโน้มน้าวตนเองได้ว่านี่เป็นกรณีพิเศษและไม่ธรรมดา ดำเนินการต่อ:

คอมไพล์เพิ่ม *.txt

คุณอาจสังเกตเห็นว่าคำอธิบายแนะนำให้เขียนเฉพาะ "git commit" มาลองเขียนว่า:

คอมไพล์คอมไพล์

และเช่นเดียวกับที่เราทำได้ เราแก้ไขข้อขัดแย้งในคอนโซล

แน่นอนว่าสิ่งนี้สามารถทำได้ง่ายขึ้นเล็กน้อยในสภาพแวดล้อมการพัฒนาแบบบูรณาการ ตัวอย่างเช่น ใน IntelliJ IDEA ทุกอย่างได้รับการตั้งค่าอย่างดีเพื่อให้คุณสามารถดำเนินการที่จำเป็นทั้งหมดได้ภายในนั้น แต่ IDE ทำสิ่งต่างๆ มากมาย "ภายใต้ประทุน" และเรามักไม่เข้าใจว่าเกิดอะไรขึ้นที่นั่น และเมื่อขาดความเข้าใจก็จะเกิดปัญหาขึ้นได้

การทำงานกับที่เก็บข้อมูลระยะไกล

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

ดังที่ฉันได้กล่าวไปแล้ว พื้นที่เก็บข้อมูลระยะไกลเป็นสถานที่ที่จัดเก็บพื้นที่เก็บข้อมูลและคุณสามารถโคลนได้

มีที่เก็บข้อมูลระยะไกลประเภทใดบ้าง ตัวอย่าง:

  • GitHub เป็นแพลตฟอร์มการจัดเก็บข้อมูลที่ใหญ่ที่สุดสำหรับพื้นที่เก็บข้อมูลและการพัฒนาร่วมกัน
  • GitLab เป็นเครื่องมือบนเว็บสำหรับวงจรชีวิตของ DevOps ด้วยโอเพ่นซอร์ส เป็นระบบที่ใช้ Git สำหรับจัดการที่เก็บโค้ดด้วย wiki, ระบบติดตามบั๊ก, ไปป์ไลน์ CI/CD และฟังก์ชันอื่นๆ
  • BitBucket เป็นบริการเว็บสำหรับการโฮสต์โครงการและการพัฒนาร่วมกันโดยใช้ระบบควบคุมเวอร์ชันของ Mercurial และ Git ครั้งหนึ่งมันมีข้อได้เปรียบเหนือ GitHub ตรงที่ให้พื้นที่เก็บข้อมูลส่วนตัวฟรี ปีที่แล้ว GitHub ยังแนะนำความสามารถนี้ให้กับทุกคนฟรี
  • และอื่น ๆ ...

เมื่อทำงานกับที่เก็บระยะไกล สิ่งแรกที่ต้องทำคือโคลนโครงการไปยังที่เก็บในเครื่องของคุณ

สำหรับสิ่งนี้ เราได้ส่งออกโครงการที่เราสร้างขึ้นในเครื่อง ตอนนี้ทุกคนสามารถโคลนมันด้วยตัวเองโดยเขียน:

โคลนคอมไพล์ https://github.com/romankh3/git-demo

ขณะนี้มีสำเนาที่สมบูรณ์ของโครงการในเครื่องแล้ว เพื่อให้แน่ใจว่าสำเนาของโปรเจ็กต์ในเครื่องเป็นเวอร์ชันล่าสุด คุณต้องดึงโปรเจ็กต์โดยเขียน:

คอมไพล์ดึง

ในกรณีของเรา ไม่มีอะไรเปลี่ยนแปลงในรีโมต repository ในปัจจุบัน ดังนั้นคำตอบคือ: อัปเดตแล้ว

แต่ถ้าเราทำการเปลี่ยนแปลงใด ๆ กับรีโมต repository รีโมต repository นั้นจะถูกอัพเดตหลังจากที่เราดึงมา

และสุดท้าย คำสั่งสุดท้ายคือการพุชข้อมูลไปยังที่เก็บระยะไกล เมื่อเราทำบางอย่างในเครื่องแล้วและต้องการส่งไปยังที่เก็บระยะไกล เราต้องสร้างคอมมิชชันใหม่ภายในเครื่องก่อน เพื่อแสดงสิ่งนี้ ลองเพิ่มสิ่งอื่นในไฟล์ข้อความของเรา:

ตอนนี้ค่อนข้างเป็นเรื่องธรรมดาสำหรับเรา - เราสร้างความมุ่งมั่นสำหรับงานนี้:

git เพิ่ม test_resource.txt
git commit -m "เตรียม txt สำหรับการพุช"

คำสั่งเพื่อส่งสิ่งนี้ไปยังที่เก็บระยะไกลคือ:

คอมไพล์กด

แค่นี้ก่อน!

ลิงค์ที่มีประโยชน์

2. วิธีการทำงานกับ Git ใน IntelliJ IDEA

ในส่วนนี้ คุณจะได้เรียนรู้วิธีการทำงานกับ Git ใน IntelliJ IDEA

อินพุตที่จำเป็น:

  1. อ่าน ทำตาม และทำความเข้าใจในส่วนที่แล้ว สิ่งนี้จะช่วยให้แน่ใจว่าทุกอย่างถูกตั้งค่าและพร้อมใช้งาน
  2. ติดตั้ง IntelliJ IDEA ทุกอย่างควรจะเป็นระเบียบที่นี่ :)
  3. จัดสรรเวลาหนึ่งชั่วโมงเพื่อให้ได้ความเชี่ยวชาญที่สมบูรณ์

มาทำงานกับโครงการสาธิตที่ฉันใช้สำหรับบทความเกี่ยวกับ Git

โคลนโครงการในเครื่อง

มีสองตัวเลือกที่นี่:

  1. หากคุณมีบัญชี GitHub อยู่แล้วและต้องการผลักดันบางอย่างในภายหลัง จะเป็นการดีกว่าที่จะแยกโครงการและคัดลอกสำเนาของคุณเอง คุณสามารถอ่านเกี่ยวกับวิธีสร้างส้อมได้ในบทความอื่นภายใต้หัวข้อตัวอย่างของเวิร์กโฟลว์การฟอร์ก
  2. โคลนพื้นที่เก็บข้อมูลและทำทุกอย่างในเครื่องโดยไม่ต้องพุชสิ่งทั้งหมดไปยังเซิร์ฟเวอร์

ในการโคลนโครงการจาก GitHub คุณต้องคัดลอกลิงก์โครงการและส่งต่อไปยัง IntelliJ IDEA:

  1. คัดลอกที่อยู่โครงการ:

  2. เปิด IntelliJ IDEA แล้วเลือก "รับจากการควบคุมเวอร์ชัน":

  3. คัดลอกและวางที่อยู่โครงการ:

  4. คุณจะได้รับแจ้งให้สร้างโครงการ IntelliJ IDEA ยอมรับข้อเสนอ:

  5. เนื่องจากไม่มีระบบการสร้าง เราจึงเลือก "สร้างโครงการจากแหล่งที่มาที่มีอยู่":

  6. ถัดไปคุณจะเห็นหน้าจอที่สวยงามนี้:

ตอนนี้เราทราบเรื่องการโคลนนิ่งแล้ว คุณสามารถดูรอบๆ ได้

ดูครั้งแรกที่ IntelliJ IDEA ในฐานะ Git UI

ลองดูโปรเจ็กต์โคลนให้ละเอียดยิ่งขึ้น: คุณสามารถรับข้อมูลมากมายเกี่ยวกับระบบควบคุมเวอร์ชันได้แล้ว

ขั้นแรก เรามีบานหน้าต่างการควบคุมเวอร์ชันที่มุมล่างซ้าย ที่นี่คุณสามารถค้นหาการเปลี่ยนแปลงในเครื่องทั้งหมดและรับรายการคอมมิชชัน (คล้ายกับ "git log")

ไปที่การสนทนาของ Log กันเถอะ มีการสร้างภาพข้อมูลบางอย่างที่ช่วยให้เราเข้าใจว่าการพัฒนาดำเนินไปอย่างไร ตัวอย่างเช่น คุณจะเห็นว่ามีการสร้างสาขาใหม่โดยเพิ่มส่วนหัวลงใน txt commit ซึ่งต่อมาจะรวมเข้ากับสาขาหลัก หากคุณคลิกที่คอมมิต คุณจะเห็นข้อมูลทั้งหมดเกี่ยวกับการคอมมิตที่มุมขวา: การเปลี่ยนแปลงและข้อมูลเมตาทั้งหมด

นอกจากนี้ยังสามารถเห็นการเปลี่ยนแปลงที่เกิดขึ้นจริง เรายังเห็นว่าความขัดแย้งได้รับการแก้ไขที่นั่น IDEA ก็นำเสนอเรื่องนี้ได้เป็นอย่างดี

หากคุณดับเบิลคลิกที่ไฟล์ที่มีการเปลี่ยนแปลงระหว่างการคอมมิตนี้ เราจะดูว่าข้อขัดแย้งได้รับการแก้ไขอย่างไร:

เราทราบว่าทางด้านซ้ายและด้านขวาเรามีไฟล์เดียวกันสองเวอร์ชันซึ่งจำเป็นต้องรวมเป็นไฟล์เดียว และตรงกลาง เราได้ผลการรวมสุดท้าย

เมื่อโครงการมีสาขา คอมมิชชัน และผู้ใช้จำนวนมาก คุณต้องค้นหาแยกกันตามสาขา ผู้ใช้ และวันที่:

ก่อนเริ่มต้นควรอธิบายวิธีทำความเข้าใจว่าเราอยู่ในสาขาใด

ที่มุมขวาล่าง มีปุ่ม "Git: master" สิ่งที่ตามมา "Git:" คือสาขาปัจจุบัน หากคุณคลิกปุ่ม คุณจะสามารถทำสิ่งที่มีประโยชน์ได้มากมาย: เปลี่ยนไปใช้สาขาอื่น สร้างสาขาใหม่ เปลี่ยนชื่อสาขาที่มีอยู่ และอื่นๆ

การทำงานกับที่เก็บข้อมูล

ปุ่มลัดที่มีประโยชน์

สำหรับงานในอนาคต คุณต้องจำปุ่มลัดที่มีประโยชน์มากสองสามตัว:

  1. CTRL+T — รับการเปลี่ยนแปลงล่าสุดจากที่เก็บระยะไกล (git pull)
  2. CTRL+K — สร้างคอมมิชชัน / ดูการเปลี่ยนแปลงปัจจุบันทั้งหมด ซึ่งรวมถึงไฟล์ที่ไม่ได้ติดตามและแก้ไข (คอมไพล์คอมไพล์)
  3. CTRL+SHIFT+K — นี่คือคำสั่งสำหรับการพุชการเปลี่ยนแปลงไปยังที่เก็บระยะไกล คอมมิชชันทั้งหมดที่สร้างขึ้นในเครื่องและยังไม่ได้อยู่ในที่เก็บระยะไกลจะถูกพุช (git push)
  4. ALT+CTRL+Z — ย้อนกลับการเปลี่ยนแปลงในไฟล์ที่ระบุเป็นสถานะของการกระทำล่าสุดที่สร้างขึ้นในพื้นที่เก็บข้อมูลในเครื่อง หากคุณเลือกทั้งโครงการที่มุมซ้ายบน คุณสามารถย้อนกลับการเปลี่ยนแปลงในไฟล์ทั้งหมดได้

เราต้องการอะไร

เพื่อให้งานสำเร็จ เราจำเป็นต้องเชี่ยวชาญสถานการณ์พื้นฐานที่ใช้ทุกที่

วัตถุประสงค์คือเพื่อใช้งานฟังก์ชันใหม่ในสาขาที่แยกจากกัน จากนั้นพุชไปยังที่เก็บระยะไกล (จากนั้นคุณต้องสร้างคำขอดึงไปยังสาขาหลักด้วย แต่นั่นอยู่นอกเหนือขอบเขตของบทเรียนนี้)

สิ่งที่จำเป็นในการทำเช่นนี้?

  1. รับการเปลี่ยนแปลงปัจจุบันทั้งหมดในสาขาหลัก (เช่น "ต้นแบบ")

  2. จากสาขาหลักนี้ ให้สร้างสาขาแยกต่างหากสำหรับงานของคุณ

  3. ใช้ฟังก์ชันใหม่

  4. ไปที่สาขาหลักและตรวจสอบว่ามีการเปลี่ยนแปลงใหม่ในขณะที่เรากำลังดำเนินการอยู่หรือไม่ ถ้าไม่เช่นนั้นทุกอย่างก็เรียบร้อยดี แต่ถ้ามีการเปลี่ยนแปลงเราจะทำสิ่งต่อไปนี้: ไปที่สาขาที่ทำงานและรีบูตการเปลี่ยนแปลงจากสาขาหลักเป็นของเรา ถ้าทุกอย่างเป็นไปด้วยดีก็ดี แต่เป็นไปได้ทั้งหมดที่จะมีความขัดแย้ง เมื่อมันเกิดขึ้น พวกเขาสามารถแก้ไขได้ล่วงหน้า โดยไม่ต้องเสียเวลาในที่เก็บระยะไกล

    คุณสงสัยหรือไม่ว่าทำไมคุณต้องทำสิ่งนี้? เป็นมารยาทที่ดีและป้องกันไม่ให้ความขัดแย้งเกิดขึ้นหลังจากส่งสาขาของคุณไปยังที่เก็บในเครื่อง (แน่นอนว่ามีความเป็นไปได้ที่ความขัดแย้งจะยังคงเกิดขึ้น แต่มันจะเล็กลงมาก )

  5. พุชการเปลี่ยนแปลงของคุณไปยังที่เก็บระยะไกล

จะรับการเปลี่ยนแปลงจากเซิร์ฟเวอร์ระยะไกลได้อย่างไร

เราได้เพิ่มคำอธิบายใน README ด้วยคอมมิตใหม่และต้องการรับการเปลี่ยนแปลงเหล่านี้ หากมีการเปลี่ยนแปลงทั้งในที่เก็บข้อมูลในเครื่องและในรีโมต เราได้รับเชิญให้เลือกระหว่างการรวมและการรีเบส เราเลือกที่จะผสาน

ป้อน CTRL+T :

ตอนนี้คุณสามารถดูได้ว่า README มีการเปลี่ยนแปลงอย่างไร กล่าวคือ การเปลี่ยนแปลงจากที่เก็บระยะไกลถูกดึงเข้ามา และที่มุมล่างขวา คุณสามารถดูรายละเอียดทั้งหมดของการเปลี่ยนแปลงที่มาจากเซิร์ฟเวอร์

สร้างสาขาใหม่ตามต้นแบบ

ทุกอย่างเรียบง่ายที่นี่

ไปที่มุมล่างขวาแล้วคลิกGit: master เลือก+ สาขาใหม่

ปล่อยให้ ช่องทำเครื่องหมาย Checkout สาขาที่เลือกไว้และป้อนชื่อสาขาใหม่ ในกรณีของเรา: สิ่งนี้จะเป็นreadme- improver

Git: masterจะเปลี่ยนเป็น Git : readme-improver

มาจำลองการทำงานแบบคู่ขนานกัน

เพื่อให้ความขัดแย้งปรากฏขึ้น ต้องมีคนสร้างมันขึ้นมา

เราจะแก้ไข README ด้วยการคอมมิทใหม่ผ่านเบราว์เซอร์ ซึ่งจะเป็นการจำลองการทำงานแบบคู่ขนาน ราวกับว่ามีคนทำการเปลี่ยนแปลงในไฟล์เดียวกันในขณะที่เรากำลังแก้ไขอยู่ ผลที่ตามมาคือความขัดแย้ง เราจะลบคำว่า "fully" ออกจากบรรทัดที่ 10

ใช้ฟังก์ชันของเรา

งานของเราคือเปลี่ยน README และเพิ่มคำอธิบายให้กับบทความใหม่ นั่นคืองานใน Git ต้องผ่าน IntelliJ IDEA เพิ่มสิ่งนี้:

การเปลี่ยนแปลงเสร็จสิ้น ตอนนี้เราสามารถสร้างคอมมิชชันได้แล้ว กดCTRL+Kซึ่งจะให้เรา:

ก่อนสร้างคอมมิท เราจำเป็นต้องพิจารณาอย่างใกล้ชิดว่าหน้าต่างนี้นำเสนออะไร

ใน ส่วน Commit Messageเราเขียนข้อความที่เกี่ยวข้องกับ Commit จากนั้นในการสร้าง เราต้องคลิกยอมรับ .

เราเขียนว่า README มีการเปลี่ยนแปลงและสร้างการคอมมิต การแจ้งเตือนปรากฏขึ้นที่มุมซ้ายล่างพร้อมชื่อของการคอมมิต:

ตรวจสอบว่าสาขาหลักมีการเปลี่ยนแปลงหรือไม่

เราเสร็จสิ้นภารกิจของเรา มันได้ผล. เราเขียนการทดสอบ ทุกอย่างปกติดี. แต่ก่อนที่จะส่งไปยังเซิร์ฟเวอร์ เรายังคงต้องตรวจสอบว่ามีการเปลี่ยนแปลงใด ๆ ในสาขาหลักในระหว่างนี้หรือไม่ มันเกิดขึ้นได้อย่างไร? ค่อนข้างง่าย: มีคนรับงานต่อจากคุณ และมีคนทำงานนั้นเสร็จเร็วกว่าคุณทำงานให้เสร็จ

ดังนั้นเราต้องไปที่สาขาหลัก ในการทำเช่นนี้ เราต้องทำตามที่แสดงในมุมล่างขวาของภาพด้านล่าง:

ในสาขาหลัก ให้กดCTRL+Tเพื่อรับการเปลี่ยนแปลงล่าสุดจากเซิร์ฟเวอร์ระยะไกล เมื่อพิจารณาถึงการเปลี่ยนแปลง คุณจะเห็นสิ่งที่เกิดขึ้นได้อย่างง่ายดาย:

คำว่า "fully" ถูกลบออก อาจมีบางคนจากฝ่ายการตลาดตัดสินใจว่าไม่ควรเขียนแบบนั้นและให้งานแก่นักพัฒนาในการอัปเดต

ตอนนี้เรามีสำเนาของมาสเตอร์แบรนช์เวอร์ชันล่าสุดในเครื่องแล้ว กลับไปreadme-ปรับปรุง

ตอนนี้เราจำเป็นต้องรีบูตการเปลี่ยนแปลงจากสาขาหลักเป็นของเรา เราทำสิ่งนี้:

หากคุณทำทุกอย่างถูกต้องและทำตามกับฉัน ผลลัพธ์ควรแสดงความขัดแย้งในไฟล์ README:

ที่นี่เรายังมีข้อมูลมากมายให้ทำความเข้าใจและดื่มด่ำ นี่คือรายการของไฟล์ (ในกรณีของเราคือหนึ่งไฟล์) ที่มีข้อขัดแย้ง เราสามารถเลือกได้สามตัวเลือกคือ

  1. ยอมรับของคุณ — ยอมรับเฉพาะการเปลี่ยนแปลงจาก readme-improver
  2. ยอมรับของพวกเขา — ยอมรับการเปลี่ยนแปลงจากเจ้านายเท่านั้น
  3. รวม — เลือกด้วยตัวคุณเองว่าคุณต้องการเก็บอะไรและทิ้งอะไร

ยังไม่ชัดเจนว่ามีการเปลี่ยนแปลงอะไร หากมีการเปลี่ยนแปลงเป็นสาขาหลัก จำเป็นต้องมีการเปลี่ยนแปลงที่นั่น ดังนั้นเราจึงไม่สามารถยอมรับการเปลี่ยนแปลงของเราได้ ดังนั้น เราเลือกผสาน :

เราจะเห็นว่ามีสามส่วน:

  1. นี่คือการเปลี่ยนแปลงจากโปรแกรมปรับปรุง readme
  2. ผลลัพธ์ที่ผสาน สำหรับตอนนี้ สิ่งที่มีอยู่ก่อนการเปลี่ยนแปลง
  3. การเปลี่ยนแปลงจากสาขาหลัก

เราจำเป็นต้องสร้างผลลัพธ์ที่ผสานกันซึ่งจะทำให้ทุกคนพึงพอใจ เมื่อทบทวนสิ่งที่เปลี่ยนแปลงก่อนการเปลี่ยนแปลงของเรา เราพบว่าพวกเขาเพียงแค่ลบคำว่า "fully" ได้ไม่มีปัญหา! นั่นหมายความว่าเราจะลบออกในผลลัพธ์ที่ผสานแล้วเพิ่มการเปลี่ยนแปลงของเรา เมื่อเราแก้ไขผลลัพธ์ที่ผสานแล้ว เราสามารถคลิกใช้

จากนั้นการแจ้งเตือนจะปรากฏขึ้นเพื่อบอกเราว่าการรีเบสสำเร็จแล้ว:

ที่นั่น! เราแก้ไขข้อขัดแย้งแรกของเราผ่าน IntelliJ IDEA

ผลักดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ระยะไกล

ขั้นตอนต่อไปคือการผลักดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ระยะไกลและสร้างคำขอดึง ในการทำเช่นนี้ เพียงกดCTRL+SHIFT+ K จากนั้นเราจะได้รับ:

ทางด้านซ้ายจะมีรายการคอมมิชชันที่ยังไม่ได้ส่งไปยังที่เก็บระยะไกล ทางด้านขวาจะเป็นไฟล์ทั้งหมดที่มีการเปลี่ยนแปลง และนั่นแหล่ะ! กดPushแล้วคุณจะพบความสุข :)

หากพุชสำเร็จ คุณจะเห็นการแจ้งเตือนแบบนี้ที่มุมล่างขวา:

โบนัส: สร้างคำขอดึง

ไปที่ที่เก็บ GitHub แล้วเราจะเห็นว่า GitHub รู้แล้วว่าเราต้องการอะไร:

คลิกเปรียบเทียบ & ดึงคำขอ จากนั้นคลิกสร้างคำขอดึงข้อมูล เนื่องจากเราแก้ไขข้อขัดแย้งล่วงหน้า ตอนนี้เมื่อสร้างคำขอดึง เราสามารถผสานได้ทันที:

แค่นี้ก่อน!