如下的git命令是我參考了廖雪峯等關於git的文章以後,根據本身實際工做中接觸到的狀況而總結出來的一份清單,也是以前在公司用來培訓的資料。我會繼續補充和修改,歡迎留言指教。php
自報家門 git config --global user.name "RystLee」 && git config --global user.email "rystlee100@gmail.com"
git
搭建倉庫 git init
(產生的.git是版本庫文件)github
查看倉庫的情況 git status
app
查看倉庫中的文件有什麼變化 git diff <file>
ssh
肯定倉庫中的文件的變化沒問題,將文件添加緩衝區(stage)並提交到倉庫(分支) git add <file> && git commit -m "comments"
注:添加到暫存區的文件,再對其進行修改不會影響他們接下來的commit操做ui
查看最近的改動 git log [—pretty=oneline]
this
將文件從緩衝區撤回 git reset HEAD <file>
設計
放棄文件最近一次的修改 git checkout — <file>
版本控制
時光機
回到過去: git reset —hard commit_id 或者 HEAD^
指針
HEAD是指針 指向當前版本 HEAD^^指向上上個版本 HEAD~10指向上第10個版本
返回如今: git reflog
查看提交歷史,找到你要的commit_id
刪除文件 git rm <file>
遠程倉庫GitHub
建立SSH Key: 在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,ssh-keygen -t rsa -C "rystlee100@gmail.com"
。而後將id_rsa.pub的內容拷貝到github的帳戶列表裏。
將本地倉庫和github上的遠程庫關聯並將本地的內容推送到遠程庫 git remote add origin git@github.com:rystlee/learngit.git && git push -u origin master
; origin是遠程庫的默認名稱, -u參數負責將本地的master分支與遠程的master分支關聯起來,在之後的推送時不要加該參數 git push origin master
克隆遠程庫 git clone git@github.com:rystlee/learngit.git
查看遠程庫信息 git remote -v
建立分支 git checkout -b dev
(加上-b參數至關於兩條命令:git branch dev && git checkout dev
)
合併分支 在dev上工做完成以後,切回master,執行合併,而後刪除dev: git checkout master && git merge dev && git branch -d dev
查看全部的分支 git branch
(分支前有*號的表示當前工做的分支)
查看分支合併圖 git log —graph
Fast Forward 默認的分支合併圖是丟掉分支信息的。禁用fast forward模式會新建一個commit來進行合併,這樣就會將分支信息保存下來 git merge —no-ff -m "merge with no-ff" dev
Bug分支 經過創建臨時分支來修復bug,可是若是當你在dev上進行的工做還沒完成而不能提交時,可使用git stash來把當前的工做現場臨時」藏匿」起來,這樣git status查看工做區將會是乾淨的,如今你能夠選擇在master或者dev上創建一個臨時的bug分支來進行修復bug的工作了。完成bug修復任務以後,git stash list查看以前藏匿的」工做現場」記錄$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
使用git stash apply stash@{0}
來恢復,使用git stash drop stash@{0}
來刪除或者使用git stash pop
將最近的工做現場恢復並刪除記錄。
通常狀況:當手頭工做沒有完成時,先把工做現場git stash
一下,而後去修復bug,修復後,再git stash pop
,回到以前的工做現場。
Feature分支 開發一個新功能,最好新建一個分支,若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>
強行刪除該分支。若是直接在dev分支上開發該特性,那就可能比較麻煩了。
推送分支到遠程庫 git push origin master
或推送其餘分支,如dev git push origin dev
; Bug分支只用於本地修復bug,就不必推送到遠程了,除非老闆要看看你每週到底修復了幾個bug; Feature分支是否推到遠程,取決於你是否和你的小夥伴合做在上面開發。
抓取分支 克隆遠程庫,默認狀況下,只能看到master分支;若是想在dev分支上進行開發,就必須建立遠程origin的dev分支到本地,命令是 git checkout -b dev origin/dev
這樣就創建了本地dev分支並與遠程dev分支的進行了連接
關聯分支 若是git pull 或 git push提示」no tracking information」,則說明將本地的分支和遠程的分支沒有連接,用命令git branch —track <local_branch> origin/<remote_branch>
進行連接。
多人協做的工做模式一般是:
首先,能夠試圖用 git push origin <branch>
推送本身的修改;
若是推送失敗,則由於遠程分支比你本地的新,須要先用git pull
試圖合併;
若是合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用 git push origin <branch>
推送
標籤是版本庫的快照,實質是指向某個commit的一個指針。git tag <tagname>
新建一個標籤,默認爲HEAD,也能夠指定一個commit_idgit tag -a <tagname> -m 「comments」
能夠指定標籤信息git tag -s <tagname> -m 「comments」
能夠用PGP簽名標籤git tag
查看全部標籤git show <tagname>
查看某個標籤git tag -d <tagname>
刪除標籤git push origin <tagname>
推送標籤到遠程git push origin —tags
推送全部標籤到遠程git push origin :refs/tags/<tagname>
刪除遠程庫的標籤(先將本地要刪除的標籤幹掉,該推送就會將遠程的標籤同步刪除)
讓git適當的顯示不一樣的顏色 git config —global color.ui true
忽略特殊文件 https://github.com/github/git... 而後再加上本身定義的文件,最終獲得一個完整的.gitignore文件
設置命令的別名git config —global alias.unstage ‘reset HEAD’ -> git unstage test.php
(將暫存區的修改撤銷)git config —global alias.last ‘log -l’ -> git last
(顯示最後一次提交信息)
有人喪心病狂git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
比較分支 合併分支以前能夠先進行比較 git diff <branch1> <branch2>
關聯本地倉庫和遠程倉庫 若是你不是clone的遠程倉庫,就須要進行關聯操做:git remote add origin <server>:<repository>
清理本地對應的遠程已經刪除的分支 git remote prune origin
比較當前文件和上一次提交之間的差別 git diff HEAD^ HEAD <file>
找出是誰最近改動過代碼 git blame <file>
,配合grep使用效果更佳
全部的版本控制系統,其實只能跟蹤文本文件的改動,不能跟蹤二進制文件內容的改動,不幸的是,Microsoft的Word格式是二進制格式,所以,版本控制系統是無法跟蹤Word文件的改動的
Git設計優秀主要是由於它跟蹤管理的是修改,而非文件,每一個文件只有一份,git會根據分支記錄的修改去控制工做區中的文件的內容。
master也是分支,但倒是主分支,HEAD指針指向的分支是當前工做的分支,良好的開發方式是新建一個分支(名字能夠是dev)進行開發,而後add、commit等,最後再切回master進行merge操做,master分支僅用來發布新版本。
本地建立的分支若是不推送到遠程,對其餘人就是不可見的。
修改文件未提交時切換分支,修改的內容會同步到切換到的分支上,直到提交以後。
.gitignore只能忽略那些原來沒有被track的文件,若是某些文件已經被歸入了版本管理中,則修改.gitignore是無效的。正確的作法應該是:git rm --cached logs/xx.log,而後更新 .gitignore 忽略掉目標文件,最後git commit -m "We really don't want Git to track this anymore!"