Git - แก้ไขข้อผิดพลาด
ความผิดพลาดคือมนุษย์ ดังนั้น VCS ทุกตัวจึงมีคุณสมบัติในการแก้ไขข้อผิดพลาดจนถึงจุดหนึ่ง Git มีคุณลักษณะที่เราสามารถใช้เพื่อเลิกทำการแก้ไขที่ทำกับที่เก็บในเครื่อง
สมมติว่าผู้ใช้ทำการเปลี่ยนแปลงบางอย่างกับที่เก็บในเครื่องโดยไม่ได้ตั้งใจจากนั้นต้องการเลิกทำการเปลี่ยนแปลงเหล่านี้ ในกรณีเช่นนี้ไฟล์revert การดำเนินงานมีบทบาทสำคัญ
ยกเลิกการเปลี่ยนแปลงที่ไม่ได้ผูกมัด
ให้เราสมมติว่าเจอร์รี่แก้ไขไฟล์โดยบังเอิญจากที่เก็บในเครื่องของเขา แต่เขาต้องการยกเลิกการแก้ไข ในการจัดการกับสถานการณ์นี้เราสามารถใช้ไฟล์git checkoutคำสั่ง เราสามารถใช้คำสั่งนี้เพื่อย้อนกลับเนื้อหาของไฟล์
[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src
[jerry@CentOS src]$ git status -s
M string_operations.c
[jerry@CentOS src]$ git checkout string_operations.c
[jerry@CentOS src]$ git status –s
นอกจากนี้เราสามารถใช้ไฟล์ git checkoutคำสั่งเพื่อรับไฟล์ที่ถูกลบจากที่เก็บโลคัล ให้เราสมมติว่า Tom ลบไฟล์จากที่เก็บในเครื่องและเราต้องการไฟล์นี้คืน เราสามารถบรรลุสิ่งนี้ได้โดยใช้คำสั่งเดียวกัน
[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
[tom@CentOS src]$ ls -1
Makefile
string_operations.c
[tom@CentOS src]$ rm string_operations.c
[tom@CentOS src]$ ls -1
Makefile
[tom@CentOS src]$ git status -s
D string_operations.c
Git กำลังแสดงตัวอักษร Dก่อนชื่อไฟล์ สิ่งนี้บ่งชี้ว่าไฟล์ถูกลบออกจากที่เก็บโลคัล
[tom@CentOS src]$ git checkout string_operations.c
[tom@CentOS src]$ ls -1
Makefile
string_operations.c
[tom@CentOS src]$ git status -s
Note - เราสามารถดำเนินการทั้งหมดนี้ก่อนที่จะกระทำ
ลบการเปลี่ยนแปลงจาก Staging Area
เราได้เห็นว่าเมื่อเราดำเนินการเพิ่มไฟล์จะย้ายจากที่เก็บในเครื่องไปยังพื้นที่ที่ระบุ หากผู้ใช้แก้ไขไฟล์โดยไม่ได้ตั้งใจและเพิ่มลงในพื้นที่การจัดเตรียมผู้ใช้สามารถเปลี่ยนกลับการเปลี่ยนแปลงได้โดยใช้git checkout คำสั่ง
ใน Git มีตัวชี้ HEAD หนึ่งตัวที่ชี้ไปที่คอมมิตล่าสุดเสมอ หากคุณต้องการยกเลิกการเปลี่ยนแปลงจากพื้นที่จัดฉากคุณสามารถใช้คำสั่ง git checkout แต่ด้วยคำสั่ง checkout คุณต้องระบุพารามิเตอร์เพิ่มเติมนั่นคือตัวชี้ HEAD พารามิเตอร์ตัวชี้การกระทำเพิ่มเติมจะสั่งให้คำสั่ง git checkout เพื่อรีเซ็ตโครงสร้างการทำงานและเพื่อลบการเปลี่ยนแปลงแบบทีละขั้น
ให้เราสมมติว่า Tom แก้ไขไฟล์จากที่เก็บในเครื่องของเขา หากเราดูสถานะของไฟล์นี้จะแสดงว่าไฟล์นั้นถูกแก้ไข แต่ไม่ได้ถูกเพิ่มเข้าไปในพื้นที่จัดเตรียม
tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file
[tom@CentOS src]$ git status -s
# Modify file and view it’s status.
[tom@CentOS src]$ git status -s
M string_operations.c
[tom@CentOS src]$ git add string_operations.c
สถานะ Git แสดงว่าไฟล์มีอยู่ในพื้นที่การจัดเตรียมตอนนี้เปลี่ยนกลับโดยใช้คำสั่ง git checkout และดูสถานะของไฟล์ที่ถูกเปลี่ยนกลับ
[tom@CentOS src]$ git checkout HEAD -- string_operations.c
[tom@CentOS src]$ git status -s
ย้าย HEAD Pointer ด้วย Git Reset
หลังจากทำการเปลี่ยนแปลงเล็กน้อยคุณอาจตัดสินใจลบการเปลี่ยนแปลงเหล่านี้ คำสั่ง Git reset ใช้เพื่อรีเซ็ตหรือย้อนกลับการเปลี่ยนแปลง เราสามารถทำการรีเซ็ตได้สามประเภท
แผนภาพด้านล่างแสดงภาพแทนคำสั่ง Git reset


อ่อนนุ่ม
แต่ละสาขามีตัวชี้ HEAD ซึ่งชี้ไปที่การคอมมิตล่าสุด หากเราใช้คำสั่ง Git reset กับ --soft option ตามด้วยรหัสกระทำมันจะรีเซ็ตตัวชี้ HEAD เท่านั้นโดยไม่ทำลายอะไรเลย
.git/refs/heads/masterไฟล์เก็บรหัสคอมมิตของตัวชี้ HEAD เราสามารถตรวจสอบได้โดยใช้ไฟล์git log -1 คำสั่ง
[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1
ตอนนี้ดูรหัสคอมมิตล่าสุดซึ่งจะตรงกับรหัสคอมมิตด้านบน
[jerry@CentOS project]$ git log -2
คำสั่งดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้
commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530
Removed executable binary
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530
Added compiled binary
ให้เรารีเซ็ตตัวชี้ HEAD
[jerry@CentOS project]$ git reset --soft HEAD~
ตอนนี้เราเพิ่งรีเซ็ตตัวชี้ HEAD กลับไปหนึ่งตำแหน่ง ให้เราตรวจสอบเนื้อหาของ.git/refs/heads/master file.
[jerry@CentOS project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62
Commit ID จากไฟล์มีการเปลี่ยนแปลงตอนนี้ตรวจสอบโดยดูข้อความคอมมิต
jerry@CentOS project]$ git log -2
คำสั่งดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530
Added compiled binary
commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:08:01 2013 +0530
Added Makefile and renamed strings.c to string_operations.c
ผสม
การรีเซ็ต Git ด้วย - ตัวเลือกแบบผสมจะเปลี่ยนกลับการเปลี่ยนแปลงเหล่านั้นจากพื้นที่การแสดงละครที่ยังไม่ได้รับการยืนยัน มันย้อนกลับการเปลี่ยนแปลงจากพื้นที่การแสดงละครเท่านั้น การเปลี่ยนแปลงที่เกิดขึ้นจริงกับสำเนาที่ใช้งานได้ของไฟล์จะไม่ได้รับผลกระทบ การรีเซ็ต Git เริ่มต้นจะเทียบเท่ากับการรีเซ็ตคอมไพล์ - ผสม
ยาก
หากคุณใช้ --hard option กับคำสั่ง Git reset ระบบจะล้างพื้นที่การแสดงละคร มันจะรีเซ็ตตัวชี้ HEAD เป็นคอมมิตล่าสุดของรหัสคอมมิตเฉพาะและลบการเปลี่ยนแปลงไฟล์ในเครื่องด้วย
ให้เราตรวจสอบรหัสคอมมิต
[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src
[jerry@CentOS src]$ git log -1
คำสั่งดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้
commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530
Removed executable binary
เจอร์รี่แก้ไขไฟล์โดยเพิ่มข้อคิดเห็นบรรทัดเดียวที่จุดเริ่มต้นของไฟล์
[jerry@CentOS src]$ head -2 string_operations.c
/* This line be removed by git reset operation */
#include <stdio.h>
เขาตรวจสอบโดยใช้คำสั่ง git status
[jerry@CentOS src]$ git status -s
M string_operations.c
Jerry เพิ่มไฟล์ที่แก้ไขไปยังพื้นที่การจัดเตรียมและตรวจสอบด้วยคำสั่ง git status
[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS src]$ git status
คำสั่งดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
modified: string_operations.c
#
สถานะ Git แสดงว่ามีไฟล์อยู่ในพื้นที่จัดเตรียม ตอนนี้รีเซ็ต HEAD ด้วย - ตัวเลือกยาก
[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1
HEAD is now at 5776472 Removed executable binary
คำสั่งรีเซ็ต Git สำเร็จซึ่งจะคืนไฟล์จากพื้นที่การจัดเตรียมรวมทั้งลบการเปลี่ยนแปลงในเครื่องที่ทำกับไฟล์
[jerry@CentOS src]$ git status -s
สถานะ Git แสดงว่าไฟล์ถูกเปลี่ยนกลับจากพื้นที่จัดเตรียม
[jerry@CentOS src]$ head -2 string_operations.c
#include <stdio.h>
คำสั่ง head ยังแสดงให้เห็นว่าการดำเนินการรีเซ็ตได้ลบการเปลี่ยนแปลงภายในเครื่องด้วย