iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
自我挑戰組

前端菜雞_賀周歲成長日誌系列 第 5

GIT 稍微進階一點的指令

  • 分享至 

  • xImage
  •  

前言

前幾天講了最基礎的幾個 git 指令,今天來講稍微比較進階的,筆者自己算常用到的指令吧。

暫存 Stash pop、退板(+改指令),在開發上有錯誤,或是想反悔時,都是個好工具!


暫存指令 stash pop

使用時機:

  • 在pull時因為檔案內容不同,而產生衝突,需要先暫存目前本機的檔案;pull下來後再把暫存放回去。
  • 編輯到一半想要暫存,之後再拿出來;先把目前的開發或修改放進抽屜,讓自己的開發回到什麼都還沒有的時候。

用意:

暫存檔案,需要的時候就取出來用。

聽過一個說法是stash這個指令就像是開一個抽屜,需要的時候把檔案從抽屜中拿出來,不需要的話一直放著也不會怎樣。

流程:

  • git stash 要存起來的時候
    • 利用Stash指令先把修改存起來。
    • 介面上會有空心點點,代表暫存的地方和檔案
  • git stash pop 要拿出來的時候
    • 把某個stash取出來,套用在目前的分支上
    • 在介面上可以直接按右鍵來選擇
    • git stash pop = apply Stash + drop Stash
  • git stash -p 相當於 git add -p 的-p參數。下指令後會出現一個互動式的介面,一個個檔案或區塊問「是否要加入stash?」,回答 「y/n」,可決定要不要放進 stash;沒stash的檔案會繼續保留在當前的commit中。

關於 git stash -p 另一種用法可以去看 這篇文章>15. 將檔案加入stash(儲藏) ,在這裡就先不示範。

補充

  • 線圖中的 stash@{0} 是代表 Stash,可以有很多份 stash@{0}、stash@{1}...
  • git stash 時如果有新增的檔案,要先 git add . 才能操作。
  • git stash pop 後如果有衝突,解衝突後再上傳即可。

使用練習

情境(1)

現在的檔案中有編輯過兩個階段的code,但我想把上傳版本分開;目前已經傳了一版,想要補傳一個版本上去

步驟(1)

  • 複製第一階段個要上傳的檔案們
  • git stash 這時的狀態會回到上一動,修改過的東西都在stash裡面
  • 把第一階段要上傳的東西貼上
  • add . 並 commit
  • git stash pop 將剛剛包含第二階段的檔案拿出來
  • 此時再上傳一次,就能有兩個階段的紀錄了

情境(2)

改了一些東西才要pull新檔案,遇到衝突時

步驟(2)

  • 檔案在"已修改但還沒commit"的狀態
  • Stash 把已經修改的東西放到抽屜裡
  • 此時檔案狀態回復到還沒改過
  • git pull 需要的遠端分支下來
  • git stash pop 把改的東西復原回來

接下來會利用GitGraph的線圖來搭配著講解(剛好有專案可以示範stash)
https://ithelp.ithome.com.tw/upload/images/20230919/20162572auqZdpJDsM.png
初始狀態

https://ithelp.ithome.com.tw/upload/images/20230919/20162572XiXst4XhEU.png
先說明下狀況,我這邊29個改的地方只有一個是修改,其他都是新增

https://ithelp.ithome.com.tw/upload/images/20230919/20162572iSGp5sJoYG.png
輸入git stash指令,stash之後檔案會變成還沒commit的樣子(我這邊是因為我加了很多檔案但沒add檔案進暫存)

https://ithelp.ithome.com.tw/upload/images/20230919/20162572uGQjXhzZVZ.png
改了一個檔案的內容

https://ithelp.ithome.com.tw/upload/images/20230919/20162572LxSKQSDZtP.png
改過之後再次stash

https://ithelp.ithome.com.tw/upload/images/20230919/20162572dUJEU8jtnS.png
我微微改了三次檔案,stash了三次,來做實驗

stash編號順序,由舊到新從 stash@{0} > stash@{1} > stash@{2}….

stash pop 的話,會從新的開始解除,一直回到編號 0,也可以指定要解除哪個 stash

git stash pop stash@{n} 可以指定要解除哪個stashID

https://ithelp.ithome.com.tw/upload/images/20230919/20162572JI4bRDRnun.png
stash pop之後, stash@{2} 先被解除了


退版 reset

使用時機:

  • 要將已經push的版倒退一格
  • 要將已經add的檔案(單個指定或是全部),自暫存區移除

用意:

將過去反悔或是有誤的紀錄清除

流程:

退版

  • git reset --hard HEAD~n :已經push了,要回去還沒push的狀態
  • git reset HEAD~ :要回去已經commit之前;沒加hard,會回到編輯後還沒commit的時候。有加hard會整個commit不見。

回復紀錄,就是git reset --hard HEAD~ 後還想重來

  • git reflog 看git幫你紀錄的 目前操作過的步驟代號commitID
  • git reset commitID

補充:

HEAD 可以看做目前所在分支

^ 代表回到前一次的版本

~ 代表上一層版本

~2 代表上兩層版本

~n 代表 上n層

以此類推(前一篇的補充)
reflog
git reflog
會顯示你操作的每個git步驟。

reset
git reset HEAD
還原檔案狀態

--hard
git reset --hard HEAD~1
還原檔案狀態,並清除在 還原以前 的檔案紀錄

--soft
git reset --soft HEAD~1
可以保留

--mixed


結語

Git指令的文章部分到這裡告一個段落,接下來,對於前端工程師菜雞更加重要的JS,會以不同主題的方式登場,擁有良好基礎的JS還是重要的!

參考資料

stash https://gitbook.tw/chapters/faq/stash
stash -p https://lighter.github.io/2016/07/09/19-tips-for-everyday-git-use/
https://zlargon.gitbooks.io/git-tutorial/content/advanced/stash.html

今天就到這,如有說明不周或錯誤的地方,還請多留言討論(鞠躬)。


上一篇
GIT基礎/常用指令
下一篇
String 常用錦集
系列文
前端菜雞_賀周歲成長日誌31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言