รับความแตกต่างระหว่างสองที่เก็บ


184

เราจะได้รับความแตกต่างระหว่างสองที่เก็บคอมไพล์ได้อย่างไร

สถานการณ์: เรามี repo_a และ repo_b หลังถูกสร้างขึ้นเป็นสำเนาของ repo_a มีการพัฒนาแบบขนานทั้งที่เก็บในภายหลัง มีวิธีที่เราสามารถแสดงความแตกต่างของเวอร์ชั่นปัจจุบันของที่เก็บทั้งสองนี้ได้หรือไม่?


คำตอบ:


250

ใน repo_a:

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

3
ถ้าคุณต้องการเปรียบเทียบ repo_a / master กับแท็กเฉพาะของ repo_b
David Torres

2
ไม่ทำงานสำหรับฉันมันกำลังขว้างปา: ร้ายแรง: อาร์กิวเมนต์ที่คลุมเครือ 'รีโมท / b / master': การแก้ไขที่ไม่รู้จักหรือเส้นทางที่ไม่ได้อยู่ในแผนผังการทำงาน ใช้ '-' เพื่อแยกเส้นทางจากการแก้ไขเช่นนี้: 'git <command> [<revision> ... ] - [<file> ... ]' ความคิดใด ๆ ที่นี่?
Andrew Heekin

2
ฉันได้รับเช่นเดียวกับ @AndrewHeekin ไม่มีใครมีทางออกหรือไม่?
รัฐสภา

4
ฉันดูเหมือนจะต้องระบุมากกว่าเปลือยorigin/master masterนอกจากนี้ยังพบความแตกต่างระหว่างสาขาหลักดังนั้นถ้าคุณต้องการค้นหาสาขาทั้งหมดที่แตกต่างกัน เช่นการตรวจสอบสถานะของการสำรองข้อมูลที่เก็บหรือไม่
davidA

1
คุณสามารถอธิบายสิ่งที่ทำทุกบรรทัดได้หรือไม่ ขอบคุณมาก!
Enrique

34

Meldสามารถเปรียบเทียบไดเรกทอรี:

meld directory1 directory2

เพียงใช้ไดเรกทอรีของ repos คอมไพล์ทั้งสองและคุณจะได้รับการเปรียบเทียบแบบกราฟิกที่ดี:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อคุณคลิกที่รายการสีน้ำเงินหนึ่งรายการคุณสามารถเห็นสิ่งที่เปลี่ยนแปลงไป


1
รวมเข้าด้วยกันในขณะที่เปรียบเทียบโครงการในโซลูชัน VS ของฉัน BeyondCompare ไม่ใช่
Sasha Bond

4
ใน OSX: diff -rq folder1 folder2
ทำเครื่องหมาย

1
ลิงค์ที่ยอดเยี่ยม! โปรแกรมที่ง่ายมากตอนนี้ฉันใช้สิ่งนี้เป็นโปรแกรม diff สำหรับ OSX
dmanexe

1
นี่มันช่างน่ารักจริงๆ! ขอบคุณสำหรับการแบ่งปัน.
Shihab Khan

ฉันไม่แน่ใจว่า meld สามารถจัดการไฟล์ที่ถูกคอมไพล์ได้หรือไม่ - คุณควรพิจารณาในขณะที่ใช้มัน
noamgot

11

คุณสามารถเพิ่ม repo อื่น ๆ ก่อนเป็นรีโมทไปยัง repo ปัจจุบันของคุณ:

git remote add other_name PATH_TO_OTHER_REPO

จากนั้นดึงข้อมูล brach จากระยะไกล:

git fetch other_name branch_name:branch_name

สิ่งนี้สร้างสาขานั้นเป็นสาขาใหม่ใน repo ปัจจุบันของคุณจากนั้นคุณสามารถแยกสาขานั้นกับสาขาใดสาขาหนึ่งของคุณตัวอย่างเช่นเพื่อเปรียบเทียบสาขาปัจจุบันกับสาขาใหม่ (branch_name):

git diff branch_name

8

git diffเมื่อคุณมีทั้งสาขาในพื้นที่เก็บข้อมูลที่คุณสามารถทำได้ และการเก็บไว้ในที่เก็บเดียวทำได้ง่ายเหมือน

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

มีวิธีในการเก็บประวัติเชอร์รี่ที่มีการเปลี่ยนแปลงเล็กน้อย: ตัวอย่างเช่นในไฟล์ repo ระยะไกลถูกวางไว้ในไดเรกทอรีเดียว แต่ฉันต้องการใช้การเปลี่ยนแปลงกับไฟล์เดียวกัน แต่วางไว้ในไดเรกทอรีอื่นใน repo ท้องถิ่นหรือไม่
Eugen Konkov

หากคุณกำลังพูดถึงการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ฉันคิดว่าวิธีที่ง่ายที่สุดที่จะทำให้เกิดความแตกต่างจากนั้นนำไปใช้กับไฟล์อื่นโดยใช้โปรแกรมปะแก้
Michael Krelin - แฮกเกอร์

ไม่ได้ใช้โปรแกรมปะแก้เนื่องจากมีชื่อไฟล์ต่างกันแม้จะเป็นไฟล์เดียวกัน
Eugen Konkov

โอ้ฉันแค่คิดถึงไดเรกทอรีต่าง ๆ ไม่ใช่ชื่อไฟล์ (ไดเรกทอรีสามารถจัดการได้อย่างง่ายดายผ่านตัวเลือกการแก้ไข) สำหรับชื่อไฟล์ฉันแค่เปลี่ยนมันด้วยตนเองหรือผ่านสคริปต์ ที่กล่าวว่าฉันไม่ได้บอกว่าไม่มีทางออกที่ดีกว่าสิ่งที่ฉันสามารถทำได้โดยไม่ต้องขุดที่ไหน
Michael Krelin - แฮกเกอร์

ถ้าฉันต้องการเปรียบเทียบสาขาทั้งหมดล่ะ
endolith

7
git diff master remotes/b

นั่นไม่ถูกต้อง remotes/bเป็นรีโมต แต่ไม่ใช่สาขา

เพื่อให้มันทำงานฉันต้องทำ:

git diff master remotes/b/master

2
นี่ควรเป็นข้อคิดเห็นในคำตอบที่เกี่ยวข้อง
EntangledLoops

6

ดูที่http://git.or.cz/gitwiki/GitTipsส่วน "วิธีเปรียบเทียบที่เก็บข้อมูลในเครื่องสองแห่ง" ใน "ทั่วไป"

ในระยะสั้นคุณกำลังใช้ตัวแปรสภาพแวดล้อม GIT_ALTERNATE_OBJECT_DIRECTORIES เพื่อเข้าถึงฐานข้อมูลวัตถุของที่เก็บอื่น ๆ และใช้git rev-parseด้วย--git-dir/ GIT_DIR เพื่อแปลงชื่อสัญลักษณ์ในที่เก็บอื่นเป็นตัวระบุ SHA-1

รุ่นที่ทันสมัยจะมีลักษณะเช่นนี้ (สมมติว่าคุณอยู่ใน 'repo_a'):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / วัตถุ \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse - ตรวจสอบ HEAD) HEAD

โดยที่../repo_b/.gitเป็นเส้นทางไปยังฐานข้อมูลวัตถุใน repo_b (จะเป็น repo_b.git หากเป็นที่เก็บเปลือย) แน่นอนว่าคุณสามารถเปรียบเทียบเวอร์ชันที่กำหนดเองได้โดยไม่เฉพาะกับ HEAD


โปรดทราบว่าถ้า repo_a และ repo_b เป็นที่เก็บเดียวกันมันอาจจะเหมาะสมกว่าที่จะวางทั้งสองไว้ในที่เก็บเดียวกันโดยใช้ " git remote add -f ..." เพื่อสร้างชื่อเล่นสำหรับพื้นที่เก็บข้อมูลสำหรับการอัพเดทซ้ำ ๆ หรือเลิกใช้git fetch ..."; ตามที่อธิบายไว้ในคำตอบอื่น ๆ


5

ฉันใช้ PyCharm ซึ่งมีความสามารถที่ยอดเยี่ยมในการเปรียบเทียบระหว่างโฟลเดอร์และไฟล์

เพียงเปิดโฟลเดอร์พาเรนต์สำหรับ repos ทั้งสองและรอจนกว่าจะจัดทำดัชนี จากนั้นคุณสามารถคลิกขวาที่โฟลเดอร์หรือไฟล์และCompare to...และเลือกโฟลเดอร์ / ไฟล์ที่เกี่ยวข้องในอีกด้านหนึ่ง

มันแสดงให้เห็นไม่เพียง แต่ไฟล์ที่แตกต่าง แต่เนื้อหาของพวกเขา ง่ายกว่าบรรทัดคำสั่ง


2

ทางออกที่ดีที่สุดของคุณคือให้มี repos ทั้งสองอยู่ในเครื่องของคุณและใช้คำสั่ง linux diff กับสองไดเรกทอรีเป็นพารามิเตอร์:

diff -r repo-A repo-B


2
วิธีเดียวที่จะทำให้สามารถใช้งานได้นี้คือการเปลี่ยนชื่อหนึ่งในไดเรกทอรี. git สิ่งนี้จะลดขนาดหน้าแตกต่างสองบรรทัดที่ไม่สำคัญ เคยมาที่นั่นแล้วมาที่นี่เพื่อหาคำตอบที่ดีกว่า
hildred

2

วิธีง่ายๆในการทำเช่นนั้นโดยไม่ต้องสัมผัสการกำหนดค่ารีโมทของคุณ จาก repo A ในระดับปริญญาโท (สมมติว่าคุณต้องการเปรียบเทียบสาขาหลัก):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

คุณสามารถใช้คำสั่งต่อไปนี้:

diff -x .git -r repo-A repo-B

หรือเคียงข้างกันคุณสามารถใช้:

diff -x .git -W200 -y -r repo-A repo-B

ในกรณีที่ Colorizing ทุกไฟล์ diff คุณสามารถใช้:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

ขึ้นอยู่กับวิธีการแก้ปัญหา @ andrew-heekin
เจอราร์ด

0

เตือนให้ดึงข้อมูล ... ด้วยตนเองก่อนอื่นที่เก็บไม่มีแฮชภายใน (ฉันเดา)

ขั้นตอน 1. ตั้งค่ารีสตรีมระยะไกลขึ้นไป ^

การกระจายไฟล์เดียวตามรูปแบบนี้:

git diff localBranch uptreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

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