git是分佈式版本控制系統git
集中式與分佈式:集中式有一箇中央服務器,須要聯網進行操做。分佈式,每一個人都有一個版本庫github
下載git->安裝完成後找到git bash,打開是一個命令行(說明安裝成功)bash
在命令行輸入如下服務器
引號內部填本身信息 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
版本庫又名倉庫,英文名repository
app
git有三個區,工做區,暫存區,版本庫。工做區add以後就進入了暫存區,暫存區的文件commit以後進入版本庫ssh
注:如下文件名都帶後綴分佈式
git add "文件名"
注意:提交是將暫存區的文件都提交到版本庫裏fetch
git commit -m "操做名稱"
git status
cat "文件名"
git log
如:commit後接的就是版本號,隨機生成的命令行
commit 980993de744a8886692ed79fc7f4cdd00ec15959 (HEAD -> master) Author: zouyou <> Date: Sat Apr 11 14:35:04 2020 +0800 update commit commit ea799348f2b1ccc7d046f8bd61c6b193b79bdc18 Author: zouyou <> Date: Sat Apr 11 14:33:07 2020 +0800 git tracks changes
- 回退版本:3d
git reset --hard HEAD^ HEAD^:上個版本 HEAD^^:上上版本
git reset --hard ea799348f
若是忘記了版本號,可使用reflog查看歷史的變化,無論有沒有回退
git reflog
git diff
git restore 文件名
git resore --staged 文件名
git rm 文件名
git checkout 文件名
$ git remote add origin (ssh碼)/(hhtps)
$ git push -u origin master
注:因爲遠程庫是空的,咱們第一次推送master
分支時,加上了-u
參數,Git不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。
上傳完成以後,只要本地進行了commit,就能夠經過如下命令
git push origin master //這裏與上面是差很少同樣的語法
總結:要關聯一個遠程庫,首先在遠程建立好一個庫,記住SSH碼,再進行鏈接 git remote add origin ssh碼
上傳:第一次上傳時git push origin -u master
,以後就不用加-u
了 git push origin master
這些命令裏面,origin其實就是遠程倉庫的名字,一般命名爲origin
首先在github上找到一個倉庫再複製其ssh碼,在git bash上輸入命令行
git clone ssh碼
注意:在哪一個文件夾打開的git bash就克隆到哪一個文件夾下面。
分支能夠實現相似於開發版系統,完成以後再推送到主幹,就是穩定系統。以下,兩個分支合併到主幹
在git中,master
分支是主幹,一開始master
指向這根主線,head
指向master
,因此head
是充當一個指向當前點的指針,能夠指向主幹,也能夠指向分支。
查看分支,顯示全部分支,當前分支前會有*
git branch
建立一個分支dev
並切換到此分支 -b
的做用是建立並切換
git checkout -b dev 等價於 git branch dev //建立分支dev git checout dev // 切換到分支dev
注意:每個分支的工做區,暫存區,版本庫都是獨立的,切換分支以後,都會不同。
Git鼓勵大量使用分支:
查看分支:git branch
建立分支:git branch
切換分支:git checkout
或者git switch
建立+切換分支:git checkout -b
或者git switch -c
合併某分支到當前分支:git merge
刪除分支:git branch -d
查看分支圖:git log --graph
-- 文件衝突
出現這種狀況,兩個分支沒法merge,必須手動解決。
$ git merge feature1 Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
git status
也能夠顯示衝突文件,在衝突文件裏打開能夠看到標記。
Git用<<<<<<<
,=======
,>>>>>>>
標記出不一樣分支的內容
當正在分支dev上進行一個工做時,忽然要修復一個bug(如在主幹上),因此須要先將dev正在進行的工做隱藏一下,先去把bug修復。Git還提供了一個stash
功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做:
git stash //能夠將在暫存區的文件(還未提交)隱藏,使用status也看不到
能夠查詢stash裏隱藏的東西
git stash //=>例如:stash@{0}: WIP on dev: f52c633 add merge
修復完master的bug以後,恢復dev的現場:
git stash aplly //對現場進行恢復,此時stash裏還有,須要進一步 git stash drop //對stash裏的東西刪除 同時還能夠從stash裏一步步恢復:git stash apply stash@{0} 等價於一句話 git stash pop
注:因爲dev原本就是master的分支,那麼dev也可能存在主幹剛剛修復的bug,因此git有個功能能夠實現bug的修復複製。由此能夠推出,能夠在分支解決bug在主幹複製便可
git cherry-pick <版本號> 這裏的版本好就是剛剛在主幹修復bug後commit以後的版本號
開發一個新feature,最好新建一個分支,相似於bug分支;
若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D
強行刪除。
要查看遠程庫的信息,用
git remote //一般遠程庫是origin
也能夠用git remote -v
,能夠返回抓取和推送的地址,以下
origin https://github.com/zy116/first-blog.git (fetch) origin https://github.com/zy116/first-blog.git (push)
-- 推送分支
git push origin dev //推送分支 git push origin master //推送主幹
可是,並非必定要把本地分支往遠程推送,那麼,哪些分支須要推送,哪些不須要呢?
master
分支是主分支,所以要時刻與遠程同步;dev
分支是開發分支,團隊全部成員都須要在上面工做,因此也須要與遠程同步;總之,就是在Git中,分支徹底能夠在本地本身藏着玩,是否推送,視你的心情而定!
-- 抓取分支
一般都會在master
和dev
分支分別推送各自的更改,當一我的把本身的分支都推送上去以後,另外一我的克隆下來的只能看到master分支,若是要在dev
分支上開發,必須創建一個遠程分支到本地
git switch -c dev origin/dev
當另外一我的推送上了一個東西后,你也要推送,此時就會發生矛盾。另外一我的的最新提交和你試圖推送的提交有衝突。
此時會提示你進行git pull
操做,可是會提示錯誤。
須要指定本地dev
分支與遠程origin/dev
分支的連接,設置dev
和origin/dev
的連接
git branch --set-upstream-to=origin dev
再進行pull
git pull
這時候pull成功,會在衝突文件裏標註,須要手動解決
所以,多人協做的工做模式一般是這樣:
git push origin <branch>
推送本身的修改;git pull
試圖合併;git push origin
推送就能成功!若是git pull
提示no tracking information
,則說明本地分支和遠程分支的連接關係沒有建立,用命令git branch --set-upstream-to origin/
。
小結:
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
,若是有衝突,要先處理衝突。