git下載地址git
https://git-scm.com/github
1.創建本地倉庫而且與遠端分支相關聯
A. git init:本地倉庫初始化。//本質上生成了一個.git文件
B. 在遠端倉庫創建好項目new-project,而且複製遠端倉庫的地址Git_Url
C. git remote add origin Git_Url//把遠端分支和本地分支相互關聯
D. git add .//把須要上傳的文件從工做空間傳到stage緩存區中
E. git commit -m "XXX"//給本次提交添加說明
F. git push -u origin master
注:第一次提交是遠端倉庫須要說明分支所以須要使用git push -u origin master,後面提交直接git push。緩存
2.clone遠端分支項目
A.git clone Git_Url //clone遠端完整項目
git branch 顯示本地當前分支。
git branch -a 顯示本地以及遠端分支。
新clone的倉庫是隻有本地的master分支以及遠端的全部分支,若是須要在本地開發遠端倉庫的某個分支須要把本地分支和遠端分支再作一次映射。
B.git checkout -b 本地分支名 origin/遠程分支名 //將遠程git倉庫裏的指定分支拉取到本地(本地不存在而且遠端已經有的分支)。
C.git push --set-upstream origin 分支名 //推送本地分支到遠程倉庫
注:若是當前需求爲把遠端的一個項目遷移到另一個項目中,此時咱們git clone後在該文件目錄中顯示一個.git文件,這個文件中包含該項目全部的tags,branches,commit message等關聯信息,這時再往新的遠端分支推送項目時候並不須要所謂的本地倉庫初始化等操做(git init),由於自己clone下來的項目就是一個倉庫。所以操做過程應該爲:(1)git clone //clone項目(2)git remote add origin Git_Url//把遠端分支和本地分支相互關聯 (3) git push -u origin master //提交代碼,並不須要git add、git commit 等操做,同時帶.git的項目自動導入所關聯的全部tags,branches,commit message等關聯信息。app
3.一次完整的提交過程
A.git add 文件名//把文件從本地工做空間提交到本地緩存stage,能夠提交屢次不會產生commit_id
B.git commit -m "XXX" //把當前stage緩存區中的全部內容一次性提交到本地分支,會生成新的commit_id。也就是所謂的屢次add一次commit。
C.git push //把本地分支上的全部commit推到於此分支對應的遠端分支 master->origin/master
若是在git pull/push/clone中會遇到須要輸入username、password的咱們爲了方便重複輸入會採用兩種方式進行身份校驗。
1、sshd本地工做空間公鑰
2、在git pull http://$username:password@XXXX.git
C.git status //查看本地工做區與本地分支的差別,簡言之就是查看工做區域的狀態,有哪些文件變動了。
當本地工做空間和本地緩存stage都沒有更新或者全部的跟新已經push到遠端分支顯示"nothing to commit working directory clean"
D.git diff //查看本地工做區與本地分支的差別,具體文件的變動。ssh
4.歷史版本信息
A.查看提交的版本信息 git log;每一個log顯示一行git log --pretty=oneline
B.git reset --hard commit_id //回退到某個版本
此時再使用git log查看顯示的最新一條commit_id則是回退後的最新版本
此時查看git status提示當前版本落後於origin/master遠端分幾個版本
此時使用git pull指令實質是本地和遠端的merge行爲。(1)若是沒有對該版本作修改,git pull直接fast-forward到遠端origin/master的最新版本。(2)若是對老版本執行的單純的增量,git pull是執行遠端和本地的合併,注:單純的遞增是不會引發衝突,結果爲遠端的最新版本再加上剛纔的增量部分。(3)若是對老版本執行增刪改操做(都有),git pull 會產生衝突解決衝突後,再git add 、git commit 、git push。
注:衝突以前的commit也會是一次commit記錄而且推到遠端分支。
C.因爲當前的最新git log顯示的舊版本的commit_id。所以若是想恢復到遠端分支origin/master的最新版本:(1)執行git pull 實現fast-forward。(2)使用git reflog查看頭指針HEAD的變化狀況,找到原來的回退前的commit_id。而後再執行git reset --hard commit_id回退到最新版本。學習
5.撤銷修改
A.git checkout -- 文件名 //把當前工做區的內容恢復到上一個狀態(上一個狀態:本地分支的最後一次commit狀態)。
B.git reset HEAD 文件名 //把當前stage緩存區的內容送回到本地工做區,不管緩存區有多少次add。
用例:在hi.sh文件中本地添加"add something",git add 添加到緩存區,本地添加"add anything";
(1)執行 git checkout -- hi.sh ,文件變成只有"add something"的變動 //git checkout 只是撤銷了本地工做區域的變動;執行 git reset HEAD 文件名 ,把緩存區的內容清空,可是文件內容爲"add something",當前文件狀態爲本地緩存區爲空,變動只存在於本地,所以再執行 git checkout -- 文件名,把本地的此次變動回退到本地分支的最後一次commit狀態。
(2)執行 git reset HEAD 文件名,把緩存區的內容清空,文件狀態爲"add something" & "add anything"兩次本地變動,再執行git checkout -- 文件名,把本地的兩次變動回退到本地分支的最後一次commit狀態。
總結:git checkout 是撤銷本地變動的,不管是多少次變動,或者是從緩存區回退回來的內容統一的退到本地分支的最後一次commit狀態(理解:已經從本地工做區域推到本地緩存的內容不會回退)。 git reset 把當前stage緩存區的內容送回到本地工做區,不管緩存區有多少次add。指針
6.刪除文件
A.刪除文件通常流程(理解爲一次提交和git add同樣) (1)rm 文件 //本地刪除(2)git rm 文件//把刪除提交到緩存區(過程同git add) (3)git commit -m "XXX" (4) git push
B.文件誤刪恢復。本地誤刪 rm 文件:git checkout -- 文件名。
直接緩存區誤刪 git rm 文件:(1)git reset HEAD 文件名 //恢復緩存區(2)git checkout -- 文件名 //恢復本地開發
7.分支管理
A.基本分支操做:(1)拉取本地不存在的遠端分支以及把本地的分支推到遠端倉庫的操做在第二小節中明確說明。(2)查看本地分支git branch;查看本地的遠端分支git branch -a(注:剛clone下來的項目中包含全部的遠端分支,並無直接映射到本地,須要本地建立分支且與本地遠端分支相互關聯[通常採用相同的名字,git自動作track])。(3)建立分支:方式一 git branch <branch_name> //建立分支; git checkout <branch_name>//切換到新建立的分支。 方式二 git checkout -b <branch_name> //建立分支並切換 (4)合併分支:git merge <branch_name>//把其餘分支合併到當前分支(注:合併以前須要把分支上的修改先進行提交[git add、git commit],若是當前代碼還不能提交採用git stash[後邊詳細介紹]保留當前變動後,再實現分支的合併) (5)合併後刪除無效分支(若是沒有合併就刪除,系統會提示。刪除本地分支git branch -d <branch_name>;刪除遠端分支 git push origin --delete <branch_name> (6)對於合併後的分支能夠直接刪除,也能夠再把主幹分支的代碼向該分支merge,執行git checkout release ,執行git merge master,須要注意的是不管原master分支作了什麼變動,當前的主幹分支和release分支都處於merge狀態,所以當把主幹分支merge到release分支上面時"必定不會"產生complict衝突。(7)強制刪除分支(不須要合併等操做):git branch -D <branch_name>
B.分支衝突:
用例:在子分支上面有新的commit,在主幹分支上面也有新的commit,而後執行git merge release會發生衝突,衝突的信息寫在發生衝突的文件夾中,手動處理衝突後,再次git add、git commit、git push
C.保存工做現場並恢復:
用例:當前分支的變動尚未commit,此時須要checkout到其餘分支進行開發工做,須要保存當前的工做現場,並須要在後邊作恢復。
方式一:保存當前工做現場git stash;查看緩存列表git stash list;恢復某一次工做現場 git stash apply stash@{0};刪除這個現場記錄 git stash drop
方式二:保存當前工做現場git stash;恢復某一次工做現場而且刪除記錄 git stash pop。
注:雖然能夠保存屢次工做現場,但在實際工做這種狀況不多見。
D.分支結構以及提交記錄(主要是看合併的結構):
git log --graph --pretty=oneline --abbrev-commitrem
爲增強對於分支的理解上圖:get
a.只有一個主幹master分支
git-br-initial
b.在master分支上切dev分支
git-br-create
c.在dev分支上有一次commit
git-br-dev-fd
d.git checkout master //切換到master分支
git-br-on-master
e.把dev合併到master分支
git-br-ff-merge
f.在master和feature分支上各自有一次新的commit
git-br-feature1
g.在master和feature分支上各自有一次新的commit,並別合併
git-br-conflict-merged
注:若是對於分支進行深度學習請參考Yuqi Chou推薦的https://github.com/pcottle/le...
8.標籤管理(首先checkout到須要打標籤的分支)git tag <tag_name> //默認給最新的一次commit上面打標籤,後面能夠跟任意一個commit_id。git tag -a <tagname> -m "XXX"//加message的打標籤方式,默認給最新的一次commit上面打標籤,後面能夠跟任意一個commit_id。git tag //查看本地全部標籤git show <tag_name>//查看標籤信息git push origin <tagname>//推送一個標籤到遠端倉庫git push origin --tags//推送所有本地標籤到遠端倉庫git tag -d <tagname>//刪除一個本地標籤git push origin :refs/tags/<tagname>//刪除一個遠端倉庫標籤