一、安裝Git 1.安裝git,點擊Git Bash進入命令行視窗頁面 2.配置:$ git config --global user.name "Your Name"$ git config --global user.email "[email protected]"註意git config命令 ...
一、安裝Git
1.安裝git,點擊Git Bash進入命令行視窗頁面
2.配置:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
註意git config命令的--global參數,用了這個參數,表示你這台機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。
二、創建版本庫
1.創建一個空目錄(mkdir <文件夾名>),可以通過pwd查看當前目錄(註意:目錄名最好不要有中文)
2.通過git init 把目錄變成Git可以管理的倉庫,執行該命令之後可以通過ls -ah查看到該目錄下的隱藏文件.git
3.使用命令git add <文件名> 把該文件提交到stage(暫存區)
3.使用命令git commit <-m "XXX"> 把暫存區里的所有文件提交到Git版本庫
三、掌握兩命令
1.git status 查看工作區的狀態
2.git diff 查看文件修改有哪些
四、版本回退
1.通過命令git log可以查看所有已經commit的日誌,若信息太多可以在其後面加--pretty=oneline
2.在Git中HEAD表示當前版本
---上一個版本HEAD^
---上上一版本HEAD^^
---前100個版本HEAD~100
3.返回到上一個版本的命令git reset --hard HEAD^
4.回到未來的某版本git reset --hard 3628164 (後面的是一個commit_id)
五、工作區和暫存區
1.瞭解工作區和暫存區的模式
六、管理修改
1.命令git diff HEAD -- <文件名> 可以查看工作區和版本庫裡面最新版本的區別:
七、撤銷修改
1.git checkout -- <文件名>,有以下兩種情況:
一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
(前提是該readme.txt文件之前已經被add到stage過,當再在工作區裡面修改後,如果想清楚上次修改,則可用此命令)
一種是readme.txt已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。
2.命令git reset HEAD -- <文件名> 可以把暫存區的修改撤銷掉(unstage),重新放回工作區。
八、刪除文件
1.直接刪除工作區的文件,可以用rm <文件名>
2.需要刪除git版本庫中的文件,可用git rm <文件名> ,然後再執行git commit
3.註意:如果只是把工作區的文件刪錯了,而在git版本庫裡面還存在,可以直接用git checkout跟其文件名可找回;
九、遠程倉庫
1.由於需要和遠程倉庫是通過SSH來鏈接的,所以需要在本地使用$ ssh-keygen -t rsa -C "[email protected]"來生成一個簽名
如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,
不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
2.第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面
然後,點“Add SSH Key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內容
十、添加遠程庫
1.首先,登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫
2.在Repository name填入learngit,其他保持預設設置,點擊“Create repository”按鈕,就成功地創建了一個新的Git倉庫
3.通過$ git remote add origin git@server-name:path/repo-name.git將本地倉庫與github關聯
(如:$ git remote add origin [email protected]:michaelliao/learngit.git)
4.第一次推送時使用$ git push -u origin master把本地庫的所有內容推送至遠程
(註意:由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,
還會把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。)
十一、從遠程庫克隆
1.首先創建一個遠程庫,然後通過git clone [email protected]:michaelliao/gitskills.git 克隆該項目
2.Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快。
十二、創建與合併分支
1.在版本回退可以看見有一條預設的時間線,該線是一條主分支即master,而HEAD其實是指向master,master指向提交的,所以HEAD指向的就是當前分反
2.每次在master上提交,該分支就會向前移動一步
3.當我們創建一個新分支(dev)時,此時該分支是指向master相同的提交,當切換為dev分支時,HEAD就指向dev
4.當在dev上提交時,dev就往前移動一步,而master指針不變
5.創建分支的命令$ git branch dev; 切換分支$ git checkout dev,前兩命令可以通過$ git checkout -b dev 完成
6.查看分支$ git branch ,列出所有分支,當前分支前面會有一個*號
7.切換分支後修改內容並提交到該分支後,如果要把該提交合併到主分支,則需要先切換至主分支$ git checkout master
8.合併到master上$ git merge dev
9.刪除原來的分支$ git branch -d dev
十三、解決衝突
1.在dev分支上進行開發,開發完成後提交到該分支上,此時切換至master分支,在主分支上也修改一內容提交,然後把dev分支上的提交合併到master上
則提示有衝突,此時我們只需要手動解決衝突然後重新提交即可
十四、分支管理策略
1.通常,合併分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。
2.如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
3.要禁用此上模式,則需要在合併時加上--no-ff
4.使用$ git merge --no-ff -m "merge with no-ff" dev 合併後,會創建一個新的commit,這裡加上-m參數可以給出描述
5.通過以上方式合併後,我們再通過$ git log --graph --pretty=oneline --abbrev-commit可以查看到分支歷史
總結:合併分支時,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。
十五、Bug分支
1.如果目前在dev分支上做開發,現在有一bug需要急速解決併合併到master上,這時可以在master上新建一分支(名為bug-101),由於目前
dev上的內容還不能提交,所以需要通過git stash先儲藏,儲藏後通過git status可以查看到工作區是乾凈的
2.如果是在master上修複就在該分支上創建臨時bug-101分支,修複完成後可以合併到master上並刪除該bug分支
3.再回到dev上繼續開發,可以通過$ git stash list查看工作現場
4.這裡有兩人種方法可以恢復:
一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;
二是用git stash pop,恢復的同時把stash內容也刪了:
5.當用第二種方式恢復後,再且git stash list時就查不到儲藏的工作現場了
6.你可以多次stash,恢復的時候,先用git stash list查看,然後恢復指定的stash,用命令:$ git stash apply stash@{0}
十六、Feature分支
掌握兩點:
1.開發一個新feature,最好新建一個分支。
2.如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。(註意:這裡面用的是大D)
十七、多人協作
1.當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的預設名稱是origin。
2.查看遠程庫的信息用$ git remote,可以查到當前的倉庫名(或者可以用git remote -v查看詳細信息)
3.推送分支$ git push origin <分支名> 比如$ git push origin master或$ git push origin dev
註意如下:
(1)master分支是主分支,因此要時刻與遠程同步;
(2)dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
(3)bug分支只用於在本地修複bug,就沒必要推到遠程了,除非老闆要看看你每周到底修複了幾個bug;
(4)feature分支是否推到遠程,取決於你是否和你的小伙伴合作在上面開發。
4.當其它人通過git clone命令克隆項目後,預設能看到的是master分支(可通過git branch查看),如果要在dev分支上開發,
就必須創建遠程origin的dev分支到本地,於是他用這個命令創建本地dev分支:$ git checkout -b dev origin/dev,
當在dev上開必後push到遠程。當自己也在該分支上修改後要提交到遠程時,只需要$ git push origin dev就行了。
若在push時出現衝突就先pull下來解決衝突再推送,如果當發現pull失敗是因為沒有指定本地dev分支與遠程origin/dev分支的鏈接的話(通過
提示信息no tracking information表明沒鏈接上),可以通過git branch --set-upstream branch-name origin/branch-name來設置dev和origin/dev的鏈接。
最後鏈接成功後再pull若有衝突再解決再push就Ok
小結:
(1)查看遠程庫信息,使用git remote -v;
(2)本地新建的分支如果不推送到遠程,對其他人就是不可見的;
(3)從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
(4)在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
(5)建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
(6)從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。
十八、標簽管理
1.發佈一個版本時,我們通常先在版本庫中打一個標簽,這樣,就唯一確定了打標簽時刻的版本。將來無論什麼時候,取某個標簽的版本,
就是把那個打標簽的時刻的歷史版本取出來。所以,標簽也是版本庫的一個快照。
2.Git的標簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?但是分支可以移動,標簽不能移動),所以,
創建和刪除標簽都是瞬間完成的。
十九、創建標簽
1.決定要在哪個分支上打包,比如在master上打標簽,可以直接$ git tag v1.0 表示在master分支的最新的一次提交上打標簽為v1.0
2.命令git tag查看所有標簽
3.預設標簽是打在最新的commit上,如果想要打在之前某次的提交上,可以通過$ git tag v0.9 6224937 即可,後面的數字表示該次提交的密印,
當簽名完成後可以通過git tag查看到剛纔的標簽
註意:當通過git tag時列出所有的標簽不是按時間順序列出,而是按字母排序的
4.通過git show <tagname>查看標簽信息 如:$ git show v0.9
5.創建帶有說明的標簽,$ git tag -a v0.1 -m "version 0.1 released" 3628164 (用-a指定標簽名,-m指定說明文字)
二十、操作標簽
1.刪除標簽:$ git tag -d <tagname>
2.推送某個標簽到遠程:git push origin <tagname> 或推送全部尚未推送到遠程的本地標簽$ git push origin --tags
3.如果標簽已經推送到遠程若需要刪除,則需要分兩步,一是先刪除本地的該標簽,二是再刪除遠程的該標簽,即$ git tag -d v0.9和$ git push origin :refs/tags/<tagname>
Git的官方網站:http://git-scm.com