Git命令詳解2
新增操作
git add <filename> //新增到暫存區(stage)
git add . //全部提交到暫存區
提交操作
git commit -m <description> //提交到本地庫(必須先add)
git commit -am //可提交未add檔案,但是不包括未建立檔案
git commit --amend -m "description" //這個命令會將暫存區中的檔案提交。 如果自上次提交以來你還未做任何修改(例如,在上次提交後馬上執行了此命令),那麼快照會保持不變,而你所修改的只是提交資訊。
刪除操作
git rm <file> //從暫存區刪除(stage)
git rm -f <file> //刪除之前修改過並且已經放到暫存區域
git rm --cached <file> //如果把檔案從暫存區域移除,但仍然希望保留在當前工作目錄中,換句話說,僅是從跟蹤清單中刪除
撤銷操作
在Git中,用HEAD表示當前版本。
git HEAD
git HEAD~ //上一個版本
git HEAD~100 //往上100個版本
撤銷add
git checkout <file> //恢復未提交的更改
git reset HEAD <file> //取消之前 git add 新增
撤銷commit
git reset
git reset --hard HEAD~ //回退到上一個版本
git reset --hard <commit ID> //回退到指定版本
版本直接回退,簡單粗暴。
如果遠端分支也想要回退,git push -f (known changes)。
git revert
git revertHEAD//撤銷前一次commit
不能隨便刪除已經發布的提交,這時需要通過revert建立要否定的提交。
如果不小心提交了不想要的程式碼,而小夥伴在你發現時,已經提交了,這時候就不能簡單的回退版本。
git revert <commitID>//需要撤銷的提交ID
這時候會有衝突,解決衝突之後,再重新提交,那麼就會產生一條新的提交紀錄。
提交到遠端分支,git push。
git revert 和 git reset的區別
- git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。
- 在回滾這一操作上看,效果差不多。但是在日後繼續merge以前的老版本時有區別。因為git revert是用一次逆向的commit“中和”之前的提交,因此日後合併老的branch時,導致這部分改變不會再次出現,但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入。
- git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。
移動或重新命名操作
git mv 命令用於移動或重新命名一個檔案、目錄。
git mv <file>
git mv <old name> <new name>
其實,執行 git mv 就相當於運行了下面三條命令:
mv README.md README
git rm README.md
git add README
git rebase
git rebase和git merge區別
在rebase的過程中,也許會出現衝突(conflict)。 在這種情況,Git會停止rebase並會讓你去解決衝突;在解決完衝突後,用"git-add"命令去更新這些內容的索引(index), 然後,你無需執行 git-commit,只要執行:
git rebase --continue //繼續
git rebase --abort //取消
git rebase -i
在rebase指定i選項,您可以改寫、替換、刪除或合併提交。
gitrebase-i[startpoint][endpoint]
其中-i的意思是--interactive,即彈出互動式的介面讓使用者編輯完成合並操作,[startpoint] [endpoint]則指定了一個編輯區間,如果不指定[endpoint],則該區間的終點預設是當前分支HEAD所指向的commit(注:該區間指定的是一個前開後閉的區間)。
- pick:保留該commit(縮寫:p)
- reword:保留該commit,但我需要修改該commit的註釋(縮寫:r)
- edit:保留該commit, 但我要停下來修改該提交(不僅僅修改註釋)(縮寫:e)
- squash:將該commit和前一個commit合併(縮寫:s)
- fixup:將該commit和前一個commit合併,但我不要保留該提交的註釋資訊(縮寫:f)
- exec:執行shell命令(縮寫:x)
- drop:我要丟棄該commit(縮寫:d)
合併歷史紀錄
git rebase -i HEAD~2
//我們會進入vit模式,將pick改成squash,然後按esc : wq(儲存並退出)。
git push -f
git status
要檢視哪些檔案處於什麼狀態。
gitstatus-s | gitstatus--short //得到一種更為緊湊的格式輸出
git diff
git diff 命令顯示add與commit的改動區別。
git diff <file> //尚未快取的改動
git diff --cached //檢視已快取的改動
git diff HEAD //檢視已快取的與未快取的所有改動
git diff --stat //顯示摘要而非整個 diff
檢視提交歷史
git log
在提交了若干更新,又或者克隆了某個專案之後,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是 git log 命令。
git log -p //用來顯示每次提交的內容差異
git log -2 //僅顯示最近兩次提交
git log --stat //每次提交的簡略的統計資訊
git log --pretty //指定使用不同於預設格式的方式展示提交歷史,git log --pretty=oneline
使用git show命令檢視某一次提交詳細資訊。
git reflog
如果在回退以後又想再次回到之前的版本,git reflog 可以檢視所有分支的所有操作記錄(包括commit和reset的操作),包括已經被刪除的commit記錄,git log則不能察看已經刪除了的commit記錄。
gitreflog
git stash
在Git中,隱藏操作將使您能夠修改跟蹤檔案,階段更改,並將其儲存在一系列未完成的更改中,並可以隨時重新應用。
git stash //把當前工作的改變隱藏起來
git stash list //檢視已存在更改的列表
git stash pop //可從堆疊中刪除更改並將其放置在當前工作目錄中
分支操作
建立分支
git branch <branch name> //建立分支
git checkout <branch name> //切換到分支
git checkout -b <branch name> //建立並切換到分支
刪除分支
git branch -d <branch name>
git branch -D <branch name> //強制刪除分支
刪除多個分支
必須在git bash命令下輸入
git branch | grep '分支名' //匹配分支名,可用正則
git branch | grep '分支名' | cut-c 2- | xargs git branch -D
反選:git branch | grep '分支名' -D
檢視分支
git branch <name>
git branch -a //檢視所有分支
git branch -r //檢視遠端分支
重新命名分支
git branch -m<oldname><newname>
合併分支
git checkout master //切換到master
git merge <branch name> //合併分支
如果分支未pull最新程式碼,那麼提交的時候,歷史紀錄就不清晰;匯合分支上的提交,然後一同合併到分支
git merge –squash <branch name>
git commit -am
git push
提取其他分支提交
在cherry-pick,您可以從其他分支複製指定的提交,然後匯入到現在的分支。
gitcherry-pick <commit id>
標籤操作
如果你達到一個重要的階段,並希望永遠記住那個特別的提交快照,你可以使用 git tag 給它打上標籤。
建立標籤
git tag <name>
git tag -a <name> //建立一個帶註解的標籤
檢視標籤
gittag
git show <tag name>
git push origin <tag name>
刪除標籤
gittag -d <name>
提交空資料夾
- 在空資料夾內新建.gitignore檔案,並寫上如下:
#Ignore everything in this directory
*
#Except this file
!.gitignore
- 我們也可以建立個對專案無影響的檔案,如 .gitkeep 名字大家隨意即可