經常使用的GIT命令詳細解析html
1 . HEAD指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令 git reset --hard commit_id。
git reset --hard HEAD^ :返回到最近的上一個版本 (回到過去)
git reset --hard HEAD^^ :返回到最近的上上一個版本(回到過去)
git reset --hard HEAD~100 :返回往上100個版本(回到過去)
git reset --hard commit_id :回到將來的某個版本(回到將來)
git reset HEAD file :能夠把暫存區的修改撤銷掉(unstage),從新放回工做區(HEAD 表示最新的版本)git
2 . 穿梭前,用git log能夠查看提交歷史,以便肯定要回退到哪一個版本。
git log : 顯示從最近到最遠的提交日誌
git log --pretty=oneline : 若是嫌輸出信息太多,看得眼花繚亂的,能夠試試 (排列規則不同)github
3 . 要重返將來,用git reflog查看命令歷史,以便肯定要回到將來的哪一個版本。網絡
4 . 工做區(Working Directory) : 你在電腦裏能看到的目錄就是工做區 (一個文件就是一個工做區)
版本庫(Repository) :工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫
git版本庫裏面最重要的就是稱爲stage(或者叫index)的暫存區,Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD
git add :把文件修改添加到暫存區
git commit : 就是把暫存區的全部內容提交到當前分支 / git commit -m "understand how stage works" 雙引號爲添加的註釋
git status : 查看狀態
git diff HEAD : 能夠查看工做區和版本庫裏面最新版本的區別
5 . git checkout ngcard-test: 切換本地分支
git checkout -- file :文件在工做區的修改所有撤銷
兩種狀況: 一種是readme.txt自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態
一種是readme.txt已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。
總之,就是讓這個文件回到最近一次git commit或git add時的狀態。
總結:
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
6 . git rm file :刪除一個文件
一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,而且git commit:
7 . -------> 先有本地庫,後有遠程庫的時候 如何關聯遠程庫 <----------
git push -u origin master / git push origin master (簡化後的)
因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,
還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。app
小結:
要關聯一個遠程庫,使用命令 git remote add origin git@server-name:path/repo-name.git;
關聯後,使用命令 git push -u origin master 第一次推送master分支的全部內容;
此後,每次本地提交後,只要有必要,就可使用命令 git push origin master 推送最新修改;
分佈式版本系統的最大好處之一是在本地工做徹底不須要考慮遠程庫的存在,也就是有沒有聯網均可以正常工做,而SVN在沒有聯網的時候是拒絕幹活的!
當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!eclipse
8 . --------> 先建立遠程庫,而後,從遠程庫克隆 <-----------
要克隆一個倉庫,首先必須知道倉庫的地址,而後使用 git clone 命令克隆。 / git clone git @github.com:michaelliao/gitskills.git
Git支持多種協議,包括https,但經過ssh支持的原生git協議速度最快。
9 . 查看分支:git branchssh
建立分支:git branch <name>分佈式
切換分支:git checkout <name>ide
建立+切換分支:git checkout -b <name>學習
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
10 . 當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
用 git log --graph 命令能夠看到分支合併圖。
11 . git merge --no-ff -m "merge with no-ff" dev : 請注意--no-ff參數,表示禁用Fast forward, 本次合併要建立一個新的commit,因此加上-m參數,把 commit描述寫進去。
合併分支時,加上--no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併。
12 . 修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;
當手頭工做沒有完成時,先把工做現場 git stash 一下,而後去修復bug,修復後,再 git stash pop ,回到工做現場。
git stash apply (先恢復)--> git stash drop (再刪除) <==> git stash pop (恢復的同時把stash內容也刪了)
13 . git branch -D name :強行刪除
開發一個新feature,最好新建一個分支;
若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>強行刪除。
14 . 首先,能夠試圖用 git push origin branch-name 推送本身的修改;
若是推送失敗,則由於遠程分支比你的本地更新,須要先用 git pull 試圖合併;
若是合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用 git push origin branch-name 推送就能成功!
若是git pull提示「no tracking information」,則說明本地分支和遠程分支的連接關係沒有建立,用命令 git branch --set-upstream branch-name origin/branch-name 。
這就是多人協做的工做模式,一旦熟悉了,就很是簡單。
總結:
查看遠程庫信息,使用git remote -v;
本地新建的分支若是不推送到遠程,對其餘人就是不可見的;
從本地推送分支,使用git push origin branch-name,若是推送失敗,先用git pull抓取遠程的新提交;
在本地建立和遠程分支對應的分支,使用 git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
創建本地分支和遠程分支的關聯,使用 git branch --set-upstream branch-name origin/branch-name;
從遠程抓取分支,使用git pull,若是有衝突,要先處理衝突。
15 . 建立標籤
命令 git tag <name> 用於新建一個標籤,默認爲HEAD,也能夠指定一個commit id;
git tag -a <tagname> -m "blablabla..." 能夠指定標籤信息;
git tag -s <tagname> -m "blablabla..." 能夠用PGP簽名標籤;
命令 git tag 能夠查看全部標籤。
16 . 刪除標籤
git push origin <tagname> 能夠推送一個本地標籤;
git push origin --tags 能夠推送所有未推送過的本地標籤;
git tag -d <tagname> 能夠刪除一個本地標籤;
git push origin :refs/tags/<tagname> 能夠刪除一個遠程標籤。
-----------》》》20180809 》》》續-------》
17. 刪除git庫中untracked files(未監控)的文件
# 刪除 untracked files
git clean -f
# 連 untracked 的目錄也一塊兒刪掉
git clean -fd
# 連 gitignore 的untrack 文件/目錄也一塊兒刪掉 (慎用,通常這個是用來刪掉編譯出來的 .o之類的文件用的)
git clean -xfd
# 在用上述 git clean 前,牆裂建議加上 -n 參數來先看看會刪掉哪些文件,防止重要文件被誤刪
git clean -nxfd
git clean -nf
git clean -nfd
18. 把本地的 develop 分支強制(-f)推送到遠程 develop ,本地develop分支覆蓋遠程develop分支代碼
git push origin develop:develop -f
19. 根據標籤建立新的分支,並把新的分支推送至遠程
a.執行:git origin fetch 得到最新
b.經過:git branch <new-branch-name> <tag-name> 例如:git branch cfg-v2.3.2 tag-v20180801 根據tag建立新的分支.
c.能夠經過git checkout newbranch 例如:git checkout cfg-v2.3.2 切換到新的分支
d.經過 git push origin newbranch 例如:git push origin cfg-v2.3.2 把本地建立的分支提交到遠程倉庫
》》》》》如今遠程倉庫也會有新建立的分支啦!
20.git stash (git 儲藏)的使用總結:
Step1
新增 git stash save -a "message" // 對於在項目里加入了代碼新文件的開發來講,-a選項纔會將新加入的代碼文件同時放入暫存區 相似於 git commit -a -m ""
Step2
查看列表 git stash list
使用git stash show stash@{X}命令來查看,其中‘X’表示列表號。
Step3
應用的話是 git stash apply stash@{id} //能夠將列表中任何一次修改應用到當前工做區
Step4
關於 git stash pop 也能夠將list中最新的提取出來,可是不一樣於apply, pop 會把list 中刪除,後期不易恢復
Step5
若是真的git stash pop 了,也是能夠恢復的。// git log --graph --oneline $(git fsck | awk '/dangling commit/ {print $3}') 找到對應的commitId
具體參考 http://www.jianshu.com/p/9a316b546808
Step6
刪除某個stash的話 git stash drop stash@{id}
Step7
刪除所有的stash list 直接經過 git stash clear
參考文獻:http://www.javashuo.com/article/p-bccxeqrs-eg.html
使用於初學者剛開始學習GIT安裝使用教程(初學者必讀):
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Git可視化極簡易教程 —— Git GUI使用方法 :
http://www.cnblogs.com/iruxu/p/gitgui.html
http://www.javashuo.com/article/p-witkfvsm-kc.html
http://www.javashuo.com/article/p-mkhxdyrr-ca.html
http://www.javashuo.com/article/p-omkrbahy-nr.html
Git 命令表:
http://www.javashuo.com/article/p-hqbutcma-ev.html
eclipse的git插件安裝、配置與使用:
http://www.javashuo.com/article/p-gbutjhtu-nb.html
https://blog.csdn.net/fengye_yulu/article/details/52116146
注意:紅色爲重點學習教程,藍色的只是部分參考