จะตรวจสอบการเปลี่ยนแปลงที่เก็บ Git ระยะไกล (ที่มา) ได้อย่างไร?


249

คำถาม

คำสั่ง Git ในการทำเวิร์กโฟลว์ต่อไปนี้คืออะไร?

สถานการณ์

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

  1. ตรวจสอบว่ามีการกระทำใหม่จากคนอื่น ๆ บนพื้นที่เก็บข้อมูลระยะไกลคือoriginอะไร?

  2. บอกว่ามี 3 กระทำใหม่บนพื้นที่เก็บข้อมูลระยะไกลตั้งแต่ดึงสุดท้ายของฉันฉันต้องการจะ diff กระทำที่เก็บระยะไกลเช่น HEAD~3กับHEAD~2, HEAD~2ด้วย HEAD~1และมีHEAD~1HEAD

  3. หลังจากทราบว่ามีการเปลี่ยนแปลงอะไรจากระยะไกลฉันต้องการได้รับข้อผูกพันล่าสุดจากผู้อื่น

การค้นพบของฉันจนถึงขณะนี้

สำหรับขั้นตอนที่ 2: ฉันรู้ว่าสัญกรณ์รูปหมวกHEAD^, HEAD^^ฯลฯ และสัญกรณ์ตัวหนอนHEAD~2, HEAD~3ฯลฯ

สำหรับขั้นตอนที่ 3: git pullนั่นคือผมคิดว่าเป็นเพียงแค่



@Daniele ที่ตอบว่าคุณกำลังเชื่อมโยงไปยังยอดเยี่ยมและยังมาพร้อมกับสคริปต์ทุบตีที่ปรับแต่งได้ +1
gorbysbm

คำตอบ:


255

คุณสามารถgit fetch originอัปเดตสาขาระยะไกลในที่เก็บของคุณให้ชี้ไปที่เวอร์ชันล่าสุด สำหรับความแตกต่างกับรีโมท:

git diff origin/master

ใช่คุณสามารถใช้เครื่องหมายรูปหมวกด้วยเช่นกัน

หากคุณต้องการยอมรับการเปลี่ยนแปลงระยะไกล:

git merge origin/master

34
ความต่างดูกลับกัน ฉันพบว่าการใช้งานง่ายขึ้นgit diff HEAD origin/masterดังนั้น diff จะแสดงสิ่งที่จะนำไปใช้ถ้าฉันยอมรับการเปลี่ยนแปลงระยะไกล
cbliard

2
"git fetch origin" และ "git show-branch * master" มีประโยชน์สำหรับฉัน
Léa Massiot

159
git remote update && git status 

พบสิ่งนี้ในคำตอบเพื่อตรวจสอบว่าจำเป็นต้องใช้ pull ใน Git หรือไม่

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

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

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

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


ไม่พอ. ฉันจะต้องทำgit pull <remote> <branch>หลังจากนั้นทันทีที่ฉันต้องการผลักดันเพราะส่วนปลายของสาขาในพื้นที่ของฉันอยู่หลังคู่กันระยะไกล
Overdrivr

3
@ Overdrivr คำถามถามหาวิธีตรวจสอบการเปลี่ยนแปลงก่อนที่จะรับค่าคอมมิชชันไปยังสาขาท้องถิ่น ใช่คุณต้องอัพเดทสาขาในพื้นที่ของคุณหลังจากตรวจสอบการเปลี่ยนแปลง
Rajani Karuturi

นี่สำหรับการเริ่มต้นจากระยะไกลหรือต้นน้ำหรือไม่?
vikramvi

1
ตัวเลือก -v นั้นใช้งานไม่ได้ สำหรับgit remote update -vฉันได้แล้วerror: unknown switch `v'
Shad

1
@Shad ที่คุณควรทำgit remote -v updateไม่ได้git remote update -v
Rajani Karuturi

34

วิธีที่ดีที่จะมีมุมมองแบบสังเคราะห์ว่าเกิดอะไรขึ้นกับ "จุดเริ่มต้น" คือ:

git remote show origin

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

24

ฉันแค่ใช้

git remote update
git status

หลังจากนั้นรายงานว่ามีกี่คนที่อยู่เบื้องหลังท้องถิ่นของฉัน (ถ้ามี)

แล้วก็

git pull origin master

เพื่อทำให้ท้องถิ่นของฉันทันสมัย ​​:)


13

คำถามปกติของฉันค่อนข้าง "มีอะไรใหม่หรือเปลี่ยนแปลงใน repo" ดังนั้นwhatchangedจึงมีประโยชน์ พบว่าที่นี่

git whatchanged origin/master -n 1

1
ไม่มีคำสั่งใหม่นี้ ขอบคุณ นี่คือสิ่งที่ฉันกำลังมองหา
Saurabh Jain

11

ทางออกหนึ่งที่มีศักยภาพ

ขอบคุณวิธีแก้ปัญหาของ Alan Haggai Alaviฉันได้มาพร้อมกับเวิร์กโฟลว์ที่มีศักยภาพต่อไปนี้:

ขั้นตอนที่ 1:

git fetch origin

ขั้นตอนที่ 2:

git checkout -b localTempOfOriginMaster origin/master
git difftool HEAD~3 HEAD~2
git difftool HEAD~2 HEAD~1
git difftool HEAD~1 HEAD~0

ขั้นตอนที่ 3:

git checkout master
git branch -D localTempOfOriginMaster
git merge origin/master

13
ทำไมคุณต้องสร้างสาขาชั่วคราวสำหรับความแตกต่างระหว่างการแก้ไขรีโมต คุณสามารถทำได้git diff origing/master^ origing/master^^
Pablo Marin-Garcia

@ PabloMarin-Garcia: ขอบคุณ ตอนนั้นฉันไม่รู้
Lernkurve

2

git statusไม่แสดงความแตกต่างระหว่างต้นแบบและที่มา / ต้นแบบเสมอแม้จะมีการดึงข้อมูล หากคุณต้องการให้ชุดค่าผสมgit fetch origin && git statusทำงานได้คุณจะต้องระบุข้อมูลการติดตามระหว่างสาขาท้องถิ่นกับที่มา:

# git branch --set-upstream-to=origin/<branch> <branch>

สำหรับสาขาหลัก:

git branch --set-upstream-to=origin/master master

0

เนื่องจากมันยังไม่ได้รับการแนะนำจนถึงตอนนี้ ... และฉันคิดว่ามันมีประโยชน์มาก ...

ฉันแค่ใช้

git fetch origin

เพื่อเรียกการเปลี่ยนแปลงระยะไกลจากนั้นฉันดูทั้งการกระทำระยะไกลในท้องถิ่นและรอดำเนินการ (และการเปลี่ยนแปลงที่เกี่ยวข้อง) ด้วยเครื่องมือ gitk ที่ดี ( https://git-scm.com/docs/gitk ) ที่เกี่ยวข้องกับอาร์กิวเมนต์ - ทั้งหมดเช่น

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