ใช้ Git ฉันจะค้นหาการเปลี่ยนแปลงระหว่างท้องถิ่นและระยะไกลได้อย่างไร


152

นี่คือคำถามสองข้อที่แตกต่างกัน แต่ฉันคิดว่าพวกเขาเกี่ยวข้องกัน

  1. เมื่อใช้ Git ฉันจะค้นหาการเปลี่ยนแปลงใดที่ฉันได้ทำไปแล้ว แต่ยังไม่ได้ผลักไปยังสาขาระยะไกล hg outgoingฉันกำลังมองหาสิ่งที่คล้ายกับคำสั่ง Mercurial

  2. เมื่อใช้ Git ฉันจะค้นหาการเปลี่ยนแปลงของสาขาระยะไกลที่มีก่อนที่จะทำการดึงได้อย่างไร hg incomingฉันกำลังมองหาสิ่งที่คล้ายกับคำสั่ง Mercurial

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


11
เมื่อดูคำตอบดูเหมือนว่าจะมีความสับสนเกี่ยวกับสิ่งที่ทำhg incomingและhg outgoingทำจริง ค่า Git ที่ใกล้เคียงที่สุดที่ฉันพบคือ--dry-runตัวเลือก เพียงแค่git pull --dry-runคุณจะเห็นรายการของทุกสิ่งที่จะต้องเกิดขึ้น
Roman Starkov

คำตอบ:


97

Git ไม่สามารถส่งข้อมูลประเภทนั้นผ่านเครือข่ายเช่น Hg can แต่คุณสามารถเรียกใช้git fetch(ซึ่งเป็นhg pullมากกว่าhg fetch) เพื่อดึงข้อมูลการกระทำใหม่จากเซิร์ฟเวอร์ระยะไกลของคุณ

ดังนั้นถ้าคุณมีสาขาที่เรียกว่าmasterและระยะไกลที่เรียกว่าoriginหลังจากที่ทำงานคุณควรนอกจากนี้ยังมีสาขาที่เรียกว่าgit fetch origin/masterแล้วคุณจะได้รับgit logจากการกระทำทั้งหมดที่masterตอบสนองความต้องการที่จะเป็นซูเปอร์โดยการทำorigin/master git log master..origin/masterกลับด้านทั้งสองเพื่อให้ได้ตรงกันข้าม

hg incoming/outgoingเพื่อนของฉันเดวิดดอลลาร์ได้สร้างคู่ของเชลล์สคริปต์คอมไพล์เพื่อจำลอง คุณสามารถค้นหาได้ที่http://github.com/ddollar/git-utils


113

เริ่มต้นด้วย Git 1.7.0 มีไวยากรณ์พิเศษที่ช่วยให้คุณโดยทั่วไปหมายถึงสาขาต้นน้ำ: หรือ@{u}@{upstream}

เพื่อเลียนแบบhg incoming:

git log ..@{u}

เพื่อเลียนแบบhg outgoing:

git log @{u}..

ฉันใช้สิ่งต่อไปนี้incomingและoutgoingชื่อแทนเพื่อให้ใช้งานได้ง่ายขึ้น:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

git log .. @ {u} ให้ข้อผิดพลาดกับฉัน (ฉันมีทั้งที่มาและที่เก็บอัปสตรีมในการตั้งค่า git ของฉัน) ข้อผิดพลาด: ไม่พบสาขาต้นน้ำสำหรับ '' ข้อผิดพลาด: ไม่พบสาขาอัปสตรีมสำหรับ '.. ' ข้อผิดพลาด: ไม่พบสาขาอัปสตรีมสำหรับ '.. ' ร้ายแรง: อาร์กิวเมนต์ที่คลุมเครือ '.. @ {u}': การแก้ไขที่ไม่รู้จักหรือเส้นทางที่ไม่อยู่ ต้นไม้ทำงาน ใช้ '-' เพื่อแยกเส้นทางจากการแก้ไข
Henrik

6
คุณจะได้รับข้อผิดพลาดเหล่านั้นหากสาขาท้องถิ่นของคุณไม่ได้รับการกำหนดค่าด้วยอัปสตรีม git branch --set-upstream foo origin/fooในการแก้ไขปัญหาการทำงาน
Richard Hansen

git log @{u}..แสดงทุกการเปลี่ยนแปลงเดียวใน repo ให้ฉัน ยังไม่มีวิธีที่พวกเขายังไม่มี
Roman Starkov

@romkyns: เป็นไปได้ว่าสาขาในพื้นที่ของคุณมีสาขาระยะไกลผิดที่กำหนดค่าเป็นอัปสตรีม ตรวจสอบให้แน่ใจว่าgit rev-parse --symbolic-full-name @{u}พิมพ์การอ้างอิงระยะไกลที่เหมาะสม นอกจากนี้ยังgit log @{u}..แสดงการกระทำที่ไม่สามารถเข้าถึงได้โดยสาขาต้นน้ำซึ่งสามารถรวมการกระทำที่มีอยู่แล้วในที่เก็บระยะไกล (ถ้าสามารถเข้าถึงได้โดยการอ้างอิงที่แตกต่างกัน) สิ่งนี้จะเกิดขึ้นทันทีหลังจากที่คุณรวมสาขาที่ผลักดันไว้แล้ว
Richard Hansen

@RichardHansen ฉันกลัวฉันเกินไป noob ที่จะรู้ว่าสิ่งที่จะเป็นที่เหมาะสมสำหรับการอ้างอิงระยะไกลอย่างไรก็ตามเรื่องนี้เป็น repo โคลนสดใหม่ที่ฉันไม่เพียงและcheckout <somebranch> merge <otherbranch>เมื่อมาถึงจุดนี้ฉันได้log @{u}..และเห็นการเปลี่ยนแปลงทุกรายการ
Roman Starkov

42

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

git diff master origin / master


1
ทำงานให้ฉัน (แต่วิธีอื่น ๆ ) -git diff origin/master master
นิค Grealy

34
  1. ใช้ "ต้นกำเนิดบันทึก git .. HEAD"

  2. ใช้ "git fetch" แล้วตามด้วย "git log HEAD..origin" คุณสามารถเลือกรับเชอร์รี่แต่ละรายการโดยใช้รหัสกระทำที่ระบุไว้

แน่นอนว่าข้างต้นถือว่า "ต้นกำเนิด" เป็นชื่อของสาขาการติดตามระยะไกลของคุณ (ซึ่งก็คือถ้าคุณใช้โคลนด้วยตัวเลือกเริ่มต้น)


3
(และถ้าคุณไม่ได้ติดตามสาขาที่ห่างไกลก็“เข้าสู่ระบบคอมไพล์กำเนิด / master..HEAD”.)
plindberg

4
"Origin" ไม่ใช่ชื่อของสาขาการติดตามระยะไกล แต่เป็นชื่อของ Remote และเพียงแค่ระบุชื่อรีโมตใช้งานไม่ได้คุณต้องระบุสาขาการติดตามระยะไกลซึ่งจะเป็นที่มา / มาสเตอร์
robinst

22

นอกจากนี้ยังมีสิ่งนี้สำหรับการเปรียบเทียบสาขาทั้งหมด:

git log --branches --not --remotes=origin

นี่คือสิ่งที่หน้า man log git พูดเกี่ยวกับสิ่งนี้:

แสดงการกระทำทั้งหมดที่อยู่ในสาขาท้องถิ่นใด ๆ แต่ไม่อยู่ในสาขาการติดตามระยะไกลใด ๆ สำหรับแหล่งกำเนิด (สิ่งที่คุณมีต้นกำเนิดนั้นไม่ได้)

outgoingข้างต้นเป็นสำหรับ สำหรับincomingเพียงสลับ:

git log --remotes=origin --not --branches

8

ฉันจะทำ

$ git fetch --dry-run

สำหรับhg incomingและ

$ git push --dry-run

hg outgoingสำหรับ


ขออภัยฉันมองข้ามสิ่งนี้ถูกพูดไปแล้วว่าเป็นความคิดเห็นของ OP
chris

1

git-outเป็นสคริปต์ที่เลียนแบบได้hg outgoingค่อนข้างแม่นยำ แยกวิเคราะห์ในเอาต์พุต "push -n" ดังนั้นจึงสร้างเอาต์พุตที่ถูกต้องหากคุณต้องการระบุอาร์กิวเมนต์เพิ่มเติมเพื่อส่ง


0

คอมไพล์เข้ามา

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

คอมไพล์ออก

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

0

เมื่อคำตอบ "git log" และ @ {u} ให้ข้อผิดพลาด "ไม่ทราบการแก้ไข" ครั้งแรกฉันลองใช้คำแนะนำของ Chris / romkyns git push --dry-runข้อเสนอแนะของ

คุณจะได้รับผลลัพธ์เช่น "5905..4878 master-> master" 5905 เป็นความมุ่งมั่นล่าสุดที่รีโมทมีและกระทำผ่าน (และรวมถึง) 4878 จะถูกนำไปใช้กับรีโมต

จากนั้นคุณสามารถใช้ 5905..4878 เป็นอาร์กิวเมนต์สำหรับคำสั่ง git อื่น ๆ เพื่อรับรายละเอียดเพิ่มเติม:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

เมื่อคุณเรียก git เนื้อหาทั้งหมดรวมถึง branch แท็ก (refs) จะถูกเก็บไว้ชั่วคราวใน. git / FETCH_HEAD ซึ่งเนื้อหาสามารถดูได้ด้วยคำสั่ง: บันทึก git FETCH_HEAD หากคุณไม่ใช้คำต่อท้าย -a ด้วย git fetch จากนั้นตามค่าเริ่มต้น เนื้อหาของ FETCH_HEAD จะถูกเขียนทับด้วยเนื้อหาใหม่ จากเนื้อหาเหล่านี้คุณสามารถดูและตัดสินใจว่าสาขาใดที่คุณต้องการรวมถ้าคุณทำหรือคุณสามารถเลือกเชอร์รี่ง่ายๆถ้าคุณต้องการเพียงไม่กี่คอมมิตจากสิ่งที่ได้มาจากการดึง

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