วิธีดูตัวอย่าง git-pull โดยไม่ดึงข้อมูลออกมา?


204

เป็นไปได้ไหม

โดยทั่วไปมีพื้นที่เก็บข้อมูลระยะไกลที่ฉันดึงใช้เพียง:

git pull

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


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

ขอบคุณ dkagedal ฉันเขียนสิ่งนี้ก่อนที่ฉันจะเข้าใจอย่างถ่องแท้ว่า Git ทำงานอย่างไร ฉันลบการแก้ไขนั้น
Milan Babuškov

คำตอบ:


233

หลังจากทำ a git fetchแล้วให้ทำgit log HEAD..origin/masterเพื่อแสดงรายการบันทึกระหว่างคอมมิชชันล่าสุดของคุณกับสาขาหลักของต้นกำเนิด หากต้องการแสดง diffs ให้ใช้git log -p HEAD..origin/masterเพื่อแสดงแต่ละ patch หรือgit diff HEAD...origin/master(สามจุดไม่ใช่สอง) เพื่อแสดง diff ต่างกัน

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

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


ฉันคิดว่าฉันพลาดส่วนหนึ่งของ 'ไม่มีส่วนเกี่ยวข้องกับสาขาของฉัน' ในขณะที่อ่านเอกสาร ขอบคุณ
Milan Babuškov

1
ด้วยเหตุผลบางอย่างที่ไม่ได้ผลสำหรับฉัน ฉันลอง git diff HEAD ... origin / master และมันไม่ได้แสดงรายการการเปลี่ยนแปลงใด ๆ เลยเมื่อฉัน 'pull master master' จะดึงข้อมูลและผสานการเปลี่ยนแปลง นั่นเป็นเพราะฉันตั้งค่าที่เก็บระยะไกลโดยใช้ git remote add หรือไม่
screenm0nkey

@ screenm0nkey: ฉันไม่รู้ (โดยไม่รู้ข้อมูลเพิ่มเติม) ฉันขอแนะนำให้เปิดคำถามใหม่เพื่อถามเกี่ยวกับเรื่องนี้หากคุณยังไม่แน่ใจ
เกร็กฮิวกิล

1
อะไรที่เหมาะกับฉัน (หลังจากเรียก git): ต้นกำเนิดบันทึก git / master
slaman

2
git diff ...@{u}เหมือนกับgit diff HEAD...origin/masterว่าที่มา / ปรมาจารย์เป็นสาขาอัป
สตรีม

47

ฉันคิดว่าการเรียก gitนั้นเป็นสิ่งที่คุณมองหา

มันจะดึงการเปลี่ยนแปลงและวัตถุโดยไม่ส่งไปยังดัชนี repo ของคุณ

พวกเขาสามารถผสานภายหลังที่มีการผสานคอมไพล์

หน้าคน

แก้ไข: การสำรวจเพิ่มเติม

ส่งตรงจากลิงก์Crash Course ของ Git- SVN

ทีนี้คุณจะได้รับการเปลี่ยนแปลงใหม่ ๆ จาก repository ระยะไกลได้อย่างไร? คุณดึงพวกเขา:

git fetch http://host.xz/path/to/repo.git/ 

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

git log origin 

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

git merge origin

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

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

ฉันแค่พยายามทำสิ่งนี้โดยตัวอย่างและหน่วยความจำปัจจุบันฉันไม่มีกล่องทดสอบ คุณควรดู:

git log -p //log with diff

การดึงข้อมูลสามารถยกเลิกได้ด้วยการรีเซ็ต git - ฮาร์ด ( ลิงก์ ) อย่างไรก็ตามการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดทั้งหมดในทรีของคุณจะหายไปเช่นเดียวกับการเปลี่ยนแปลงที่คุณดึงมา


หากคุณอธิบายสองสิ่งนั่นอาจเป็นสิ่งที่ดี: 1. ฉันจะยกเลิกการดึงข้อมูลคอมไพล์ได้อย่างไร 2. ฉันจะเห็นความแตกต่างได้อย่างไร?
Milan Babuškov

1
1) เลิกทำ git-fetch หรือไม่ 2) git diff HEAD..origin
Chris Vest

diff ทำตามที่คริสเตียนกล่าวไว้การดึงข้อมูลสามารถยกเลิกได้ด้วยการรีเซ็ต git - ฮาร์ดอย่างไรก็ตามการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดทั้งหมดในต้นไม้ของคุณจะหายไปเช่นเดียวกับการเปลี่ยนแปลงที่คุณดึงมา
Brian Gianforcaro

คุณกำลังมองหาgit reset --softหรือ--mixed? ตรวจสอบ manpage
อริสโตเติล Pagaltzis

1
หากฉันเข้าใจถูกต้องไม่จำเป็นต้องเลิกทำการ "ดึงข้อมูลคอมไพล์" เพราะมันไม่ได้แตะที่สำเนาการทำงานของคุณและไม่ใช่ที่เก็บของของคุณ "git fetch" เก็บวัตถุและอ้างอิงเป็น. git / FETCH_HEAD
Thorsten Niehues

21

คุณสามารถดึงข้อมูลจาก repo ระยะไกลดูความแตกต่างแล้วดึงหรือผสาน

นี่คือตัวอย่างสำหรับ repo ระยะไกลที่เรียกว่าoriginและสาขาที่เรียกว่าmasterติดตามสาขาระยะไกลorigin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

ฉันสร้างนามแฝง git ที่กำหนดเองเพื่อทำสิ่งนั้นให้กับฉัน:

alias.changes=!git log --name-status HEAD..

ด้วยสิ่งที่คุณสามารถทำได้:

$git fetch
$git changes origin

mergeนี้คุณจะได้รับสิ่งที่ดีและวิธีที่ง่ายต่อการเปลี่ยนแปลงการแสดงตัวอย่างก่อนที่จะทำ


คุณเป็นพระเจ้า สิ่งนี้ควรมาภายในคอมไพล์เอง
Z. Khullah

3

ฉันใช้ทั้งสองคำสั่งและฉันสามารถดูไฟล์ที่จะเปลี่ยนแปลง

  1. การเรียกใช้ git fetchครั้งแรกจะให้ผลลัพธ์เช่นนี้ (ส่วนหนึ่งของเอาต์พุต):

    ...
    72f8433..c8af041 พัฒนา -> กำเนิด / พัฒนา
    ...

การดำเนินการนี้ให้รหัสการยอมรับสองรายการแรกคือรายการเก่าและรายการที่สองจะเป็นรายการใหม่

  1. จากนั้นเปรียบเทียบทั้งสองคอมมิตโดยใช้git diff

    git diff 72f8433..c8af041 | grep "diff --git"

คำสั่งนี้จะแสดงรายการไฟล์ที่จะอัพเดท:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

ตัวอย่างเช่นแอพ / คอนโทรลเลอร์ / xxxx.phpและแอพ / view / yyyy.phpจะได้รับการอัปเดต

การเปรียบเทียบสองคอมมิตโดยใช้git diff จะพิมพ์ไฟล์ที่อัพเดตทั้งหมดด้วยบรรทัดที่เปลี่ยนแปลง แต่ด้วยgrepมันจะค้นหาและรับเฉพาะบรรทัดที่มีdiff --gitจากเอาต์พุต


3

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

สิ่งนี้จะอยู่ใน~/.gitconfigไฟล์:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

มันดึงสาขาปัจจุบันจากนั้นจะแตกต่างระหว่างสำเนาการทำงานและสาขาดึงนี้ ดังนั้นคุณควรเห็นการเปลี่ยนแปลงที่จะเกิดgit pullขึ้น


1
คุณสามารถแลกเปลี่ยนสตริงการอ้างอิงได้HEAD..@{u}หรือไม่ มันง่ายกว่าและไม่ต้องการให้รีโมตตั้งชื่อ "กำเนิด" หรือสาขาของคุณตั้งชื่อเหมือนกับรีโมต
Michael - ที่ไหน Shirky Clay

นี่เป็นนามแฝงที่ทำได้ดี แต่ฉันไม่แน่ใจว่าทำไมคุณต้องทำสิ่งนี้ตั้งแต่แรก คุณจะต้องจัดการกับการเปลี่ยนแปลงในบางครั้งใช่มั้ย คุณควรจะยกเลิกการรวมส่วนgit pullถ้าคุณไม่ชอบสิ่งที่มันทำ ... ดังนั้นฉันไม่แน่ใจว่ากรณีการใช้งานสำหรับสิ่งนี้คืออะไร
Marnen Laibow-Koser

ฉันรู้ว่าฉันต้องจัดการกับการเปลี่ยนแปลงในบางจุด แต่ตามที่ฉันเขียนบางครั้งฉันไม่ต้องการ ฉันแค่อยากรู้ว่ามีบางอย่างกำลังจะพังและฉันต้องจองเวลาให้มากขึ้นสำหรับเรื่องนี้ - หรือถ้าฉันสามารถทำในgit pullภายหลังได้ นอกจากนี้ฉันคิดว่านั่นเป็นคำถามเกี่ยวกับ op
Andy P

-1

หากคุณไม่ต้องการให้git-fetchอัปเดต. git ในพื้นที่ของคุณเพียงแค่คัดลอก repo ในพื้นที่ของคุณไปยัง temp dir แล้วดึงที่นั่น นี่คือมือข้างสั้น:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

อดีต .:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

ต้องมีการเรียกใช้ 'gtp' ในรูทของธุรกรรมซื้อคืนภายในท้องถิ่นซึ่งเป็นที่ตั้งของ. git
AX Labs

-2

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


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