參考博客:
1. 初始化一個Git倉庫,使用git init命令。
2. 添加文件到Git倉庫,分兩步:
第一步,使用命令git add <file>,注意,可反覆多次使用,添加多個文件;
第二步,使用命令git commit,完成。
3. 使用git status命令, 掌握工作區的狀態。
4. 如果git status告訴你有文件被修改過,用git diff可以查看修改內容。
5. git log命令查看歷史記錄。
git log --pretty=oneline
6. 版本回退
git reset --hard HEAD^ // HEAD指向的版本就是當前版本。
git reset --hard commit_id
commit_id是版本號,用git log查看。即Git允許我們在版本的歷史之間穿梭前,
用git log可以查看提交歷史,以便確定要回退到哪個版本。要重返未來,用git log
查看命令歷史,以便確定要回到未來的哪個版本。
7. 工作區和暫存區
工作區:使用git init命令初始化的目錄。
版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
git add命令把要提交的所有修改放到暫存區(Stage)
git commit可一次性把暫存區的所有修改提交到分支(master)
管理修改:每次修改,如果不add到暫存區,那就不會加入到commit中。
撤銷修改:
1.當改亂工作區某個文件的內容後想直接丟棄工作區的修改時,用命令git checkout -- file
2.當不但改亂工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,
第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
3.已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,
不過前提是沒有推送到遠程庫。
刪除文件:rm test.txt // 刪除工作區的文件
<1> git rm test.txt // 從版本庫中刪除該文件
git commit -m "remove test.txt" // 提交到版本庫
<2> git checkout -- test.txt // 用版本庫的版本替換工作區的版本
8. 遠程倉庫GitHub
(1)創建SSH Key。ssh-keygen -t rsa -C "[email protected]",在用戶主目錄下,會
生成.ssh目錄,這個目錄下生成id_rsa和id_rsa.pub這兩個文件。
(2)在GitHub上Add SSH Key。
(3)在GitHub上 Create a new repository。
(4)把本地倉庫的內容推送到GitHub倉庫,在本地的learngit倉庫下運行命令:
git remote add origin [email protected]:scarliyang/learngit.git
錯誤:提示出錯信息:fatal: remote origin already exists.
解決辦法如下:
1、先輸入$ git remote rm origin
2、再輸入$ git remote add origin [email protected]:oscarliyang/gitdemo.git
(5)把本地庫的所有內容推送到遠程庫上
git push -u origin master // 第一次推送master分支的所有內容時加上了-u參數
git push origin master // 之後提交只需要這樣
(6)從遠程庫克隆
<1>先創建遠程庫:創建一個新的倉庫,勾選Initialize this repository with a README,
這樣GitHub會自動爲我們創建一個README.md文件
<2>再從遠程庫克隆:git clone [email protected]:oscarliyang/gitdemo.git
注:Git支持多種協議,默認的git://使用ssh,但也可以使用https等其他協議。
9. 分支管理
在Git裏,主分支即master分支。HEAD嚴格來說不是指向提交,而是指向master,master纔是
指向提交的,所以,HEAD指向的就是當前分支。
(1)創建與合併分支
<1>首先,我們創建dev分支,然後切換到dev分支:
git checkout -b dev // git checkout命令加上-b參數表示創建並切換,
相當於以下兩條命令: git branch dev 和 git checkout dev
<2>然後,用git branch命令查看當前分支:
git branch// git branch命令會列出所有分支,當前分支前面會標一個*號。
<3>提交:git add readme.txt
git commit -m "branch test"
<4>切換回master分支:git checkout master
<5>把dev分支的工作成果合併到master分支上:
git merge dev//用於合併指定分支到當前分支
<6>刪除dev分支:git branch -d dev
(2)解決衝突
即分支和master都修改了同一個文件,導致衝突。則在提交到master分支時,先需要修改
衝突內容,再add/commit。看到分支的合併情況:
git log --graph --pretty=oneline --abbrev-commit
最後刪除分支。
(3)分支管理策略
--no-ff參數,表示禁用Fast forward:git merge --no-ff -m "merge with no-ff" dev
在實際開發中,我們應該按照幾個基本原則進行分支管理:首先,master分支應該是非常
穩定的,也就是僅用來發布新版本,平時不能在上面幹活;那在哪幹活呢?幹活都在dev分
支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev分支合
併到master上,在master分支發佈1.0版本;你和你的小夥伴們每個人都在dev分支上幹活,
每個人都有自己的分支,時不時地往dev分支上合併就可以了。
注:合併分支時,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經
做過合併,而fast forward合併就看不出來曾經做過合併。
(4)Bug分支
修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash儲藏一下,然後去修復bug,修復後,
再git stash pop,回到工作現場。
(5)Feature分支
開發一個新feature,最好新建一個分支;如果要丟棄一個沒有被合併過的分支,可以通過
git branch -D <分支名>強行刪除。
(6)多人協作
當從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,
並且,遠程倉庫的默認名稱是origin。
查看遠程庫的信息,用git remote
查看遠程庫詳細信息,用git remote -v
多人協作的工作模式通常是這樣:
首先,可以試圖用git push origin branch-name推送自己的修改;
如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull試圖合併;
如果合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!
注:如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有
創建,用命令 git branch --set-upstream branch-name origin/branch-name
抓取分支:在本地創建和遠程分支對應的分支(本地和遠程分支的名稱最好一致),使用
git checkout -b branch-name origin/branch-name
10.標籤管理
發佈一個版本時,我們通常先在版本庫中打一個標籤,這樣,就唯一確定了打標籤時刻的版本。
將來無論什麼時候,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。所以,
標籤也是版本庫的一個快照。Git的標籤雖然是版本庫的快照,但其實它就是指向某個commit的
指針(跟分支很像對不對?但是分支可以移動,標籤不能移動),所以,創建和刪除標籤都是
瞬間完成的。
(1)創建標籤
首先,切換到需要打標籤的分支上。
然後,敲命令git tag <name>就可以打一個新標籤。
命令git tag查看所有標籤。
默認標籤是打在最新提交的commit上的,git tag v0.9 commitid 對指定commitid打標籤
標籤不是按時間順序列出,而是按字母排序的。可以用git show <tagname>查看標籤信息
創建帶有說明的標籤,用-a指定標籤名,-m指定說明文字:
git tag -a v0.1 -m "version 0.1 released" 3628164
還可以通過-s用私鑰簽名一個標籤:
git tag -s v0.2 -m "signed version 0.2 released" fec145a
(2)操作標籤
刪除標籤:git tag -d v0.1 //創建的標籤都只存儲在本地,不會自動推送到遠程
推送某個標籤到遠程:git push origin <tagname>
一次性推送全部尚未推送到遠程的本地標籤:git push origin --tags
刪除推送到遠程的標籤:
git tag -d v0.9 //先從本地刪除
git push origin :refs/tags/v0.9 //然後從遠程刪除
11.使用GitHub
參與一個開源項目:點“Fork”就在自己的賬號下克隆了一個bootstrap倉庫,然後,從自己的賬號
下 clone:git clone [email protected]:michaelliao/bootstrap.git。一定要從自己的賬號下clone倉庫,
這樣你才能推送修改。如果從開源庫的作者的倉庫地址[email protected]:twbs/bootstrap.git克隆,
因爲沒有權限,你將不能推送修改。可以在GitHub上發起一個pull request,向開源項目的官方庫
提交你的修改。即:
在GitHub上,可以任意Fork開源倉庫;
自己擁有Fork後的倉庫的讀寫權限;
可以推送pull request給官方倉庫來貢獻代碼。