git diff ระหว่างที่เก็บโคลนและที่เก็บรีโมตดั้งเดิม


170

ฉันโคลนที่เก็บ github และไม่ทำการเปลี่ยนแปลงในเครื่อง พื้นที่เก็บข้อมูล Github ย้ายไปข้างหน้าด้วยกระทำในสาขาเดียวกัน

  1. ฉันจะค้นหาความแตกต่างระหว่างที่เก็บข้อมูลในเครื่องของฉันกับที่เก็บ github เดิมได้อย่างไร
  2. ฉันจะค้นหาความแตกต่างระหว่างสำเนาการทำงานของฉันและที่เก็บ github เดิมได้อย่างไร
  3. ฉันจะค้นหาความแตกต่างระหว่างที่เก็บข้อมูลในเครื่องของฉันกับที่เก็บ github อื่นของโครงการเดียวกันได้อย่างไร


1
@CiroSantilli 新疆改造中心六四事件法轮功: ฉันคิดว่ามันแตกต่างกันพอ: คำถามอื่นถามเกี่ยวกับสาขาระยะไกลทั่วไปใด ๆ ในขณะที่นี่มีการอ้างอิงถึง GitHub รวมทั้งถามเกี่ยวกับจุดเริ่มต้นที่แตกต่างกันสามจุด มันคล้ายกันมากดังนั้นลิงก์ของคุณจึงมีประโยชน์อย่างแน่นอน
jvriesem

คำตอบ:


161

1) เพิ่มที่เก็บข้อมูลระยะไกลที่คุณต้องการเปรียบเทียบ:

git remote add foobar git://github.com/user/foobar.git

2) อัปเดตสำเนารีโมตในเครื่องของคุณ:

git fetch foobar

การดึงข้อมูลจะไม่เปลี่ยนสำเนาการทำงานของคุณ

3) เปรียบเทียบสาขาใดก็ได้จากที่เก็บในพื้นที่ของคุณกับรีโมตที่คุณเพิ่ม:

git diff master foobar/master

ฉันจะต้องเรียก git ก่อน diff หรือไม่ ฉันเดาว่าจะไม่มีทางแตกต่างกันหากไม่มีมัน
Oleg Proudnikov

นี่เป็นคำตอบสำหรับคำถาม 3 เท่านั้น (ต่างกับ repo Github อื่น)
Ruslan Kabalin

5
ไม่มีอะไรแตกต่าง "ที่เก็บ github เดิม" จากที่เก็บระยะไกลอื่น ๆ หรือฉันเข้าใจผิดบางอย่าง
dbyrne

เมื่อฉันลองกับ git 2.7.4 "git diff master foobar / master" ก็ไม่ได้แสดงความแตกต่าง ฉันดูเหมือนว่าฉันจะเปรียบเทียบสำเนาในเครื่องของฉัน ("master") กับ repo ที่ได้รับเป็นอาร์กิวเมนต์ที่ 1 ("master") และในนั้นจะแตกต่างเฉพาะ "path / file" "foobar / master" แต่คำสั่ง "diff foobar / master" ใช้งานได้สำหรับฉันการเปรียบเทียบต้นแบบในพื้นที่ของฉันกับ foobar / master
user2081279

แทนที่จะเป็นfetch(nr. 2) เป็นทางเลือก: git remote update- จะอัปเดตสาขาทั้งหมดของคุณที่ตั้งค่าให้ติดตามรีโมต แต่ไม่รวมการเปลี่ยนแปลงใด ๆ ใน; หรือgit pull
Timo

49

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

1) มุ่งมั่นในสาขาระยะไกลตั้งแต่เมื่อสาขาท้องถิ่นถูกสร้างขึ้น:

git diff HEAD...origin/master

2) ฉันถือว่า "สำเนาการทำงาน" คุณหมายถึงสาขาในพื้นที่ของคุณที่มีข้อผูกพันในท้องถิ่นที่ยังไม่ได้อยู่ในระยะไกล หากต้องการดูความแตกต่างของสิ่งที่คุณมีในสาขาท้องถิ่นของคุณ แต่ไม่มีอยู่ในสาขาระยะไกลที่รันอยู่:

git diff origin/master...HEAD

3) ดูคำตอบโดย dbyrne


ขอบคุณสำหรับHEAD..origin/masterไวยากรณ์! เราได้รับข้อผิดพลาดเกี่ยวกับ Origin / HEAD ที่ไม่มีอยู่และสิ่งนี้แก้ไขได้
Dan Bechard

@ruslan: หมายความว่าอย่างไรเมื่อgit diff HEAD...origin/masterส่งคืนสิ่งใดหากฉันลอกแบบไดเรกทอรีระยะไกลที่ฉันได้รับอนุญาตให้ทำการเปลี่ยนแปลง
โมนาจาลาล

มีข้อผิดพลาดเกิดขึ้นเมื่อฉันโคลนโดยใช้ Windows GUI ดังนั้นฉันจึงสงสัยว่าโคลนนั้นผ่านไปอย่างสมบูรณ์หรือไม่ ฉันเห็นโฟลเดอร์อยู่ที่นี่ในไดเรกทอรีของฉัน แต่ฉันต้องการตรวจสอบให้แน่ใจว่ามันเหมือนกับรีโมต อย่างไรก็ตามในเชลล์ git นั้น git diff จะไม่ส่งคืนอะไรเลย ฉันสับสนถ้าการทำโคลนสำเร็จหรือไม่?
โมนาจาลาล

@MonaJalal หมายความว่าไม่มีการเปลี่ยนแปลงต้นน้ำตั้งแต่คุณโคลน
Ruslan Kabalin

21

ตัวอย่างนี้อาจช่วยบางคน:

หมายเหตุ " origin" เป็นชื่อแทนของฉันสำหรับระยะไกล "มีอะไรใน Github"
หมายเหตุ " mybranch" เป็นชื่อแทนของฉันสำหรับสาขาของฉัน "มีอะไรในท้องถิ่น" ที่ฉันซิงค์กับ
Github - ชื่อสาขาของคุณคือ 'ต้นแบบ' หากคุณไม่ได้สร้าง หนึ่ง. อย่างไรก็ตามฉันใช้ชื่ออื่นmybranchเพื่อแสดงตำแหน่งที่ใช้พารามิเตอร์ชื่อสาขา


รีโมตรีโมตของฉันบน github คืออะไร

$ git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)

เพิ่ม "ที่เก็บ github อื่น ๆ ของรหัสเดียวกัน" - เราเรียกสิ่งนี้ว่า fork:

$ git remote add someOtherRepo https://github.com/otherUser/Playground.git

$git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (fetch)

ตรวจสอบให้แน่ใจว่าธุรกรรมซื้อคืนในพื้นที่ของเราเป็นปัจจุบัน:

$ git fetch

เปลี่ยนบางสิ่งในพื้นที่ สมมติว่าไฟล์. /foo/bar.py

$ git status
# On branch mybranch
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   foo/bar.py

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

$ git diff mybranch
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index b4fb1be..516323b 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

กระทำในท้องถิ่น

$ git commit foo/bar.py -m"I changed stuff"
[myfork 9f31ff7] I changed stuff
1 files changed, 2 insertions(+), 1 deletions(-)

ตอนนี้ฉันแตกต่างจากระยะไกลของฉัน (บน GitHub)

$ git status
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 1 commit.
#
nothing to commit (working directory clean)

Diff นี้กับระยะไกล - ส้อมคุณ: (นี้จะทำบ่อยgit diff master origin)

$ git diff mybranch origin
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index 516323b..b4fb1be 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

(git push เพื่อใช้สิ่งเหล่านี้กับรีโมท)

สาขาระยะไกลของฉันแตกต่างจาก remote master branch อย่างไร

$ git diff origin/mybranch origin/master

สิ่งของในพื้นที่ของฉันแตกต่างจากสาขาหลักระยะไกลอย่างไร

$ git diff origin/master

สิ่งของของฉันแตกต่างจากส้อมของคนอื่นสาขาหลักของ repo เดียวกันได้อย่างไร

$git diff mybranch someOtherRepo/master

5
ก่อนที่เราจะทำ 'git diff' ฉันคิดว่าจำเป็นต้องทำ 'git fetch' เพื่อให้แน่ใจว่าสำเนารีโมทของเรานั้นเป็นข้อมูลล่าสุด
อย่า

1
ฉันได้อ่านอาจจะมี 20 โพสต์เกี่ยวกับวิธีการเปรียบเทียบระยะไกลและท้องถิ่นฉันเพิ่งคิดออกเอง: เรียก git จะต้องก่อน git เป็นรหัสการประกอบของ RCS อย่างแท้จริง พระเยซู ขอบคุณสำหรับการยืนยันอย่า!
เทอเรนซ์พาร์

เพิ่งเพิ่มgit fetchไปยังคำตอบนี้
FlipMcF

1
อืม ... ฉันไม่ชอบวิธีที่ฉันใช้ 'myfork' เป็นชื่อสาขาของฉัน นั่นอาจสร้างความสับสนให้ใครบางคน (เช่นฉันที่เพิ่งกลับมาสำหรับคำตอบนี้)
FlipMcF

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