Git: จะตรวจสอบได้อย่างไรว่า repo ท้องถิ่นเป็นปัจจุบันหรือไม่?


85

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

จะตรวจสอบได้อย่างไรโดยไม่ต้องทำgit fetchหรือgit pull?

คำตอบ:


96

ลองgit fetch --dry-run ใช้คู่มือ ( git help fetch) ว่า:

--dry-run
Show what would be done, without making any changes.

3
ขอบคุณ! แม้ว่าจะยากที่จะเข้าใจว่าไฟล์ใดถูกเพิ่ม / แก้ไข / ลบออก
Misha Moroshko

1
คุณจะได้เห็นว่ามีการอัปเดตแท็กอะไรบ้างและช่วงเริ่มต้น .. ส่งคอมมิตสำหรับสาขาต่างๆ หากยังไม่เพียงพอให้ทำเป็นการดึงข้อมูลที่เหมาะสม (ไม่ดึง) ซึ่งจะให้สำเนารีโมตในเครื่องที่เหมาะสมแยกต่างหากโดยไม่ส่งผลกระทบต่องานสาขาของคุณเอง การดึงจะพยายามรวมทั้งสองเข้าด้วยกันซึ่งไม่ใช่สิ่งที่คุณต้องการ การถ่ายโอนข้อมูลจะเหมือนกันไม่ว่าคุณจะ - ทำงานแบบแห้งหรือไม่ก็ตาม
Philip Oakley

4
ทำไมเวลาวิ่งgit fetch --dry-runไม่มีอะไรโผล่มา
Paramvir Singh Karwal

3
@ParamvirSinghKarwal Git เบาบางในสิ่งที่รายงาน ถ้าไม่มีอะไรจะพูดมันก็บอกว่าไม่มีอะไรเหมือนไม่มีอะไรเกิดขึ้น บางทีคุณอาจอัปเดตข้อมูลอ้างอิงของการดึงข้อมูลตามปกติแล้ว อาจจะเพิ่ม--all?
Philip Oakley

2
@AaronBeall หากเป็นเช่นนั้นก็เป็นไปได้มากว่าคุณได้ดึงการเปลี่ยนแปลงเหล่านั้นมาแล้วในเครื่อง (จึงไม่มีอะไรให้ดึง) แต่ยังไม่ได้รวมเข้ากับสาขาของคุณ git pullเทียบเท่ากับไฟล์git fetch && git merge. หากเมื่อใดก็ตามที่คุณเรียกใช้การดึงข้อมูลโดยไม่มีสิ่ง--dry-runนั้นแสดงว่าคุณได้ดึงข้อมูลมาแล้ว
DuckPuppy

36
git remote show origin

ผลลัพธ์:

HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date) <-------

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

28

ใช้ครั้งแรกgit remote updateเพื่อปรับปรุงการอ้างอิงระยะไกลของคุณให้ทันสมัย จากนั้นคุณสามารถทำอย่างใดอย่างหนึ่งจากหลาย ๆ สิ่งเช่น:

  1. git status -unoจะบอกคุณว่าสาขาที่คุณกำลังติดตามอยู่ข้างหน้าข้างหลังหรือมีการแยกทางกัน หากไม่มีข้อความระบุว่า local และ remote จะเหมือนกัน ตัวอย่างผลลัพธ์:

ในสาขา DEV

สาขาของคุณอยู่เบื้องหลัง 'ต้นทาง / DEV' 7 คอมมิตและสามารถส่งต่อได้อย่างรวดเร็ว

(ใช้ "git pull" เพื่ออัปเดตสาขาในพื้นที่ของคุณ)

  1. git show-branch *master จะแสดงให้คุณเห็นการกระทำในทุกสาขาที่มีชื่อลงท้ายด้วย 'master' (เช่น master และ origin / master)

หากคุณใช้-vกับ git remote update ( git remote -v update) คุณจะเห็นว่าสาขาใดได้รับการอัปเดตดังนั้นคุณจึงไม่ต้องการคำสั่งเพิ่มเติม


2
ทำไมถึงตกต่ำขนาดนี้ git remote update ; git status -unoแก้ไขได้ git fetch --dry-runไม่ให้เอาต์พุตแม้ในกรณีที่โลคัลอยู่หลังรีโมต
Aaron Beall

17

คุณสามารถใช้git status -unoเพื่อตรวจสอบว่าสาขาในพื้นที่ของคุณเป็นปัจจุบันกับสาขาต้นทางหรือไม่


19
จะให้เฉพาะสถานะท้องถิ่นไม่ได้ตรวจสอบกับสาขาระยะไกล
Ishan Liyanage

4
ให้เฉพาะในพื้นที่ แต่git remote update ; git status -unoได้เคล็ดลับ! git fetch --dry-runให้ผลลัพธ์ออกมาเมื่อผมคาดว่ามัน (และgit pullจะดึงสิ่งที่)
Aaron Beall

1
คำตอบนี้ไม่ถูกต้องและควรลบทิ้ง ตามที่เป็นอยู่มันทำให้ตำนานที่พบบ่อยมาก แต่ผิดเกี่ยวกับวิธีการทำงานของ Git ซึ่งจะถูกปัดเป่าเมื่อ / ถ้ามีคนตัดสินใจอ่านความคิดเห็นนั้น
Prometheus

8

ไม่จริง - แต่ฉันไม่เห็นว่าgit fetchจะเจ็บแค่ไหนเพราะมันจะไม่เปลี่ยนสาขาในพื้นที่ของคุณ


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

5

อีกทางเลือกหนึ่งคือการดูสถานะของสาขาระยะไกล git show-branch remote/branchเพื่อใช้เป็นการเปรียบเทียบที่คุณสามารถดูgit show-branch *branchเพื่อดูสาขาในรีโมททั้งหมดรวมถึงที่เก็บของคุณ! ตรวจสอบคำตอบนี้สำหรับข้อมูลเพิ่มเติมhttps://stackoverflow.com/a/3278427/2711378


5

คุณจะต้องออกคำสั่งสองคำสั่ง:

  1. git ดึงต้นกำเนิด
  2. สถานะคอมไพล์

1
วิธีนี้ใช้ได้ผล แต่คำถามนั้นบอกอย่างชัดเจนโดยไม่ต้อง "ดึงข้อมูล" มีหลายกรณีที่คุณต้องการทราบว่า repo ในพื้นที่ของคุณแตกต่างจาก repo ระยะไกลโดยไม่ดึงหรือรวมการเปลี่ยนแปลงเข้าด้วยกันอย่างไร
pedram bashiri

1
@pedrambashiri ฉันอยากรู้อยากเห็นจริงๆเหมือนอะไร? สำหรับความรู้ของฉันการดึงข้อมูลเพียงอย่างเดียวไม่สามารถทำอันตรายอะไรได้
Prometheus

สิ่งแรก @Prometheus ฉันแค่อยากจะชี้ให้เห็นว่าเมื่อคำถามระบุอย่างชัดเจนว่า 'โดยไม่ต้องดึงข้อมูล' คุณก็ไม่สามารถใช้การดึงข้อมูลในคำตอบของคุณได้หากไม่มีวิธีอื่นที่จะทำหรือไม่มีกรณีที่แท้จริงสำหรับการทำโดยไม่จำเป็นต้องใช้ ที่จะอธิบายในคำตอบ แต่เพื่อตอบคำถามของคุณการดึงข้อมูลจะอัปเดตสำเนา repo ระยะไกลในเครื่องของคุณ ดูแผนภาพในโพสต์นี้blog.osteele.com/2008/05/my-git-workflow
pedram bashiri

4

คุณต้องรันgit fetchก่อนจึงจะเปรียบเทียบที่เก็บในเครื่องของคุณกับไฟล์บนเซิร์ฟเวอร์ระยะไกลของคุณได้

คำสั่งนี้จะปรับปรุงเฉพาะสาขาการติดตามระยะไกลของคุณและจะไม่ส่งผลกระทบต่อ worktree คุณจนกว่าคุณจะโทรหรือgit mergegit pull

หากต้องการดูความแตกต่างระหว่างสาขาในพื้นที่ของคุณและสาขาการติดตามระยะไกลของคุณเมื่อคุณดึงข้อมูลมาแล้วคุณสามารถใช้git diff หรือ git cherry ตามที่อธิบายไว้ที่นี่


2

ถ้าคุณใช้

git fetch --dry-run -v <link/to/remote/git/repo>

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


1

นี้เป็นไปไม่ได้โดยไม่ต้องใช้หรือgit fetch git pullคุณจะรู้ได้อย่างไรว่าที่เก็บนั้น "ทันสมัย" หรือไม่โดยไม่ต้องไปที่ที่เก็บระยะไกลเพื่อดูว่า "เป็นปัจจุบัน" หมายถึงอะไร


5
ขอยืนยัน! คุณแค่ตอบสิ่งที่คุณคิด! คุณควรระวังให้มากขึ้นเพราะมือใหม่จะป่วน!
Amanuel Nega

4
@AmanuelNega: นี่เป็นเพียงตรรกะพื้นฐาน หากคุณต้องการทราบว่า repo ในพื้นที่ของคุณอยู่ในสถานะเดียวกับ repo ระยะไกลหรือไม่คุณจำเป็นต้องทราบสถานะของ repo ระยะไกล ระยะเวลา หากคุณไม่ทราบสถานะของ repo ระยะไกลคุณอาจไม่สามารถทราบได้ว่า repo ในเครื่องอยู่ในสถานะเดียวกันหรือไม่ โปรดทราบว่าคำตอบที่ได้รับการโหวตและได้รับการยอมรับสูงสุดใช้git pullซึ่ง OP ห้ามอย่างชัดเจนในคำถามของเขา
Jörg W Mittag

2
รับทราบ! git status -unoใช้งานได้และยังสามารถใช้git show-branch *masterเพื่อดูสถานะของสาขาหลักทั้งหมด! คุณยังบอกว่ามันเป็นไปไม่ได้? คุณสามารถดูสถานะของสาขาใดก็ได้ตราบเท่าที่คุณสามารถเข้าถึงรีโมทได้!
Amanuel Nega

2
@AmanuelNega: git statusบอกสถานะของการอ้างอิงในพื้นที่ของคุณเท่านั้น แต่ไม่ได้บอกคุณว่าการอ้างอิงในพื้นที่ของคุณเป็นปัจจุบันหรือไม่โดยอ้างอิงจากระยะไกล อีกครั้ง: มันเป็นไปไม่ได้ในทางเหตุผลที่จะรู้ว่าสถานะของ repo ระยะไกลเป็นอย่างไรโดยไม่ได้รับสถานะของ repo ระยะไกล ระยะเวลา นี่เป็นเพียงกฎพื้นฐานของกาลอวกาศ
Jörg W Mittag

6
มันไม่ใช่เรื่องที่เป็นไปไม่ได้เพราะเห็นได้ชัดว่าตัวเองสามารถโทรหาใครบางคนในห้องเซิร์ฟเวอร์ของคุณและพูดว่า "แฮชของ HEAD ของคุณในสาขาหลักคืออะไร" พวกเขาสามารถบอกคุณได้จากนั้นคุณสามารถตรวจสอบในพื้นที่และดูว่าคุณไม่ ไม่มีแฮชนั้น ตอนนี้คุณรู้แล้วว่าพวกเขาไม่ซิงค์กัน
James Robinson

1

พยายามจัดรูปแบบคำตอบของฉัน แต่ทำไม่ได้โปรดทีม stackoverflow ทำไมการโพสต์คำตอบจึงยากมาก

ไม่มีวันหมด

คำตอบ:
git fetch
สถานะ git ต้นทาง(คุณจะเห็นผลลัพธ์เช่น "สาขาของคุณอยู่ข้างหลัง" origin / master "โดย 9 commits")
เพื่ออัปเดตการเปลี่ยนแปลงระยะไกล: git pull

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.