ไปที่การแก้ไขเฉพาะ


582

ฉันโคลนที่เก็บคอมไพล์ของโปรเจ็กต์หนึ่ง ฉันสามารถเปลี่ยนไฟล์ให้อยู่ในสถานะเริ่มต้นและเมื่อฉันตรวจสอบไฟล์ไปที่การแก้ไข 2, 3, 4 ... ล่าสุดได้หรือไม่ ฉันต้องการที่จะเห็นภาพรวมของการพัฒนาโครงการ

คำตอบ:


874

ใช้git checkout <sha1>เพื่อตรวจสอบการกระทำที่เฉพาะเจาะจง


2
git log -n1คุณสามารถทำเช่นนี้ แต่ถ้าgit checkoutล้มเหลวมันเสียความพยายาม
Marcelo Cantos

2
มันได้ผล. ฉันต้องใช้ sha1 แบบเต็ม (ไม่ใช่บางส่วน) และถ้าฉันต้องการนำโครงการไปแก้ไขครั้งที่สอง git logแสดงเฉพาะการคอมมิทครั้งแรกตอนนี้ฉันสามารถค้นหา sha1 ของการคอมมิทครั้งต่อไปได้หรือไม่?
xralf

6
คุณควรใช้ sha1 ให้เพียงพอเพื่อรับประกันเอกลักษณ์ บางทีคุณอาจมีเรื่องบังเอิญโชคร้าย Git ไม่มีแนวคิดของการกระทำ "ถัดไป"; history เป็น DAG ที่มีลูกศรชี้ไปทางหลังทั้งหมด คุณควรรันgit log --onelineและเอาท์พุทติดเข้าไปในไฟล์ข้อความเพื่ออ้างอิง (ผลรวม sha1 ที่ย่อนั้นจะมีการรับประกันว่าจะไม่ซ้ำกัน) อีกตัวเลือกหนึ่งถ้าประวัติของคุณเป็นแบบเชิงเส้นคือการหาจำนวนการคอมมิชชันที่มีตั้งแต่การคอมมิทจนกระทั่งถึงmasterและใช้git checkout master~543(ถ้ามี 543 คอมมิชชัน) ดังนั้นgit checkout master~542เป็นต้น
Marcelo Cantos

19
และวิธีการเช็คเอาท์กลับไปที่การยอมรับปัจจุบันจาก "git checkout <sha1>"?
アレックス

6
@AlexanderSupertramp ชำระเงินที่สาขา
Marcelo Cantos

50

หากต้องการไปที่เวอร์ชันเฉพาะ / ส่งคำสั่งรันคำสั่ง รหัสแฮชที่คุณจะได้รับจากgit log --oneline -n 10

git reset --hard HASH-CODE

หมายเหตุ - หลังจากรีเซ็ตเป็นเวอร์ชั่น / การส่งมอบโดยเฉพาะคุณสามารถเรียกใช้git pull --rebaseงานได้หากคุณต้องการดึงการคอมมิททั้งหมดที่ถูกทิ้งไป


1
โปรดทราบว่า a resetไม่เพียงแค่ชำระเงินเฉพาะจุดในกราฟมันจะย้ายสาขาที่คุณได้ชำระเงินในปัจจุบัน
Liam

รวมถึงresetการเปลี่ยนแปลงที่รอดำเนินการทั้งหมดของคุณจะถูกยกเลิก
WilliamKF

2
- ฮาร์ดแฟล็กจะลบการกระทำใด ๆ หลังจากแฮชกล่าว .... อาจต้องการเพิ่มบิตเล็กน้อยที่นี่ ฉันแน่ใจว่าผู้คนสูญเสียประวัติและสงสัยว่าทำไม
Urasquirrel

git pull --rebaseใช้งานได้เฉพาะในกรณีที่คุณมีรีโมทสำหรับ repo ของคุณและเป็นข้อมูลล่าสุด
Keith Thompson

19

gitkคุณจะได้รับมุมมองแบบกราฟิกของประวัติศาสตร์โครงการที่มีเครื่องมือเช่น เพิ่งรัน:

gitk --all

หากคุณต้องการชำระเงินสาขาที่เฉพาะเจาะจง:

git checkout <branch name>

สำหรับการคอมมิทเฉพาะใช้แฮช SHA1 แทนชื่อสาขา (ดูTreeishในGit Community Bookซึ่งเป็นการอ่านที่ดีเพื่อดูตัวเลือกอื่น ๆ สำหรับการนำทางต้นไม้ของคุณ)

git log มีทั้งชุดของตัวเลือกเพื่อแสดงรายละเอียดหรือประวัติสรุปด้วย

ฉันไม่รู้วิธีง่ายๆในการก้าวไปข้างหน้าในประวัติการกระทำ โครงการที่มีประวัติเชิงเส้นอาจไม่ใช่สิ่งที่พบได้ทั่วไป แนวคิดของ "การแก้ไข" อย่างที่คุณมีกับ SVN หรือ CVS นั้นไม่ได้ทำแผนที่ทั้งหมดใน Git


2
ระวัง: คอมไพล์จะไม่โกหกคุณโดยให้ประวัติเชิงเส้นเดียวของโครงการ นั่นคือถ้าโครงการไม่ได้พัฒนาอย่างนั้น
Andres Jaan Tack

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

5

ด้วยการใช้คีย์ SHA1 ของคอมมิชชันคุณสามารถทำสิ่งต่อไปนี้:

  • ขั้นแรกค้นหาการคอมมิตที่คุณต้องการสำหรับไฟล์เฉพาะ:

    git log -n <# commits> <file-name>

    สิ่งนี้อิงจากคุณ<# commits>จะสร้างรายการข้อผูกพันสำหรับไฟล์เฉพาะ

    เคล็ดลับ: หากคุณไม่แน่ใจว่าคุณกำลังค้นหาสิ่งใดวิธีที่ดีในการค้นหาคือการใช้คำสั่งต่อไปนี้: git diff <commit-SHA1>..HEAD <file-name>ถ้าคุณไม่แน่ใจว่าสิ่งที่กระทำที่คุณกำลังมองหาวิธีที่ดีที่จะพบคือใช้คำสั่งต่อไปนี้: คำสั่งนี้จะแสดงความแตกต่างระหว่างเวอร์ชั่นปัจจุบันของการคอมมิทและเวอร์ชั่นก่อนหน้าของการคอมมิทสำหรับไฟล์ที่ระบุ

    หมายเหตุ: รหัส SHA1 ของคีย์ได้รับการจัดรูปแบบในgit log -nรายการของ:

ผูกมัด <SHA1 id>

  • ประการที่สองชำระเงินรุ่นที่ต้องการ:

    หากคุณพบกระทำ / รุ่นที่คุณต้องการเพียงแค่ใช้คำสั่ง: git checkout <desired-SHA1> <file-name>

    สิ่งนี้จะวางเวอร์ชันของไฟล์ที่คุณระบุในพื้นที่จัดเตรียม หากต้องการนำออกจากพื้นที่การแสดงชั่วคราวเพียงใช้คำสั่ง:reset HEAD <file-name>

หากต้องการย้อนกลับไปที่ที่เก็บรีโมตชี้ไปที่ให้ใช้คำสั่ง: git checkout HEAD <file-name>


2

ฉันอยู่ในสถานการณ์ที่เรามีสาขาหลักแล้วสาขาอื่นที่เรียกว่า 17.0 และภายใน 17.0 นี้มีแฮชคอมมิชชันที่ไม่พูดว่า"XYZ" "XYZ"และลูกค้าจะได้รับบิลด์จนกว่าจะมีการแก้ไข XYZ ตอนนี้เราเจอข้อผิดพลาดและต้องแก้ไขสำหรับลูกค้ารายนั้น ดังนั้นเราต้องสร้างสาขาแยกสำหรับลูกค้ารายนั้นจนกระทั่งแฮช "xyz" ดังนั้นนี่คือวิธีที่ฉันทำ

ก่อนอื่นฉันสร้างโฟลเดอร์โดยใช้ชื่อลูกค้าในเครื่องของฉัน สมมติว่าชื่อลูกค้าคือ "AAA" เมื่อโฟลเดอร์นั้นถูกสร้างขึ้นโดยใช้คำสั่งในโฟลเดอร์นี้:

  1. git init
  2. git cloneหลังจากคำสั่งนี้คุณจะอยู่ในกิ่งต้นแบบ ดังนั้นเปลี่ยนเป็นสาขาที่ต้องการ
  3. git checkout 17.0สิ่งนี้จะนำคุณไปยังสาขาที่มีการกระทำของคุณ
  4. git checkoutนี่จะใช้พื้นที่เก็บข้อมูลของคุณจนกระทั่งแฮชส่งมอบ ดูชื่อสาขาของคุณที่เปลี่ยนไปเป็นแฮชเบอร์ที่ ตอนนี้ให้ชื่อสาขาที่แฮชนี้
  5. git branch ABCสิ่งนี้จะสร้างสาขาใหม่ในเครื่องของคุณ
  6. git checkout ABC
  7. git push origin ABCสิ่งนี้จะผลักสาขานี้ไปยังที่เก็บระยะไกลและสร้างสาขาบนเซิร์ฟเวอร์ git คุณทำเสร็จแล้ว

1

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

ใช้git format-patch <initial revision>แล้วgit checkout <initial revision>แล้วคุณควรได้รับกองไฟล์ในผู้อำนวยการของคุณเริ่มต้นด้วยตัวเลขสี่หลักซึ่งเป็นแพทช์

เมื่อคุณอ่านการแก้ไขเสร็จแล้วคุณgit apply <filename>ควรทำเช่นนั้น git apply 0001-*และนับ

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

คู่มือ git ทำให้ฉันด้วย:

git show next~10:Documentation/README

แสดงเนื้อหาของไฟล์เอกสาร / README ตามที่เป็นปัจจุบันในการกระทำครั้งที่ 10 ครั้งสุดท้ายของสาขาต่อไป

คุณสามารถดูที่git blame filenameให้รายชื่อที่แต่ละบรรทัดเชื่อมโยงกับคอมมิชชันแฮช + ผู้เขียน


1

ในการรับรหัสที่ได้รับมอบหมายคุณต้องใช้รหัสแฮชของการส่งนั้น คุณสามารถรับรหัสแฮชได้สองวิธี:

  1. รับจากบัญชี github / gitlab / bitbucket ของคุณ (เป็น URL การกระทำของคุณเช่น: github.com/user/my_project/commit/ commit_hash_code ) หรือคุณสามารถ
  2. git logและตรวจสอบการกระทำล่าสุดของคุณในสาขานั้น มันจะแสดงรหัสแฮชของการกระทำของคุณและข้อความที่คุณปล่อยไว้ในขณะที่คุณกำลังยืนยันรหัสของคุณ เพียงคัดลอกแล้วทำgit checkout commit_hash_code

หลังจากย้ายไปยังรหัสนั้นแล้วหากคุณต้องการทำงานกับมันและทำการเปลี่ยนแปลงคุณควรสร้างสาขาอื่นด้วยgit checkout -b <new-branch-name>มิฉะนั้นการเปลี่ยนแปลงจะไม่ถูกเก็บไว้


0

เพื่อตรวจสอบความมุ่งมั่น (คุณกำลังมองอดีต!

  • git checkout "commmitHash"

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

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