送出。
從暫存區撤回修改
reset指令可以用來重置暫存區,主要用于被重置add的部分。如果add指令之後,這個檔案有了其他修改,那麼這些修改有可能會丢失。
git reset HEAD .
git reset HEAD foo.txt
儲存修改
我們可以用stash指令,将工作區和暫存區的修改儲存在一個儲藏棧中。
git stash
恢複被儲藏的修改
我們可以用這個指令将儲藏的修改恢複到工作區中
git stash pop
//檢查儲存了哪些内容
git stash list
分支
執行切換分支的指令被拒絕該怎麼辦?
有時候如果工作區域還有一些修改,這個時候去切換分支,就會被拒絕。解決的方式有三種。第一種是送出現有的修改,然後切換。第二種是強制切換。第三種儲藏的修改并切換分支。
- 方式一
git commit --all
git checkout a-branch
- 方式二
git checkout --force a-branch
- 方式三
git stash
git checkout a-branch
//做一些修改并送出,在切回原來的分支
git stash pop
重置分支指針
分支指針每一次送出時都會移動到最新的送出上。通常情況下不太需要去設定分支指針。但是有時候我們會丢失的鈣質人的。追蹤想要恢複到之前的狀态,就需要通過重置分支指針來實作。注意它與
git reset --hard 39rt54b
注意這個指令會覆寫目前工作區和暫存區所有的修改,最好使用git stash 來儲存一下修改。
合并分支
快速合并,開發者們在a分支下進行開發,而b分支上什麼都不做。當b與a進行分支合并的時,git就變得非常簡單。但是這樣的合并并不會産生新的commit節點。
git merge --no--ff a-branch
這個指令可以強制産生一次新的送出。
變基操作
将git送出複制到其他地方,盡管修改與中繼資料保持不變。但是複制的結果會産生一個新的送出。這種方式被稱為複制送出。通常複制送出有兩個指令,git rebase和git cherry-pick
git rebase
通常這個指令你用來理順曆史送出,或者将一個分支上的送出複制到另一個分支上。
git rebase master --onto release1
解釋: 目前分支是feature-a master是原分支 release1 目标分支。 git會确認活動分支上所有不屬于原分支的送出,通過–onto選項将這些送出拷貝目标分支。如git學習指南上的60頁圖8-3
cherry-pick
摘櫻桃,主要用于撿取操作。如将一些bug的修複傳遞到各個不同的發行版本中。還有另一種應用,從即将删除的分支中轉移一些有用的送出。
版本标簽
建立一個普通标簽
git tag 1.0.0 master -m "釋出的第一個版本"
推送某個單一标簽
git push origin 1.0.0
檢視某個特定的功能,或者bug修複是否包含在客戶所安裝的那個版本。
git tag --contains f63cd77
技巧
找回丢失的修改
git像一條狗,它聞出你的恐懼
git通常不會立即删除版本中的對象。無論什麼時候,我們修改了一些東西也好。在版本庫中始終是建立了一些對象而已。舊的對象都不會被删除,即使我們調用了gc指令。git 會持續跟蹤一個分支上所發生的所有修改,并将這些所謂的日志存在logs目錄下。可以通過–walk-reflogs選項來顯示一個分支的本地記錄。
git log --walk-reflogs mybranch
隻要我們找到丢失的修改就可以通過cherry-pick指令和rebase指令将丢失的送出找回來。
忽略一些已被版本化的檔案
通常我們不希望一些修改被版本化,我們可以臨時性的忽略這個檔案。
git update-index --assume-unchange foo.txt
//暫時忽略這個檔案。以後的add 或者 status 就不會被顯示發生的修改
git update-index --really-refresh
//停止臨時性忽略