ในแง่ง่ายๆถ้าคุณกำลังจะกระโดดขึ้นไปบนเครื่องบินได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ตใด ๆ ... git fetch origin <master>
ก่อนที่จะแยกย้ายคุณก็สามารถทำ มันจะดึงข้อมูลการเปลี่ยนแปลงทั้งหมดในคอมพิวเตอร์ของคุณ แต่ให้แยกจากการพัฒนา / พื้นที่ทำงานในท้องถิ่นของคุณ
บนเครื่องบินคุณสามารถเปลี่ยนแปลงเวิร์กสเปซในพื้นที่แล้วรวมกับสิ่งที่คุณดึงมาและแก้ไขข้อขัดแย้งที่อาจเกิดขึ้นได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต และถ้าไม่มีใครทำการเปลี่ยนแปลงที่ขัดแย้งกันใหม่กับที่เก็บระยะไกลจากนั้นเมื่อคุณมาถึงปลายทางที่คุณจะทำgit push origin <branch>
และไปรับกาแฟของคุณ
จากการกวดวิชา Atlassian ที่น่ากลัวนี้:
การgit fetch
ดาวน์โหลดคำสั่งจะคอมมิชชันไฟล์และอ้างอิงจากที่เก็บระยะไกลลงในที่เก็บในเครื่องของคุณ
การดึงข้อมูลคือสิ่งที่คุณทำเมื่อคุณต้องการที่จะเห็นสิ่งที่ทุกคนอื่น ๆได้รับการทำงานใน คล้ายกับการอัปเดต SVN ซึ่งช่วยให้คุณเห็นว่าประวัติกลางมีความคืบหน้าอย่างไร แต่ไม่ได้บังคับให้คุณรวมการเปลี่ยนแปลงในที่เก็บจริงของคุณ Git แยกเนื้อหาลึกซึ้งเป็นจากเนื้อหาที่มีอยู่ในท้องถิ่นก็มีอย่างแน่นอน
ไม่มีผลกระทบต่อการพัฒนาท้องถิ่นของคุณ เนื้อหาที่ดึงมาจะต้องมีการตรวจสอบอย่างชัดเจนโดยใช้git checkout
คำสั่ง สิ่งนี้ทำให้การดึงข้อมูลวิธีที่ปลอดภัยในการตรวจสอบการกระทำก่อนที่จะรวมเข้ากับที่เก็บในเครื่องของคุณ
เมื่อดาวน์โหลดเนื้อหาจากที่เก็บระยะไกลgit pull
และgit fetch
มีคำสั่งให้ทำงานให้สำเร็จ คุณสามารถพิจารณา
git fetch
คำสั่งสองเวอร์ชันในเวอร์ชัน 'ปลอดภัย' มันจะดาวน์โหลดเนื้อหาระยะไกล แต่ไม่อัปเดตสถานะการทำงานของพื้นที่เก็บข้อมูลในท้องถิ่นของคุณปล่อยให้งานปัจจุบันของคุณยังคงอยู่ git pull
เป็นทางเลือกที่ก้าวร้าวมากขึ้นมันจะดาวน์โหลดเนื้อหาระยะไกลสำหรับสาขาท้องถิ่นที่ใช้งานอยู่และดำเนินการทันทีgit merge
เพื่อสร้างการผสานการกระทำสำหรับเนื้อหาระยะไกลใหม่ หากคุณมีการเปลี่ยนแปลงที่รอดำเนินการสิ่งนี้จะทำให้เกิดข้อขัดแย้งและแจ้งกำหนดการไหลของการแก้ไขข้อขัดแย้ง
ด้วยgit pull
:
- คุณไม่ได้อยู่คนเดียว
- มันมีผลต่อการพัฒนาท้องถิ่นของคุณ
- ไม่จำเป็นต้องเช็คเอาต์อย่างชัดเจน
git merge
เพราะมันไม่ได้โดยปริยาย
- มันไม่ปลอดภัย มันก้าวร้าว
- ซึ่งแตกต่างจาก
git fetch
ที่มีผลกับคุณเพียงอย่างเดียวการ.git/refs/remotes
ดึง git จะส่งผลต่อทั้งของคุณ.git/refs/remotes
และ .git/refs/heads/
อืม ... ดังนั้นหากฉันไม่ได้อัปเดตสำเนาที่ใช้งานด้วยgit fetch
ฉันจะทำการเปลี่ยนแปลงที่ไหน Git ดึงข้อมูลมาจากการคอมมิทใหม่
เป็นคำถามที่ดีมาก มันทำให้มันแยกจากสำเนาการทำงานของคุณ แต่อีกครั้งที่ไหน มาหาคำตอบกัน
ในไดเรกทอรีโครงการของคุณ (เช่นที่คุณทำgit
คำสั่งของคุณ) ทำ:
ls
. นี่จะแสดงไฟล์ & ไดเรกทอรี ไม่มีอะไรเจ๋งฉันรู้
ls -a
ตอนนี้ทำ นี้จะแสดงไฟล์จุดคือไฟล์ที่เริ่มต้นด้วยแล้วคุณจะสามารถดูไดเรกทอรีชื่อ:.
.git
cd .git
Do สิ่งนี้จะเปลี่ยนไดเรกทอรีของคุณอย่างชัดเจน
- ตอนนี้ส่วนที่สนุกมา;
ls
ทำ คุณจะเห็นรายการไดเรกทอรี refs
เรากำลังมองหา cd refs
Do
- เป็นที่น่าสนใจที่จะเห็นสิ่งที่อยู่ในไดเรกทอรีทั้งหมด แต่ลองมุ่งเน้นที่สองของพวกเขา และ
heads
remotes
ใช้cd
ตรวจสอบภายในพวกเขาด้วย
- ใด ๆ
git fetch
ที่คุณทำจะปรับปรุงรายการใน/.git/refs/remotes
ไดเรกทอรี มันจะไม่อัปเดตอะไรใน/.git/refs/heads
ไดเรกทอรี
- สิ่งใดก็ตามที่
git pull
จะทำgit fetch
อัปเดตรายการใน/.git/refs/remotes
ไดเรกทอรีก่อนจากนั้นจึงรวมกับเครื่องของคุณแล้วเปลี่ยนส่วนหัวภายใน/.git/refs/heads
ไดเรกทอรี
คำตอบที่เกี่ยวข้องที่ดีมากสามารถพบได้ใน'git fetch' วางอยู่ที่ไหน .
นอกจากนี้ให้มองหา "เครื่องหมายสแลช" จากโพสต์การประชุมการตั้งชื่อสาขา Git มันช่วยให้คุณเข้าใจได้ดีขึ้นว่า Git วางสิ่งต่าง ๆ ในไดเรกทอรีต่าง ๆ อย่างไร
เพื่อดูความแตกต่างที่แท้จริง
แค่ทำ:
git fetch origin master
git checkout master
หากมีการอัปเดตต้นแบบระยะไกลคุณจะได้รับข้อความเช่นนี้:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
หากคุณไม่ทำfetch
และเพิ่งทำgit checkout master
คอมไพล์ท้องถิ่นของคุณจะไม่รู้ว่ามีการเพิ่ม 2 คอมมิท และมันก็จะบอกว่า:
Already on 'master'
Your branch is up to date with 'origin/master'.
แต่นั่นล้าสมัยและไม่ถูกต้อง เป็นเพราะคอมไพล์จะให้ข้อเสนอแนะแก่คุณเพียงอย่างเดียวตามสิ่งที่รู้ เป็นเรื่องที่ลืมไปแล้วว่าสิ่งใหม่ ๆ ที่ยังไม่ได้ดึงลงมา ...
มีวิธีใดบ้างที่จะเห็นการเปลี่ยนแปลงใหม่ที่เกิดขึ้นในระยะไกลขณะทำงานกับสาขาในพื้นที่หรือไม่
IDE บางตัว (เช่น Xcode) นั้นสุดยอดและใช้ผลลัพธ์ของ a git fetch
และสามารถใส่คำอธิบายประกอบบรรทัดของรหัสที่มีการเปลี่ยนแปลงในสาขาระยะไกลของสาขาที่ทำงานปัจจุบันของคุณ หากบรรทัดนั้นได้รับการเปลี่ยนแปลงทั้งจากการเปลี่ยนแปลงในท้องถิ่นและสาขาระยะไกลแสดงว่าบรรทัดนั้นได้รับการเพิ่มความคิดเห็นด้วยสีแดง นี่ไม่ใช่ความขัดแย้งผสาน มันเป็นความขัดแย้งที่อาจเกิดขึ้นได้ มันเป็น headsup ที่คุณสามารถใช้เพื่อแก้ไขข้อขัดแย้งการรวมในอนาคตก่อนที่จะทำgit pull
จากสาขาระยะไกล
เคล็ดลับความสนุก:
หากคุณดึงสาขาระยะไกลเช่นทำ:
git fetch origin feature/123
จากนั้นจะเข้าสู่ไดเรกทอรีรีโมตของคุณ ยังไม่พร้อมใช้งานสำหรับไดเรกทอรีท้องถิ่นของคุณ อย่างไรก็ตามมันทำให้การเช็คเอาต์ของคุณไปยังสาขาระยะไกลนั้นง่ายขึ้นโดย DWIM (ทำในสิ่งที่ฉันหมายถึง):
git checkout feature/123
คุณไม่จำเป็นต้องทำ:
git checkout -b feature/123 origin/feature/123
อ่านเพิ่มเติมได้ที่นี่