廖雪峰git學習筆記
建立版本庫
初始化一個Git倉庫,1.
cd 檔案夾
2. 使用
git init
指令。
添加檔案到Git倉庫
- 使用指令
,注意,可反複多次使用,添加多個檔案;git add <file>
- 使用指令
,完成git commit -m <message>
檢視工作區的狀态
- 要随時掌握工作區的狀态,使用
指令。git status
- 如果
告訴你有檔案被修改過,用git status
可以檢視修改内容。git diff
版本回退
-
指向的版本就是目前版本,是以,Git允許我們在版本的曆史之間穿梭,使用指令HEAD
。git reset --hard commit_id
- 穿梭前,用
可以檢視送出曆史,以便确定要回退到哪個版本。git log
git log --pretty=oneline
- 要重返未來,用
檢視指令曆史,以便确定要回到未來的哪個版本。git reflog
工作區和暫存區
工作區: 自己工作的地方,存放代碼的檔案夾
暫存區: 修改内容暫時存放的區域,相當于
git add
操作之後,将工作區的修改内容添加到暫存區
目前分支: git分支所在的地方,
git commit
指令就是将暫存區的内容提到到目前分支上
前面講了我們把檔案往Git版本庫裡添加的時候,是分兩步執行的:
第一步是用
git add
把檔案添加進去,實際上就是把檔案修改添加到暫存區;
第二步是用
git commit
送出更改,實際上就是把暫存區的所有内容送出到目前分支。
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個
分支,是以,現在,
master
就是往
git commit
master
分支上送出更改。
你可以簡單了解為,需要送出的檔案修改通通放到暫存區,然後,一次性送出暫存區的所有修改。
管理修改
每次修改之後,需要
git add
然後再
git commit
将修改之後的内容送出到分支上,如果修改之後,不進行
git add
操作,然後直接
git commit
則隻是将暫存區的修改送出到分支上,工作區的修改并沒有進行送出
撤銷修改
場景1:當你改亂了工作區某個檔案的内容,想直接丢棄工作區的修改時,用指令
git checkout -- file
。
場景2:當你不但改亂了工作區某個檔案的内容,還添加到了暫存區時,想丢棄修改,分兩步,第一步用指令
git reset HEAD <file>
,就回到了場景1,第二步按場景1操作。
場景3:已經送出了不合适的修改到版本庫時,想要撤銷本次送出,參考版本回退一節,不過前提是沒有推送到遠端庫。
删除檔案
指令
git rm
用于删除一個檔案。如果一個檔案已經被送出到版本庫,那麼你永遠不用擔心誤删,但是要小心,你隻能恢複檔案到最新版本,你會丢失最近一次送出後你修改的内容。
遠端倉庫
第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有
id_rsa
和
id_rsa.pub
這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
如果一切順利的話,可以在使用者主目錄裡找到
.ssh
目錄,裡面有
id_rsa
和
id_rsa.pub
兩個檔案,這兩個就是SSH Key的秘鑰對,
id_rsa
是私鑰,不能洩露出去,
id_rsa.pub
是公鑰,可以放心地告訴任何人。
第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面:
然後,點“Add SSH Key”,填上任意Title,在Key文本框裡粘貼
id_rsa.pub
檔案的内容:
git checkout -- file
就是讓這個檔案回到最近一次
git commit
(版本庫中檢出)或
git add
(暫存區)時的狀态
為什麼GitHub需要SSH Key呢?因為GitHub需要識别出你推送的送出确實是你推送的,而不是别人冒充的,而Git支援SSH協定,是以,GitHub隻要知道了你的公鑰,就可以确認隻有你自己才能推送。
當然,GitHub允許你添加多個Key。假定你有若幹電腦,你一會兒在公司送出,一會兒在家裡送出,隻要把每台電腦的Key都添加到GitHub,就可以在每台電腦上往GitHub推送了。
添加遠端庫
要關聯一個遠端庫,使用指令
git remote add origin [email protected]:path/repo-name.git
;
關聯後,使用指令
git push -u origin master
第一次推送master分支的所有内容;
此後,每次本地送出後,隻要有必要,就可以使用指令
git push origin master
推送最新修改
從遠端庫克隆
要克隆一個倉庫,首先必須知道倉庫的位址,然後使用
git clone
指令克隆。
Git支援多種協定,包括
https
,但通過
ssh
支援的原生
git
協定速度最快。
分支管理
建立與合并分支
檢視分支:
git branch
建立分支:
git branch <name>
切換分支:
git checkout <name>
建立+切換分支:
git checkout -b <name>
合并某分支到目前分支:
git merge <name>
在分支開發完成之後,切換到
master
分支,然後在
master
分支上進行合并,将
<name>
分支合并到
master
分支上
删除分支:
git branch -d <name>
解決沖突
當Git無法自動合并分支時,就必須首先解決沖突。解決沖突後,再送出,合并完成。
解決沖突就是把Git合并失敗的檔案手動編輯為我們希望的内容,再送出。
用
git log --graph
指令可以看到分支合并圖。
git log --graph --pretty=oneline --abbrev-commit
可以檢視簡短分支合并圖
分支管理政策
通常,合并分支時,如果可能,Git會用
Fast forward
模式,但這種模式下,删除分支後,會丢掉分支資訊
git merge --no-ff -m "merge with no-ff" dev
: 準備合并
dev
分支,請注意
--no-ff
參數,表示禁用
Fast forward
在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,
master
分支應該是非常穩定的,也就是僅用來釋出新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在
分支上,也就是說,
dev
分支是不穩定的,到某個時候,比如1.0版本釋出時,再把
dev
分支合并到
dev
上,在
master
master
分支釋出1.0版本;
你和你的小夥伴們每個人都在
分支上幹活,每個人都有自己的分支,時不時地往
dev
分支上合并就可以了。
dev
Bug分支
應用場景:目前任務還未完成,不能立即送出工作,但是目前有一個緊急的問題需要進行解決,可以先将目前工作區的内容進行儲存,然後建立分支,進行解決問題,問題解決之後,可以恢複現場,繼續之前的工作
git stash
: 把目前未完成的工作現場進行儲存起來,等到以後可以恢複現場繼續工作
git stash list
: 檢視所有現場
git stash apply [email protected]{0}
: 恢複指定的現場
git stash pop
:恢複的同時把stash内容也删了
git stash drop
:删除現場
Feature 分支
開發一個新feature,最好建立一個分支;
如果要丢棄一個沒有被合并過的分支,可以通過
git branch -D <name>
強行删除。
多人協作
- 檢視遠端庫資訊,使用
;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
Rebase
- rebase操作可以把本地未push的分叉送出曆史整理成直線;
- rebase的目的是使得我們在檢視曆史送出的變化時更容易,因為分叉的送出需要三方對比。
标簽管理
釋出一個版本時,我們通常先在版本庫中打一個标簽(tag),這樣,就唯一确定了打标簽時刻的版本。将來無論什麼時候,取某個标簽的版本,就是把那個打标簽的時刻的曆史版本取出來。是以,标簽也是版本庫的一個快照。
Git的标簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?但是分支可以移動,标簽不能移動),是以,建立和删除标簽都是瞬間完成的。tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。
建立标簽
- 指令
用于建立一個标簽,預設為git tag <tagname>
,也可以指定一個commit id;HEAD
- 指令
可以指定标簽資訊,在哪一次送出的id上進行打标簽;git tag -a <tagname> -m "blablabla..." commit id
- 指令
可以檢視所有标簽。git tag
- 指令
可以看到說明文字git show <tagname>
操作标簽
- 指令
可以推送一個本地标簽;git push origin <tagname>
- 指令
可以推送全部未推送過的本地标簽;git push origin --tags
- 指令
可以删除一個本地标簽;git tag -d <tagname>
- 指令
可以删除一個遠端标簽。git push origin :refs/tags/<tagname>
使用github
在GitHub上看到别人比較好的項目的時候,想要自己進行修改,需要先
Fork
到自己的賬号下,然後在自己賬号下面進行
clone
之後就可以進行修改
- 在GitHub上,可以任意Fork開源倉庫;
- 自己擁有Fork後的倉庫的讀寫權限;
- 可以推送pull request給官方倉庫來貢獻代碼
忽略特殊檔案
- 忽略某些檔案時,需要編寫
;.gitignore
-
檔案本身要放到版本庫裡,并且可以對.gitignore
做版本管理!.gitignore
配置别名
git config --global alias.st status
:将status使用别名st進行表示
很多人都用
co
表示
checkout
,
ci
表示
commit
,
br
表示
branch
:
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
暫存區的修改撤銷掉(unstage),重新放回工作區。
git config --global alias.last 'log -1'
配置一個
git last
,讓其顯示最後一次送出資訊:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git log
顯示的效果更加好看一些
配置Git的時候,加上
--global
是針對目前使用者起作用的,如果不加,那隻針對目前的倉庫起作用。
每個倉庫的Git配置檔案都放在
.git/config
檔案中。
别名就在
[alias]
後面,要删除别名,直接把對應的行删掉即可。
而目前使用者的Git配置檔案放在使用者主目錄下的一個隐藏檔案
.gitconfig
中