ฉันจะดูสิ่งที่ฉันกำลังจะผลักดันด้วยคอมไพล์ได้อย่างไร


588

มีวิธีดูว่าจะผลักถ้าฉันทำgit pushคำสั่งหรือไม่

สิ่งที่ฉันนึกภาพคือสิ่งที่เหมือนกับแท็บ "การเปลี่ยนแปลงไฟล์" ของฟีเจอร์ "คำขอการดึง" ของ Github เมื่อฉันออกคำขอดึงฉันสามารถดูและดูว่าจะดึงอะไรถ้าพวกเขายอมรับคำขอดึงของฉัน:ตัวอย่าง GitHub ของการเปลี่ยนแปลงรวม

บรรทัดคำสั่งนั้นใช้ได้ แต่ฉันต้องการ GUI บางประเภท (เช่นภาพหน้าจอด้านบน)


ที่เกี่ยวข้อง: stackoverflow.com/questions/3080509/…
nos

คำถาม / คำตอบที่เกี่ยวข้องมากมาย นี่คืออีก: stackoverflow.com/questions/2176278/preview-a-git-push/ …
ไมเคิล

คำตอบ:


665

สำหรับรายการไฟล์ที่จะผลักให้รัน:

git diff --stat --cached [remote/branch]

ตัวอย่าง:

git diff --stat --cached origin/master

สำหรับรหัสที่แตกต่างกันของไฟล์ที่จะผลักดันให้รัน:

git diff [remote repo/branch]

หากต้องการดูเส้นทางไฟล์แบบเต็มของไฟล์ที่จะเปลี่ยนให้เรียกใช้:

git diff --numstat [remote repo/branch]

หากคุณต้องการเห็นความแตกต่างเหล่านี้ใน GUI คุณจะต้องกำหนดค่า git สำหรับสิ่งนั้น ดูฉันจะดูเอาต์พุต 'git diff' ด้วยโปรแกรม diff diff ได้อย่างไร .


8
ทั้งสองรูปแบบของคอมไพล์ต่าง - เก็บไว้โดยไม่มีความมุ่งมั่นจะแสดงความแตกต่าง w / เกี่ยวกับ HEAD ฉันคิดว่าคุณหมายถึง git diff [--stat] - แหล่งกำเนิดแคช / หลักสมมติว่าสาขาหลักของแหล่งกำเนิดนั้นเป็น master
mfontani

52
นี่ไม่ใช่สิ่งที่คุณต้องการ คุณควรแตกต่างHEADจากดัชนีกับแหล่งกำเนิด ( git diff origin/master HEAD) การทำให้ดัชนีแตกต่างกันจะให้ผลลัพธ์แบบเดียวกันหากคุณไม่มีการเปลี่ยนแปลงใด ๆ หากคุณมีการเปลี่ยนแปลงระยะเวลาการเปลี่ยนแปลงจะรวมอยู่ในส่วนต่าง แต่จะไม่ถูกผลักเนื่องจากยังไม่ได้ทำ
Cascabel

5
คำตอบนี้จะต้องแก้ไขเพื่อรวมข้อมูลในความคิดเห็นจาก @Jefromi git diff --stat origin/master HEADเป็นคำตอบที่ถูกต้อง
Tony Topper

2
@mfontani มีคำตอบที่ถูกต้องสำหรับฉัน ฉันต้องการตรวจสอบสิ่งที่จะผลักดันจากสิ่งที่ฉันได้ทำไปแล้วไม่ใช่สิ่งที่จะเกิดขึ้นหากฉันยอมรับทุกสิ่งที่ฉันเปลี่ยนแปลงไป git diff --cached [remote/branch]ไม่หลอกลวง :)
poshaughnessy

2
แทนการพิมพ์ต้นฉบับ / ต้นแบบคุณสามารถใช้ @ {u} เช่น git diff @ {u} หรือ git diff HEAD @ {u} โปรดทราบว่านี่จะใช้งานได้เฉพาะถ้าคุณมีสาขาการติดตามอัปสตรีมที่สร้างและเชื่อมโยงแล้ว ฉันพบว่ามีประโยชน์เมื่อฉันมีสาขาจำนวนมากและรีโมตจำนวนมากเพื่อให้ฉันไม่ต้องคิดเกี่ยวกับสิ่งที่เชื่อมโยงอยู่ที่ไหน
ดาเมียนซอว์เยอร์

192

มีการแห้งเสมอ:

git push --dry-run

มันจะทำทุกอย่างยกเว้นการส่งข้อมูลจริง

หากคุณต้องการมุมมองกราฟิกเพิ่มเติมคุณมีตัวเลือกมากมาย

Tigและสคริปต์ gitk ที่มาพร้อมกับคอมไพล์ทั้งสองแสดงสาขาปัจจุบันของสำเนาโลคัลของคุณและสาขาของรีโมตหรือแหล่งกำเนิด

ข้อความแสดงแทน

ดังนั้นความมุ่งมั่นใด ๆ ที่คุณทำหลังจากที่กำเนิดก็คือความมุ่งมั่นที่จะผลักดัน

เปิด gitk จาก shell ขณะที่อยู่ในสาขาที่คุณต้องการกดด้วยการพิมพ์gitk&จากนั้นดูความแตกต่างระหว่างสิ่งที่อยู่บนรีโมตและสิ่งที่คุณกำลังจะผลักไปที่รีโมตเลือกคอมมิช unpushed ในพื้นที่ของคุณและคลิกขวาที่รีโมตและ เลือก "Diff this -> select": ข้อความแสดงแทน


18
git push --dry-run ไม่ได้แสดงอะไรอย่างที่ฉันหวังว่าจะได้เห็น gitk ใกล้เข้ามามากขึ้น แต่ไม่ได้แสดงการเปลี่ยนแปลงทั้งหมดที่จะผลักให้ฉันเห็น ดังนั้นหากฉันกด 6 มุ่งมั่นที่จะห่างไกลฉันต้องการที่จะเห็นผลรวมทั้งหมดของสิ่งที่จะผลักดัน ฉันไม่สนใจว่าการกระทำแต่ละอย่างมีอะไรบ้างเพราะการกระทำหนึ่งอาจถูกเพิกเฉยโดยสมบูรณ์ในครั้งต่อไป
cmcculloh

1
หากคุณต้องการความแตกต่างของสิ่งที่จะได้รับการผลักดันให้ทำหรือgit diff --stat HEAD origin/master git diff HEAD origin/masterสำคัญคือHEADมิฉะนั้นคุณจะต้องรวมการเปลี่ยนแปลงที่ไม่ธรรมดาในส่วนต่างของคุณ
Daniel Alder

มีเหตุผลบางอย่างที่คอมไพล์ไม่ได้ทำงานแบบอัตโนมัติก่อนที่จะพยายามส่งข้อมูลไปยังรีโมตหรือไม่? หากคุณกำลังผลักดันข้อมูลจำนวนมากมันจะอัปโหลดข้อมูลทั้งหมดแล้วแสดงข้อผิดพลาดหลังจากนั้น คุณเพิ่งเสียเวลาและอัปโหลดแบนด์วิดท์ข้อมูลที่คุณต้องอัปโหลดอีกครั้ง ดูเหมือนว่าพฤติกรรมแปลก ๆ
zeusstl

1
ปัญหาgit push --dry-runคือมันยังคงต้องได้รับอนุญาตเป็นลายลักษณ์อักษรที่ระยะไกล ดังนั้นหากคุณมีโคลนโดยไม่ได้รับอนุญาตให้ส่งอัปสตรีม แต่คุณต้องการดูว่าการเปลี่ยนแปลงที่--dry-runไม่ได้ทำการเปลี่ยนแปลงในเครื่องของคุณคืออะไร
Ed Avis

นี่เป็นวิธีแก้ปัญหาที่ดี แต่ควรสังเกตว่าต้องเชื่อมต่อกับรีโมท (รวมถึงการป้อนคีย์ SSH หากทำได้) หากคุณต้องการเห็นความแตกต่างระหว่างbranchและorigin/branchฉันจะไปกับคำตอบของ Ionuț G. Stan เนื่องจากไม่จำเป็นต้องเชื่อมต่อกับ repo ระยะไกล สิ่งนี้อาจดีหรือไม่ดีขึ้นอยู่กับสิ่งที่คุณต้องการ
Sean the Bean

169

หากต้องการแสดงรายการการผูกพันที่รอการผลักดัน: ( นี่คือสิ่งที่คุณจะจดจำ )

git cherry -v

แสดงหัวเรื่องการกระทำถัดจาก SHA1


5
สิ่งหนึ่งที่น่าสนใจคือคุณสามารถระบุรีโมตเพื่อเปรียบเทียบเช่น: git cherry -v heroku/remoteในกรณีที่คุณเก็บโค้ดไว้ในรีโมตมากกว่าหนึ่งตัว
fagiani

อะไรคือคำสั่งที่ดีที่สุดที่ช่วยให้เราสามารถเชื่อมโยงความแตกต่างที่พวกเขามีอยู่?
Hassan Baig

คำสั่งนี้ดี แต่ฉันต้องการรายละเอียดเพิ่มเติมเช่นชื่อไฟล์ที่จะเปลี่ยนระหว่างการกด
LS

21

git difftool origin/master...คุณอาจต้องการที่จะทำงาน ที่ควรแสดง diff แบบรวมของสิ่งที่อยู่ในสาขาปัจจุบันของคุณที่ไม่ได้อยู่ในสาขาต้นทาง / สาขาหลักและแสดงในเครื่องมือ diff แบบกราฟิกที่คุณเลือก เพื่อให้ทันสมัยที่สุดให้เรียกใช้git fetchก่อน


2
git difftool -d origin/masterฉันมีเซ็ทโฟลว์ของฉันที่รวมกันดังนั้นมันใช้งานได้ดีขอบคุณ!
กุมภ์กำลัง

git difftool -dเป็นวิธีที่ดีกว่าขอบคุณพลังกุมภ์ ปัญหาเดียวคือมันไม่พบไฟล์ที่ถูกย้ายและแสดงว่าถูกลบและเพิ่มแทน
EM0

8

วิธีหนึ่งในการเปรียบเทียบเวอร์ชันท้องถิ่นของคุณก่อนที่จะผลักดันมันบน repo ระยะไกล (ชนิดของการผลักในระยะแห้ง):

ใช้ TortoiseGit:
คลิกขวาที่โครงการรูทโฟลเดอร์> TortoiseGit> Diff กับเวอร์ชันก่อนหน้า>
สำหรับเวอร์ชัน 2 ให้เลือกrefs/remotes/origin/master


8

ลองgit diff origin/master..master(สมมติว่าorigin/masterเป็นของคุณต้นน้ำ) ไม่เหมือนgit push --dry-runนี้ยังใช้งานได้แม้ว่าคุณจะไม่ได้รับอนุญาตให้เขียนไปที่ต้นน้ำ


5

ใช้ที่git guiนั่นคุณสามารถดูรายการสิ่งที่เปลี่ยนแปลงในการกระทำที่เกิดขึ้นจริงของคุณ นอกจากนี้คุณยังสามารถใช้ซึ่งgitkให้อินเทอร์เฟซที่ง่ายสำหรับ reflogs เพียงเปรียบเทียบระหว่างremotes/...และmasterดูสิ่งที่จะผลักดัน มันมีอินเตอร์เฟซที่คล้ายกับภาพหน้าจอของคุณ

ทั้งสองโปรแกรมรวมอยู่ในคอมไพล์


1
ฉันไม่เห็นสถานที่ใด ๆ ใน git gui ที่แสดงทุกอย่างที่ได้ทำไปแล้ว แต่ไม่ได้ผลัก
cmcculloh

ใน git gui คุณสามารถเห็นสิ่งที่แก้ไข แต่ไม่ได้กระทำ ใน gik (ผ่านgitk --allคุณจะได้รับรายการความคิดเห็นทั้งหมดตอนนี้คุณสามารถเปรียบเทียบสถานะที่แท้จริงของสาขา dev ของคุณกับรีโมทของคุณที่จะผลักดัน
fuz

4

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

git diff --stat --patch origin master

หมายเหตุ : หากคุณเกิดขึ้นที่จะใช้ใด ๆ ของ IDEs Intellij แล้วคุณสามารถคลิกขวาที่โครงการระดับบนสุดของคุณให้เลือกGit > เปรียบเทียบกับสาขา > origin/masterและเลือกแหล่งกำเนิดที่คุณต้องการเช่น ในแผนผังไฟล์ที่จะปรากฏขึ้นคุณสามารถดับเบิลคลิกไฟล์เพื่อดูภาพที่แตกต่าง ไม่เหมือนกับตัวเลือกบรรทัดคำสั่งด้านบนคุณสามารถแก้ไขเวอร์ชันในเครื่องของคุณได้จากหน้าต่าง diff


3

คุณสามารถแสดงรายการการกระทำโดย:

git cherry -v

จากนั้นเปรียบเทียบกับคำสั่งต่อไปนี้โดยที่จำนวน ^ เท่ากับจำนวนคอมมิต (ในตัวอย่างที่ 2 คอมมิท)

git diff HEAD^^

เป็นการดีที่จะดูรายการการกระทำล่าสุด นี่จะไม่ให้ชื่อไฟล์ ดังนั้นเมื่อมีคนตอบว่าใช้ตัวเลือกการรันแบบแห้งและตัวเลือกการแก้ไขจะดีกว่า git diff --stat --patch master ต้นกำเนิด git push --dry-run
Sree Rama

2

หากคุณใช้ Mac OS X ฉันขอแนะนำให้คุณใช้ Tower ซึ่งเป็นโปรแกรมที่ยอดเยี่ยมที่ทำให้ Git มีความสุขสำหรับฉัน ตอนนี้ฉันต้องจำคำสั่งเทอร์มินัลอีกต่อไปและให้ GUI ที่ยอดเยี่ยมในการดูติดตามและแก้ไขความแตกต่างของไฟล์

และไม่ฉันไม่ได้มีส่วนเกี่ยวข้องกับพวกเขาฉันเพียงแค่ใช้ซอฟต์แวร์ของพวกเขาและชอบมันมาก

http://www.git-tower.com/


2
ฉันใช้ Tower แต่คุณจะเห็นไฟล์ที่ถูกคอมมิทได้อย่างไร แต่ไม่ได้ทำการพุช
Michael Irey

สิ่งนี้ไม่ตอบคำถาม
reinierpost

1

เพียงเพื่อเพิ่มสองเซ็นต์ของฉัน ... ฉันต้องการที่จะใช้เมื่อทำงานใน gitlab ไปป์บน gitlab runner วิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้สคริปต์นี้:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

ในกรณีของฉันฉันต้องการกรองไฟล์ตามส่วนขยายเพื่อให้บรรลุสิ่งที่ฉันใช้:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

หลังจากนั้นคุณสามารถส่งต่อรายการนี้ไปที่อื่นได้อย่างใดอย่างหนึ่ง linter อาจ;)

หวังว่านี่จะช่วยใครซักคน


1
  1. หากคุณมีสิทธิ์เขียนบนระยะไกล
git push --dry-run
  1. หากคุณไม่มีสิทธิ์เขียนบนรีโมท
git diff --stat HEAD remote/branch

0

หลังจากนั้นgit commit -m "{your commit message}"คุณจะได้แฮชคอมมิชก่อนกด เพื่อให้คุณสามารถเห็นสิ่งที่คุณกำลังจะผลักดันด้วยการgitเรียกใช้คำสั่งต่อไปนี้:

git diff origin/{your_branch_name} commit hash

เช่น: git diff origin/master c0e06d2


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