ก่อนอื่นถ้าพอมีเวลา เข้ามาอ่าน 3 หน้านี้ก่อนเลย - ใช่! แล้วก็ไม่ต้องอ่านที่พวกเราเขียนนี่ต่อแล้วล่ะ

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

git clean - เอาอันนี้ก่อน ส่วนใหญ่จะเอาไว้สำหรับลบไฟล์ที่ไม่ได้ถูก track ออกไป

สำหรับคำว่าไม่ได้ถูก track หรือ untracked นี่คือยังไง? - ตัวอย่างก็เช่นเพิ่มไฟล์เข้าไปใหม่ ยังไม่ทันได้ git add . ก็ประมาณนี้ล่ะ ลองดูตัวอย่างข้างล่าง

$ git status
On branch gh-pages
Your branch is up to date with 'origin/gh-pages'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	_posts/2019-06-06-clean-and-stash-with-git.md
	tag/Git.md

nothing added to commit but untracked files present (use "git add" to track)
$

ชัดเจนว่ามีไฟล์ที่ untracked อยู่ 2 ไฟล์ ถ้า git clean ก็จะลบไฟล์นี้ออกไปเลย สำหรับคำสั่งที่จะใช้ก็คือ:

git clean -f

จะต้องมี -f ด้วยเพื่อ force การลบ เพราะว่านี่คือคำสั่งอันตราย แต่ถ้ายังไม่ลบ แค่อยากรู้ก่อนว่าถ้าสั่งแล้วจะมีอะไรถูกลบไปบ้างถ้าเราเกิดจะสั่ง git clean ขึ้นมาจริง ๆ - ให้เราใช้คำสั่งแบบนี้ก่อนคือ:

git clean -n

โดยที่ -n ก็คือ dry-run ยังไม่ได้ run กันจริง ๆ แค่เอามาโชว์ให้ดูกันก่อน จากตัวอย่างก็จะได้แบบนี้

$ git clean -n
Would remove _posts/2019-06-06-clean-and-stash-with-git.md
Would remove tag/Git.md
$

git stash - ถัดมาอันนี้ถ้าเกิดเป็นไฟล์ที่โดน track แล้ว หรือ tracked - เช่นจากตัวอย่างถ้าเราเกิดสั่ง git add . เข้าไปแบบนี้

$ git add .
$ git status
On branch gh-pages
Your branch is up to date with 'origin/gh-pages'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   _posts/2019-06-06-clean-and-stash-with-git.md
	new file:   tag/Git.md

$

แบบนี้ถ้า git clean ก็จะไม่เกี่ยวล่ะ เพราะว่า 2 ไฟล์ใหม่นี้กลายเป็นโดน track หรือ tracked ไปเรียบร้อยแล้ว แต่แค่ยังไม่ได้ commit!

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

git stash

ถ้าจะดูว่ามี stash ตรงไหนบ้างที่เราเก็บไว้กี่ครั้งแล้วก็ใช้คำสั่ง:

git stash list

และถ้าจะกลับไปเอา stash ตรงตำแหน่งที่ว่ามาใช้ก็ให้เรียก:

git stash apply stash@{0}

และถ้าจะไม่เก็บ stash ไว้แล้วก็ให้เรียก:

git stash drop stash@{0}

โดยที่ stash@{0} นี่คือ stash ที่ต้องการนั่นเอง

ดูตัวอย่างนี้นะครับ:

$ touch file_1.txt
$ git add .
$ git stash
Saved working directory and index state WIP on gh-pages: fe163ee update and done

$ git stash list
stash@{0}: WIP on gh-pages: fe163ee update and done

$ ls file_1.txt
ls: cannot access 'file_1.txt': No such file or directory

$ git stash apply
$ ls file_1.txt
file_1.txt
$
  1. ตรงที่เราสร้างไฟล์ใหม่ touch file_1.txt
  2. เสร็จแล้วก็เพิ่มให้ track ไฟล์นี้เข้าไปด้วย git add .
  3. แล้วเราก็ git stash - เก็บงานส่วนนี้ไปก่อน เอาตัวอย่างแค่ง่าย ๆ ในที่นี้คือแค่ไฟล์ใหม่ไฟล์เดียว
  4. พอ ls file_1.txt ก็จะไม่เจออะไรเพราะถูกเก็บไปแล้ว
  5. ถ้าจะกลับไปตรงที่ stash (เพื่อเอาไฟล์นั้นมา) ก็ git stash apply - เวลาที่ไม่ได้ระบุว่า stash ไหนก็คือจะหมายถึงอันล่าสุดนั่นเอง

อธิบายตามขั้นตอนก็จะได้ความเข้าใจสักประมาณนี้นะครับ ยังไงลองใช้ดูจะได้เห็นชัดกว่า จบตอนก่อนนะครับและถ้าจะให้ดีกลับไปอ่าน 3 หน้าด้านบน - นะครับนะ!