การเปลี่ยนแปลงรายละเอียดหลังจากดึง Git


130

หลังจากการดึง Git ผลลัพธ์จะให้ข้อมูลสรุปเกี่ยวกับจำนวนเงินที่เปลี่ยนแปลง

ฉันจะดูการเปลี่ยนแปลงโดยละเอียดแต่ละไฟล์หรือบางไฟล์ได้อย่างไร

โอเคนี่คือคำถามของฉันสำหรับ Jefromi:

  1. ฉันจะรู้ได้อย่างไรว่าฉันถูกดึงให้เชี่ยวชาญ? ทั้งหมดที่ฉันทำคือ "git pull"

  2. master ชี้ไปที่อะไรและอะไรคือความแตกต่างระหว่าง master และ HEAD ซึ่งเป็นสองหัวเริ่มต้นของ Git

  3. ฉันจะดูการเปลี่ยนแปลงโดยละเอียดในไฟล์เฉพาะได้อย่างไร

  4. ฉันจะเห็นการเปลี่ยนแปลงในผลลัพธ์สรุปในครั้งสุดท้ายgit pullอีกครั้งได้อย่างไร

  5. อะไรคือความแตกต่างระหว่างgit diffและgit whatchanged?


4
โอเคการเพิ่มคำถามใหม่ซ้ำ ๆ ผ่านการแก้ไขนี้ไม่ตรงตามที่ระบบตั้งใจจะใช้ นอกจากนี้คุณยังสามารถตอบคำถามของคุณได้อย่างง่ายดายโดยดูที่ man page หรือลองทำ ตัวอย่างเช่นgit diffแสดงผลความแตกต่างgit whatchangedอย่างชัดเจนในขณะที่แสดงรายการข้อมูลคอมมิตอย่างชัดเจนแต่ละรายการมีรายการไฟล์ที่เปลี่ยนแปลง
Cascabel

อาจเป็นเพราะตัวแทนของคุณต่ำ
TED

@TED ​​ใช้เวลาเพียง 50 ตัวแทนในการแสดงความคิดเห็นและ 15 คนในการโหวต
Cascabel

บนแล็ปท็อปของฉันกับ Ubuntu บางครั้งมันก็ใช้งานไม่ได้ ฉันพบคอมพิวเตอร์เครื่องอื่นที่มี Centos ชั่วคราวและกำลังแสดงความคิดเห็นนี้ บนคอมพิวเตอร์ทั้งสองเครื่องฉันใช้ Firefox
ทิม

แปลกมาก. คุณอาจต้องการตรงไปที่เมตาและดูว่าเป็นปัญหาที่ทราบหรือไม่ / รายงาน
Cascabel

คำตอบ:


204

สมมติว่าคุณกำลังดึงให้เชี่ยวชาญ คุณสามารถอ้างถึงตำแหน่งก่อนหน้าของmasterby master@{1}(หรือแม้กระทั่งmaster@{10.minutes.ago}ดูส่วนการแก้ไขที่ระบุของหน้าคนวิเคราะห์ git-rev-parse ) เพื่อให้คุณสามารถทำสิ่งต่างๆเช่น

  • ดูการเปลี่ยนแปลงทั้งหมด: git diff master@{1} master

  • ดูการเปลี่ยนแปลงของไฟล์ที่กำหนด: git diff master@{1} master <file>

  • ดูการเปลี่ยนแปลงทั้งหมดภายในไดเร็กทอรีที่กำหนด: git diff master@{1} master <dir>

  • ดูสรุปการเปลี่ยนแปลงอีกครั้ง: git diff --stat master@{1} master

สำหรับคำถามของคุณที่ว่า "ฉันจะรู้ได้อย่างไรว่าฉันเป็นผู้เชี่ยวชาญ" ... การใช้สาขาเป็นส่วนสำคัญของเวิร์กโฟลว์ Git คุณควรตระหนักเสมอว่าคุณอยู่ที่สาขาใด - หากคุณดึงการเปลี่ยนแปลงคุณต้องการดึงไปยังสาขาที่ถูกต้อง! git branchคุณสามารถดูรายการของทุกสาขาที่มีเครื่องหมายดอกจันโดยการตรวจสอบออกขณะหนึ่งที่มีคำสั่ง ชื่อสาขาปัจจุบันจะพิมพ์พร้อมกับผลลัพธ์ของgit status. ฉันขอแนะนำให้อ่านหน้าคนของคำสั่งเพื่อใช้ - เป็นวิธีที่ดีในการรับความรู้อย่างช้าๆ

และคำถามสุดท้ายของคุณ: HEADคือชื่อของสาขาที่เช็คเอาต์ในปัจจุบัน แน่นอนคุณสามารถใช้HEADและHEAD@{1}ในบริบทนี้ได้เช่นกัน แต่การใช้สาขานั้นมีประสิทธิภาพมากกว่าเล็กน้อยเนื่องจากหากคุณไปตรวจสอบสาขาอื่น HEADตอนนี้เป็นสาขาที่สองและHEAD@{1}ตอนนี้masterไม่ใช่สิ่งที่คุณต้องการ!

เพื่อประหยัดการต้องถามคำถามเล็ก ๆ น้อย ๆ มากมายเช่นนี้คุณควรดูบทช่วยสอน Git มีเป็นล้านบนเว็บเช่น:

  • Book Pro Git
  • Git Magic
  • และยอดชม 4.5 ล้านครั้งใน Google สำหรับ "Git tutorial"

5
นี่ดีกว่าทางออกของฉัน :)
Christian Oudard

2
ฉันรู้ว่านี่เป็นเรื่องเก่า แต่ ... มันควรจะเป็นวิธีอื่น: git diff master@{1} masterมิฉะนั้นการเปลี่ยนแปลงจะแสดง "ย้อนกลับ" กล่าวคือการแทรกกลายเป็นการลบเป็นต้น
ultracrepidarian

2
git diff master@{1} masterไม่ได้ทำงานให้ฉันทำงานแทนgit diff master~1 masterฉัน
Unrealsoul007

5
@ Unrealsoul007 แล้วสถานการณ์ของคุณก็แตกต่างออกไป master ~ 1 คือการกระทำของผู้ปกครองของนายหนึ่งที่กำลังชี้ไป คุณจะเห็นความแตกต่างของคอมมิตนั้น master @ {1} คือคอมมิตมาสเตอร์ก่อนหน้านี้ที่ชี้ไป ตัวอย่างเช่นคุณเพิ่งดึงนั่นจะเป็นตำแหน่งของหลักก่อนการดึงตามที่อธิบายไว้ที่นี่ หากไม่เป็นเช่นนั้นคุณอาจทำอย่างอื่นให้ชำนาญตั้งแต่ดึง พยายามที่git reflog masterจะเข้าใจสิ่งที่
Cascabel

@Jefromi fatal: ambiguous argument 'firstDesign@': unknown revision or path not in the working tree.ฉันได้รับข้อผิดพลาดนี้เรื่อย ๆ แม้ว่า git reflog firstDesign จะมีเอาต์พุตนี้
Unrealsoul007

52

สมมติว่าคุณดึงคอมไพล์ดังนี้:

$ git pull
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From git@dev.example.com:reponame
   a407564..9f52bed  branchname   -> origin/branchname
Updating a407564..9f52bed
Fast forward
 .../folder/filename          |  209 ++++++++-----
 .../folder2/filename2        |  120 +++++++++++---------
 2 files changed, 210 insertions(+), 119 deletions(-)

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

$ git diff a407564..9f52bed

5
และคุณสามารถรับข้อมูลสรุปโดยใช้ " git diff --stat a407564..9f52bed" หรือเพียงแค่สรุป " git diff --summary a407564..9f52bed"
Jakub Narębski

14
สำหรับ git เวอร์ชันใหม่กว่า git pull จะไม่แสดงรายการไฟล์ที่เปลี่ยนแปลงอีกต่อไป เพื่อให้ได้สิ่งนั้นคุณต้องทำ `` git pull --stat '
user10

6

1.ฉันจะรู้ได้อย่างไรว่าฉันถูกดึงให้เชี่ยวชาญ? ทั้งหมดที่ฉันทำคือ "git pull"

คำสั่งเองทำงานดังนี้:

git pull [options] [<repository> [<refspec>…]]

และตามค่าเริ่มต้นหมายถึงสาขาปัจจุบัน คุณสามารถตรวจสอบสาขาของคุณได้โดยใช้

git branch -a

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

*master
foo
bar
baz
---
origin/HEAD -> origin/master
origin/deploy
origin/foo
origin/master
origin/bar
remote2/foo
remote2/baz

เมื่อคุณดูที่ repo ระยะไกลคุณจะเห็นสิ่งที่คุณอ้างถึง:

git remote show origin

จะมีรายการดังต่อไปนี้:

* remote origin
  Fetch URL: ssh://git@git.example.com:12345/username/somerepo.git
  Push  URL: ssh://git@git.example.com:12345/username/somerepo.git
  HEAD branch: master
  Remote branches:
    foo    tracked
    master tracked
  Local refs configured for 'git push':
    foo    pushes to foo    (up to date)
    master pushes to master (fast-forwardable)

จึงค่อนข้างง่ายที่จะต้องแน่ใจว่าจะดึงจากจุดใดและดันไปที่ใด

3.จะดูการเปลี่ยนแปลงรายละเอียดในไฟล์เฉพาะได้อย่างไร?

4.จะดูการเปลี่ยนแปลงในผลลัพธ์สรุปโดย last git pull อีกครั้งได้อย่างไร?

วิธีที่ง่ายและสง่างามที่สุด (imo) คือ:

git diff --stat master@{1}..master --dirstat=cumulative,files

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

 mu-plugins/media_att_count.php                     |  0
 mu-plugins/phpinfo.php                             |  0
 mu-plugins/template_debug.php                      |  0
 themes/dev/archive.php                             |  0
 themes/dev/category.php                            | 42 ++++++++++++++++++
 .../page_templates/foo_template.php                |  0
 themes/dev/style.css                               |  0
 themes/dev/tag.php                                 | 44 +++++++++++++++++++
 themes/dev/taxonomy-post_format.php                | 41 +++++++++++++++++
 themes/dev/template_parts/bar_template.php         |  0
 themes/someproject/template_wrappers/loop_foo.php  | 51 ++++++++++++++++++++++
---
 11 files changed, 178 insertions(+)
  71.3% themes/dev/
  28.6% themes/someproject/template_wrappers/
 100.0% themes/
  27.2% mu-plugins/
   9.0% themes/dev/page_templates/
   9.0% themes/dev/template_parts/
  63.6% themes/dev/
   9.0% themes/someproject/template_wrappers/
  72.7% themes/

2

วิธีนี้เป็นวิธีที่แฮ็ก แต่จะช่วยให้คุณใช้เครื่องมือกราฟิกเช่นgitkหรือgitgหรือgit-gui:

git pull
git reset HEAD@{1}
gitg (or gitk or whatever tool you like)

คำตอบที่ได้รับคะแนนโหวตมากที่สุดให้วิธีที่ดีที่สุดในการใช้เครื่องมือ git แต่ฉันใช้วิธีนี้เพราะฉันสามารถใช้เครื่องมือกับ GUI เพื่อดูการเปลี่ยนแปลง: P

จากนั้นฉันจะมีขั้นตอนพิเศษในการทำ a git checkout .แล้วทำgit pullอีกครั้งเพื่อที่ฉันจะดึงและผสานอย่างเหมาะสม แต่ฉันให้ความสำคัญกับความสามารถในการตรวจสอบความแตกต่างใน GUI มากพอที่จะจัดการกับสองขั้นตอนพิเศษ

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