mkdir learngit cd learngit pwd
pwd命令用於顯示當前目錄,在個人電腦中,這個倉庫位於/users/michael/learngit
如果window系統,爲了不遇到各類莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文git
git init
經過這個命令把目錄變成git能夠管理的倉庫
若是你沒有看到.git目錄,那是由於這個目錄默認是隱藏的,用ls -ah命令就能夠看見。github
git add <file>
把文件添加到暫存區安全
git commit -m "message"
簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。app
執行後輸出:ssh
$ git commit -m "wrote a readme file" [master (root-commit) eaadf4e] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
git commit命令執行成功後會告訴你,1 file changed:1個文件被改動(咱們新添加的readme.txt文件);2 insertions:插入了兩行內容(readme.txt有兩行內容)學習
git status
git status命令可讓咱們時刻掌握暫存區當前的狀態,上面的命令輸出告訴咱們,readme.txt被修改過了,但尚未準備提交的修改。fetch
git diff
git diff顧名思義就是查看difference,知道了對readme.txt做了什麼修改後,再把它提交到倉庫就放心多了,提交修改和提交新文件是同樣的兩步ui
git log
git log命令顯示從最近到最遠的提交日誌,咱們能夠看到3次提交,最近的一次是append GPL,上一次是add distributed,最先的一次是wrote a readme filethis
若是嫌輸出信息太多,看得眼花繚亂的,能夠試試加上--pretty=oneline參數url
你看到的一大串相似1094adb...的是commit id(版本號)
git reset --hard HEAD^
回退到上一個版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^
最新的那個版本add disbributed已經看不到了!比如你從21世紀坐時光穿梭機來到了19世紀,想再回去已經回不去了,腫麼辦?
辦法其實仍是有的,只要上面的命令行窗口尚未被關掉,你就能夠順着往上找啊找啊,找到那個add disbributed的commit id是 2bfef3b...,因而就能夠指定回到將來的某個版本:
git reflog
查找每一次命令的記錄
git checkout -- file
前提,尚未git add到暫存區,撤銷修改就回到和版本庫如出一轍的狀態
git reset HEAD <file> git checkout -- file
已提交到暫存區,需經過以上命令撤銷修改
rm test.txt
在本地刪除文件
git status
查看狀態
git rm test.txt
把版本庫中的test.txt刪除
git checkout -- file
git checkout實際上是用版本庫裏的版本替換工做區的版本,不管工做區是修改仍是刪除,均可以「一鍵還原」
注意:歷來沒有被添加到版本庫就被刪除的文件,是沒法恢復的!
1.建立SSH Key
ssh-keygen -t rsa -C "youre-mail@qq.com"
若是一切順利的話,能夠在用戶主目錄裏找到.ssh目錄,裏面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,能夠放心地告訴任何人。
2.登陸github,打開「Account settings」,「SSH Keys」頁面,而後,點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容
爲何GitHub須要SSH Key呢?由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。
3.在Repository name填入learngit,其餘保持默認設置,點擊「Create repository」按鈕,就成功地建立了一個新的Git倉庫
咱們根據GitHub的提示,在本地的learngit倉庫下運行命令
git remote add origin git@github.com:michaelliao/learngit.git
請千萬注意,把上面的michaelliao替換成你本身的GitHub帳戶名,添加後,遠程庫的名字就是origin,這是Git默認的叫法,也能夠改爲別的,可是origin這個名字一看就知道是遠程庫
git push -u origin master
因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數
推送成功後,能夠馬上在GitHub頁面中看到遠程庫的內容已經和本地如出一轍:
從如今起,只要本地做了提交,就能夠經過命令
git push origin master
首先,登錄GitHub,建立一個新的倉庫,名字叫gitskills:
咱們勾選Initialize this repository with a README,這樣GitHub會自動爲咱們建立一個README.md文件。建立完畢後,能夠看到README.md文件:
如今,遠程庫已經準備好了,下一步是用命令git clone克隆一個本地庫:
git clone git@github.com:michaelliao/gitskills.git
注意把Git庫的地址換成你本身的,而後進入gitskills目錄看看,已經有README.md文件了:
$ cd gitskills $ ls README.md
分支就是科幻電影裏面的平行宇宙,當你正在電腦前努力學習Git的時候,另外一個你正在另外一個平行宇宙裏努力學習SVN。
若是兩個平行宇宙互不干擾,那對如今的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了Git又學會了SVN!
git checkout -b dev
建立dev分支,而後切換到dev分支
git checkout命令加上-b參數表示建立並切換,至關於如下兩條命令:
git branch dev git checkout dev Switched to branch 'dev'
查看當前分支
git branch
切換分支
git checkout master
刪除分支
git branch -d dev
當有衝突的時候,修改衝突,選擇要保留下來的語句,而後git add 和 git commit.
查看一下readme.txt中的內容
Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files. <<<<<<< HEAD Creating a new branch is quick & simple. ======= Creating a new branch is quick AND simple. >>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,咱們修改以下後保存:
Creating a new branch is quick and simple.
在普通模式下合併分支
git merge --no-ff -m "merge with no-ff" dev
由於本次合併要建立一個新的commit,因此加上-m參數,把commit也加進去
Git分支十分強大,在團隊開發中應該充分應用。
合併分支時,加上--no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併
Git還提供了一個stash功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做
git stash
git查看工做現場列表
git stash list
恢復stash且把stash內容刪除
git stash pop
至關於
git stash apply //恢復 git stash drop //刪除
強行刪除分支
git branch -D <branch name>
查看遠程庫信息:
git remote -v
如果有一個小夥伴要與你在相同分支下開發,這時,你開發完成後,他也開發完成,大家修改了同個地方,這時候就會衝突,你要先把它拉取下來:
git pull
這時候有可能出現拉取失敗並提示:
git pull也失敗了,緣由是沒有指定本地dev分支與遠程origin/dev分支的連接,根據提示,設置dev和origin/dev的連接:
git branch --set-upstream-to=origin/dev dev
再pull:
git pull
把分叉的提交歷史「整理」成一條直線,看上去更直觀
git rebase
發版本的時候,這個版本會有一個tag,這個tag對應的是某一個commit-id,可是有了commit-id爲何還要有tag,緣由是commit-id太長太冗餘,是一串長長的數字,如有某個tag例如v1.2,簡短好識別
新建標籤:
git tag <name>
查看全部標籤:
git tag
爲特定的commit打上標籤:
git tag v0.9 f52c633
查看標籤信息:
git show <tagname>
還能夠建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字
git tag -a v0.1 -m "version 0.1 released" 1094adb
若是標籤打錯了,還能夠刪除
git tag -d v0.1
由於建立的標籤都只存儲在本地,不會自動推送到遠程。因此,打錯的標籤能夠在本地安全刪除。
若是要推送某個標籤到遠程,使用命令
git push origin <tagname>
一次性推送所有還沒有推送到遠程的本地標籤:
git push origin --tag
若是標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除:
git tag -d v0.1 git push origin :refs/tags/v0.9
要創建兩個遠程庫,咱們能夠刪除已有的GitHub遠程庫:
git remote rm origin
關聯碼雲的遠程庫:
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
再關聯github的遠程庫
git remote add github git@github.com:michaelliao/learngit.git
如今,咱們用git remote -v查看遠程庫信息,能夠看到兩個遠程庫
git remote -v gitee git@gitee.com:liaoxuefeng/learngit.git (fetch) gitee git@gitee.com:liaoxuefeng/learngit.git (push) github git@github.com:michaelliao/learngit.git (fetch) github git@github.com:michaelliao/learngit.git (push)碼
若是要推送到GitHub,使用命令:
git push github master
若是要推送到碼雲,使用命令:
git push gitee master
若是敲git st就表示git status那就簡單多了,固然這種偷懶的辦法咱們是極力同意的。
咱們只須要敲一行命令,告訴Git,之後st就表示status:
git config --global alias.st status
固然還有別的命令能夠簡寫,不少人都用co表示checkout,ci表示commit,br表示branch:
git config --global alias.co checkout git config --global alias.ci commit git config --global alias.br branch
配置輸出log的優質顯示
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的時候,加上--global是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。
配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config文件中:
$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote "origin"] url = git@github.com:michaelliao/learngit.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [alias] last = log -1
別名就在[alias]後面,要刪除別名,直接把對應的行刪掉便可。
此文章參考:廖雪峯老師的git教程,歡迎你們前往查看