blog
git
第一次學習Git是徹底按照廖雪峯老師的教程學習的,學的過程當中基本上沒有遇到什麼問題,可是本身實際操做就問題不斷了.github
首先,仍是按照慣例,來膜拜一下廖雪峯老師精簡的教程知識吧,中間穿插一些本身的感悟.服務器
安裝
git:msysgit是Windows版的Git,從http://msysgit.github.io/下載,而後按默認選項安裝便可。app
安裝完成後,在開始菜單裏找到「Git」->「Git Bash」,蹦出一個相似命令行窗口的東西,就說明Git安裝成功!ssh
安裝完成後,還須要最後一步設置,在命令行輸入ide
$ git config --global user.name "Your Name"$ git config --global user.email "email@example.com"
建立repository學習
$ mkdir learngit$ cd learngit$ pwd
初始化項目$ git init
fetch
添加文件(此處可將整個文件添加 使用git add filename
後面也能夠空格以後再加其餘的文件...網站
$ git add readme.txt$ git commit -m "wrote a readme file"
add全部文件$ git add .
url
add並rm全部$ git add -A
提交modify和rm(新加的文件不會自動提交)$ git commit -a
注意:此處的
git commit -m "xxx"
裏的"xxx"
最好寫上,屬於給你提交的文件一個tag,利人利己,何樂不爲呢.初始化一個Git倉庫,使用git init命令。
添加文件到Git倉庫,分兩步:
第一步,使用命令git add ,注意,可反覆屢次使用,添加多個文件;
第二步,使用命令git commit,完成。
查看狀態與版本倒退
查看你剛纔操做的狀態$ git status
查看修改內容$ git diff readme.txt
查看log,後面參數可選(數字)$ git log (--prety=oneline)
回退上個版本(HEAD指向master的指針,^個數表示上幾個版本)$ git reset --hard HEAD^
回退n個版本$ git reset --hard HEAD~100
$ git reset --hard 3628164`
回退到commit爲3628164版本
查看每一次命令$ git reflog
把readme.txt文件在工做區的修改所有撤銷$ git checkout --readme.txt
這裏有兩種狀況:
一種是readme.txt自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態;
一種是readme.txt已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。
命令中的「--
」很重要,沒有「--
」,就變成了「建立一個新分支」的命令$ git checkout -- file
能夠把暫存區的修改撤銷掉(unstage),從新放回工做區$ git reset HEAD readme.txt
從版本庫中刪除文件$ git rm readme.txt
若是在文件管理器中誤刪了文件,由於版本庫裏還有呢,能夠用這句恢復$ git checkout -- readme.txt
遠程庫
關聯一個遠程庫,使用命令
$ git remote add origin https://github.com/yourgithubname/gitdemo.git
也能夠是這種(前提在ssh創建以後,帳戶密碼填寫以後)
$ git remote add origin git@github.com:yourgithubname/gitdemo.git
關聯後,使用命令,第一次推送master分支的全部內容
$ git push -u origin master
每次本地提交後,只要有必要,就可使用命令推送最新修改
$ git push origin master
克隆repository。建立一個空的repository,而後用命令
$ git clone https://github.com/cloneurl/clonetest
分支與衝突
查看分支:$ git branch
建立分支:$ git branch name
切換分支:$ git checkout name
建立+切換分支:$ git checkout -b name
合併某分支到當前分支:$ git merge name
-no-ff參數,表示禁用「Fast forward」 會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev
刪除分支:$ git branch -d name
強行刪除分支(當在分支上修改後,不想併入其餘分支,想刪掉,就要強行刪除)
$ git branch -D branch-name
解決分支合併產生的衝突:
手動修改衝突後提交就行
命令能夠看到分支合併圖$ git log --graph
當你接到一個修復一個代號101的bug的任務時,很天然地,你想建立一個分支issue -101來修復它,可是,等等,當前正在dev上進行的工做尚未提交
stash功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做:git stash(有修改還沒add並commit的時候調用後,現場保留,分支清空)
命令查看工做現場$ git stash list
恢復有兩個辦法:
一是用$ git stash apply
恢復,可是恢復後,stash內容並不刪除,你須要用$ git stash drop
來刪除;
另外一種方式是用$ git stash pop
,恢復的同時把stash內容也刪了
查看遠程庫的信息$ git remote
顯示更詳細的信息$ git remote -v
抓取與推送
$ git remote -vorigin https://github.com/githubname/gitdemo.git (fetch) origin https://github.com/githubname/gitdemo.git (push)
顯示了能夠抓取和推送的origin的地址。若是沒有推送權限,就看不到push的地址
推送分支
推送分支,就是把該分支上的全部本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上
$ git push origin master
若是要推送其餘分支,好比dev,就改爲
$ git push orgin dev
抓取分支
小夥伴要在dev分支上開發,就必須建立遠程origin的dev分支到本地,因而他用這個命令建立本地dev分支
$ git checkout -b dev origin/dev
如今,就能夠在dev上繼續修改,而後,時不時地把dev分支push到遠程
$ git push origin dev
碰巧你也對一樣的文件做了修改,並試圖推送:推送失敗,由於你的小夥伴的最新提交和你試圖推送的提交有衝突
先用git pull把最新的提交從origin/dev抓下來,而後,在本地合併,解決衝突,再推送
$ git pull
失敗了,緣由是沒有指定本地dev分支與遠程origin/dev分支的連接,根據提示,設置dev和origin/dev的連接
$ git branch --set-upstream dev origin/dev
再pull就好了,但合併會有衝突。須要手動解決
標籤管理
發佈一個版本時,咱們一般先在版本庫中打一個標籤,這樣,就惟一肯定了打標籤時刻的版本。未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。因此,標籤也是版本庫的一個快照。
Git的標籤雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?可是分支能夠移動,標籤不能移動),因此,建立和刪除標籤都是瞬間完成的。
建立標籤
切換到須要打標籤的分支上$ git checkout dev
一、敲命令$ git tag name
就能夠打一個新標籤$ git tag v1.0
二、查看全部標籤$ git tag
默認標籤是打在最新提交的commit上的。有時候,若是忘了打標籤,好比,如今已是週五了,但應該在週一打的標籤沒有打,怎麼辦?
方法是找到歷史提交的commit id,而後打上就能夠了
$ git log --pretty=oneline --abbrev-commit
對應的commit id是「ef51d63」,敲入命令$ git tag v0.9 ef51d63
三、能夠用$ git show tagname
查看標籤信息$ git show v0.9
四、能夠建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字:
$ git tag -a v0.1 -m "version 0.1 released" 02172e4
五、能夠經過-s用私鑰簽名一個標籤
$ git tag -s v0.2 -m "signed version 0.2 released" a8093be
簽名採用PGP簽名,所以,必須首先安裝gpg(GnuPG),若是沒有找到gpg,或者沒有gpg密鑰對,就會報錯
用命令$ git show tagname
能夠看到PGP簽名信息
用PGP簽名的標籤是不可僞造的,由於能夠驗證PGP簽名。驗證簽名的方法比較複雜
操做標籤
標籤打錯了,也能夠刪除$ git tag -d v1.0
推送某個標籤到遠程,使用命令$ git push origin tagname:
一次性推送所有還沒有推送到遠程的本地標籤$ git push origin --tags
從遠程刪除。刪除命令也是$ git push origin :refs/tags/tagname
配置別名
若是敲$ git st
就表示$ git status
那就簡單多了
一、只須要敲一行命令,告訴Git,之後st就表示status$ git config --global alias.st status
-二、-global參數是全局參數,也就是這些命令在這臺電腦的全部Git倉庫下都有用。
三、命令$ git reset HEAD file
能夠把暫存區的修改撤銷掉(unstage),從新放回工做區。既然是一個unstage操做,就能夠配置一個unstage別名
$ git config --global alias.unstage 'reset HEAD'
敲入命令$ git unstage test.py
實際上Git執行的是$ git reset HEAD test.py
四、配置一個$ git last
,讓其顯示最後一次提交信息$ git config --global alias.last 'log -l'
用$ git last
就能顯示最近一次的提交
報錯:
若是輸入
$ git push origin master
提示出錯信息:error:failed to push som refs to .......
解決辦法以下:
一、先輸入$ git pull origin master
//先把遠程服務器github上面的文件拉下來
二、再輸入$ git push origin master
三、若是出現報錯 fatal: Couldn't find remote ref master或者fatal: 'origin' does not appear to be a git repository以及fatal: Could not read from remote repository.
四、則須要從新輸入$ git remote add origin git@github.com:yourgithubname/gitdemo.git
若是輸入
$ git remote add origin git@github.com:yourgithubname/gitdemo.git
提示出錯信息:fatal: remote origin already exists.
解決辦法以下:
一、先輸入$ git remote rm origin
二、再輸入$ git remote add origin git@github.com:yourgithubname/gitdemo.git
三、再輸入-f
爲強制推送$ git push -f origin master
使用git在本地建立一個項目的過程
$ makdir ~/hello-world
//建立一個項目hello-world
$ cd ~/hello-world
//打開這個項目
$ git init
//初始化
$ git add README
//更新README文件
$ git commit -m 'first commit'
//提交更新,並註釋信息「first commit」
$ git remote add origin git@github.com:yourgithubname/gitdemo.git
//鏈接遠程github項目
$ git push -u origin master
//將本地項目更新到github項目上去
國外網友製做的Git Cheat Sheet,建議打印出來備用:
Git的官方網站:http://git-scm.com,英文自我感受不錯的童鞋,能夠常常去官網看看.
報錯部分歡迎更新提醒.