題外話
以前不了解git的時候,總感覺git是非常高大上的東西,很長一段時間都沒有接觸上。但后來用了一段時間后,發現git這個東西真是厲害啊,在厲害的同時它還這么地"接地氣",既能讓線上線下同步倉庫,多條分支工作,也能隨時fork別人的優秀的項目來參考學習,真是受用無比。我這人忘性比較高,為方便記憶,特意記錄下git 的基本使用。(ps:以下部分截圖來自廖雪峰老師的git教程)
正文筆記(以下內容針對windows平臺)
首先安裝git可以去git官網下載git for windows.
安裝好git后在任意一個目錄下右鍵選擇 git bash here
配置git的身份
就是如果你想克隆服務器上的倉庫,你得告訴別人你的身份
git config --global user.name <your_name>
git config --global user.email <your_email>
創建版本庫
//learngit就是倉庫所在地方,你可以設為任意名字
mkdir learngit
cd learngit
空倉庫初始化
git init
[站外圖片上傳中...(image-ae70c0-1515859609638)]
這句命令會初始化空倉庫learngit,cd 進入 learngit,會發現多了個.git目錄,這個目錄是git用來跟蹤版本庫的,一般不要去碰它。
一般倉庫下都會有個README.md文件用來對倉庫進行必要的說明。
注意:在編輯README.md時不要用windows 自帶的記事本保存utf-8編碼的文件時會自動在文件頭部添加Oxefbbbf(十六進制)的字符。替代記事本:NotePad++,EditPlus,sublime Text3 等。
添加文件到git倉庫
//告訴git這是個要放到倉庫的文件,放在暫存區
git add README.md
/**
*提交到git倉庫,-m 后面是指該次提交的說明信息
*提交成功后會返回提示:多少個文件被提交,插入了多少行內容
*/
git commit -m "update README.md"
版本回退
git log 命令會顯示從最近到最久的提交日志,如果嫌輸出信息太多,可以在后面加上 --pretty=online參數
[站外圖片上傳中...(image-75ce58-1515859609638)]
git reset –-hard HEAD^ //HEAD表示當前版本,表示回退到上一個版本,^回退到上兩個版本,以此類推,太多數的話可以寫HEAD~100
也可以根據commit id號回退到特定的版本,沒必要寫全,寫幾個前面的數字就可以,git會自動尋找。
git reset --hard 3628164
現在總結一下:
- HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hardcommit_id。
- 穿梭前,用 git log 可以查看提交歷史信息,以便確定要回退到那個版本。
- 要重返未來,用 git reflog 查看命令歷史,以便確定要回到未來的那個版本。
工作區與暫存區
工作區就是在電腦中能看到的目錄,比如learngit文件夾就是一個工作區。工作區里有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的即是稱為 stage(或者叫index)的暫存區,還有git為我們自動創建的第一個分支master,以及指向maser的一個指針叫HEAD
你可以簡單理解為,需要提交的文件修改通通放到暫存區,然后,此一次性提交到暫存區的所有修改。
比如,你對README.txt(或者README.md)進行修改一下,暫存區就會變成這樣:
一旦提交后,如果你沒有對工作區做任何修改,那么工作區就是“”干凈的“”!nothing to commit.
小結:
- 暫存區是Git非常重要的概念,弄明白了暫存區,就弄明白了Git的很多操作到底干了什么。
管理修改
為什么Git比其他版本控制系統設計得優秀,因為Git跟蹤并管理的是修改,而非文件。每次修改,如果不 add 到暫存區,那就不會加到 commit 中。命令:
git add <something>
git commit -m "description"
撤銷修改
git checkout --README.txt //可以撤銷最近一次的修改
有兩種情況:
README.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態。
README.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就會回到添加到暫存區后的狀態。
刪除文件
eg:
git rm test.txt
git commit -m "delete test.txt"
如果是刪除了的話,可以用 git checkout -- test.txt 來恢復文件。
遠程倉庫
Github 專門提供 git 倉庫的托管服務 。
由于本地 git 倉庫和 github 倉庫之間的傳輸是通過 SSH 設置的,因此,需要設置一下 。
1.創建 SSH KEY
ssh-keygen -t rsa -C youremail@example.com
為什么 github 需要 SSH KEY 呢? 因為 github 需要識別出你推送的提交時你推送的,而不是別人冒充的,而 git 支持 SSH 協議,所以, github 只要知道了你的公鑰,就可以確認只有你自己才能推送。
2.添加SSH KEY 到 github 或 coding net
github
coding net
添加遠程倉庫
1.將本地的內容推送關聯到 github 倉庫
git remote add origin git@github.com:your_usename/repos_name.git
注意賬戶名不要寫錯,添加后,遠程庫的名字就是origin,這是 git 的默認叫法,也可以改成別的。
2.將本地庫的所有內容推送到遠程庫上。
把本地庫的內容推送到遠程,用 git push 命令,實際上是把本地的 master 推送到遠程倉庫。
git push -u origin master
如果遠程倉庫是空的,第一次推送 master 分支時,加上了 -u 參數, git 不但會把本地的 master 分支內容推送的遠程到遠程新的 master 分支,還會把本地的 master 分支 和遠程的 master 分支關聯起來,在以后的推送或者拉取時間時就可以簡化命令。
若要刪除遠程倉庫的關聯,可以用命令: git remote rm hello-world.git
從遠程倉庫克隆
git clone git@github.com:your_username/repos_name.git
小結:
- 要克隆一個倉庫,首先必須知道倉庫的地址,然后使用 git clone 命令克隆。
- git 支持多種協議,包括 https ,但通過 ssh 支持的原生 git 協議才最快
分支管理
分支可以創建屬于個人的工作空間,開發完畢后再一次性合并到原來的分支上,這樣安全又不影響別人工作。
創建與合并分支
在 git 中, master 分支也叫主分支,HEAD 嚴格來說不是指向提交,而是指向 master
首先,創建 dev 分支,然后切換到 dev 分支
git checkout -b dev ,這個命令相當于:
git branch dev
git checkout dev
可以用 git branch 來查看分支,當前分支前面會出現一個"*"號;
git checkout dev 切換分支,回到 master 分支
合并分支: git merge dev ,把 dev 分支修改的內容合并到 master 分支上。
合并完成后,便可以放心刪除 dev 分支。
解決沖突
假設這種情況:新建一個分支 future,修改 readme.txt 內容后提交;切換回 master 分支又修改 readme.txt 內容后提交;
[站外圖片上傳中...(image-d52db4-1515859609639)]
這種情況下,git 無法執行 "快速合并",只能試圖把各自修改合并起來 ,但這種合并可能會有沖突。
果然沖突了,git 告訴我們, readme.txt 文件存在沖突,必須手動解決再提交, git status 可查看沖突的文件。
只能手動修改,git用 <<<<<<<,=======,>>>>>>標記處不同分支的內容。修改保存再提交。
可見沖突解決了。
小結:
- 當 git 無法自動合并分支時,就必須首先解決沖突,解決沖突后,再提交,合并完成。用 git log
--graph命令可以看到分支合并圖。
分支管理策略
一般合并分支時,git 會用 fast forward模式,這種模式下,刪除分之后會丟掉分支的信息,如果要強制禁用 Fast Forward 模式,git 就會在 merge 時生成一個新的 commit,這樣,從分支歷史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
因為這個合并要創建一個新的 commit ,所以加上 -m 參數,把 commit 描述寫進去。合并用 git log 查看操作信息。
git log --graph --pretty=online --abbrev-commit
[站外圖片上傳中...(image-d52d31-1515859609639)]
Bug分支
軟件開發過程中遇到 bug 時可以新建一個分支來修復,修復完成后,合并分支,然后將臨時分支刪除。
那現場的工作怎么辦?git 提供了一個 stash 功能,可以把當前工作現場儲藏起來,等以后恢復現場后繼續工作。
git stash
修復 bug 后,返回之前的分支
git stash list
查看之前的工作現場。
恢復現場:
git stash apply
git stash drop
//或
git stash pop
推送分支
推送分支,就是把該分支上的所有本地提交都推送到遠程庫。推送時,要指定本地分支,這樣,git 就會把該分支推送到遠程倉庫對應的分支上。
git push origin master
//或
git push origin dev
bug 分支只用于在本地修復 bug ,就沒必要推到遠程倉庫了。
END