我的GIT筆記
我們一開始需要先自曝家門:
git config --global user.name
git config --global user.email
首先可以CD到我們想要用到的地方
Git init :使用當(dāng)前目錄作為倉庫
Git init *** : 在當(dāng)前目錄下創(chuàng)建*** ,并使其作為倉庫
在倉庫目錄下,創(chuàng)建文件,要把文件提交到倉庫,需要兩步:
- git add 文件名 (注意需要加上后綴)
可以重復(fù)執(zhí)行此操作,然后一次性提交多個文件
- git commit -m “ *** ” (***是我們對于本次提交的補(bǔ)充說明,很重要??!養(yǎng)成寫他的好習(xí)慣)
$ git commit -m "add a test file named readme.txt "
[master (root-commit) d005bba] add a test file named readme.txt
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
這就是提交成功了!~~
git clone
我們使用 git clone 從現(xiàn)有 Git 倉庫中拷貝項(xiàng)目(類似 svn checkout)。
克隆倉庫的命令格式為:
<pre style="line-height:15.0pt;background:#FBFBFB;word-break:break-all;border:none;
mso-border-alt:solid #DDDDDD .75pt;mso-border-left-alt:solid #DDDDDD 3.0pt;
padding:0cm;mso-padding-alt:8.0pt 11.0pt 8.0pt 11.0pt">git clone <repo></pre>
如果我們需要克隆到指定的目錄,可以使用以下命令格式:
<pre style="line-height:15.0pt;background:#FBFBFB;word-break:break-all;border:none;
mso-border-alt:solid #DDDDDD .75pt;mso-border-left-alt:solid #DDDDDD 3.0pt;
padding:0cm;mso-padding-alt:8.0pt 11.0pt 8.0pt 11.0pt">git clone <repo> <directory></pre>
比如,要克隆 Ruby 語言的 Git 代碼倉庫 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
執(zhí)行該命令后,會在當(dāng)前目錄下創(chuàng)建一個名為grit的目錄,其中包含一個 .git 的目錄,用于保存下載下來的所有版本記錄。
如果要自己定義要新建的項(xiàng)目目錄名稱,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
新項(xiàng)目中,添加所有文件很普遍,我們可以使用 git add . 命令來添加當(dāng)前項(xiàng)目的所有文件
查看改動:
Git status:
git status 以查看在你上次提交之后是否有修改。
我演示該命令的時候加了 -s 參數(shù),以獲得簡短的結(jié)果輸出
Git diff:
執(zhí)行 git diff 來查看執(zhí)行 git status 的結(jié)果的詳細(xì)信息。
git diff 命令顯示已寫入緩存與已修改但尚未寫入緩存的改動的區(qū)別
GIT****版本回退:
git log可以查看歷史版本號,比如:
[圖片上傳失敗...(image-9f5b56-1552978443422)]
而帶HEAD的就是當(dāng)前版本,上個版本是HEAD,上上個是HEAD^,
那么上一百個呢? HEAD~100
比如我們要回退到上個版本,直接:
git reset --hard HEAD^
[圖片上傳失敗...(image-bbe003-1552978443422)]
現(xiàn)在再 git log , 就回到了第一個版本,那么我們之前的那個“my test”版本呢?
如果你還沒有退出git窗口,這是沒問題的!
觀察:
[圖片上傳失敗...(image-9ea73f-1552978443422)]
這里有很長的一串16進(jìn)制號碼,那么只要我們回去翻到之前的這個號碼,然后:
git reset --hard 那個號碼
這樣就可以找回來了,而且,我們可以只輸入那個號碼的前幾位便可
如圖:
[圖片上傳失敗...(image-38f234-1552978443422)]
問題又來了:我要是已經(jīng)關(guān)閉了git 的窗口,并且對于版本的回退后悔了,咋辦?
依然有辦法:git reflog
[圖片上傳失敗...(image-2a4b48-1552978443422)]
這樣,就又可以找到我們之前的16進(jìn)制號碼的前幾位了。
Git 管理的是修改,而非文件:
例如,我們1.修改readme,2.git add readme.txt, 3.再次修改readme, 4 git commit –m “***”;
這時,我們的readme是不是被修改了兩次呢?是的,但是我們的git 只讀取到了一次修改,因?yàn)椋诙涡薷臎]有被add,誠然此時文件已經(jīng)改了,但是因?yàn)闆]有捕捉到這次修改,我們commit的只是第一次修改的內(nèi)容。
提交后,用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別
撤銷修改:
如果我們做了一些修改,但是又不想讓他們生效,怎么辦呢:
Case 1. 你修改了,但是還沒有add,那么有兩種修改方法:可以去找到那個文件,把他手動改回來;也可以使用命令 git checkout -- 文件名;
Case 2. 你不但修改了,還把他add到了暫存區(qū),那么你需要:
1) git reset HEAD 文件名
2) git checkout -- 文件名
Csae 3. 你把它c(diǎn)ommit了,等死吧!
刪除文件:
我們可以直接刪掉想要刪除的那個文件
不過此時版本庫中還沒有刪掉,此時將有兩個選擇:
1) 確實(shí)想把它刪掉,那就 git rm 文件名;git commit –m “***”.
2) 不想刪掉,這是誤操作
此時,可以利用git 來恢復(fù),因?yàn)榘姹編炖镞€有它。
git checkout – 文件名
就可以在本地恢復(fù)該文件,不過只能恢復(fù)文件到最新版本,之前的都會丟失掉!
創(chuàng)建好 github后,關(guān)聯(lián)ssh ,就可以體驗(yàn)遠(yuǎn)程倉庫的牛逼之處啦!
git remote add origin https://github.com/hchuanZ/....git
git push -u origin master
該命令把當(dāng)前本地庫上的所有內(nèi)容推送到github上
從現(xiàn)在起,只有本地做了提交,就可以通過
git push origin master
這個命令把本地庫上的內(nèi)容推送到遠(yuǎn)程庫里
看看我的github吧
[圖片上傳失敗...(image-86a2ff-1552978443422)]
這是先本地創(chuàng)建倉庫,在連接遠(yuǎn)程的方式,那么如果我們是遠(yuǎn)程現(xiàn)有倉庫,現(xiàn)在要弄到本地呢??
可以用git clone來完成:
<pre style="margin-top:11.25pt;margin-right:0cm;margin-bottom:11.25pt;margin-left:
0cm;line-height:13.5pt;background:#FAFAFA;word-break:break-all;border:none;
mso-border-alt:solid #DDDDDD .75pt;padding:0cm;mso-padding-alt:8.0pt 8.0pt 8.0pt 8.0pt">git clone git@github.com:hchuanZ /gitskills.git</pre>
<pre style="margin-top:11.25pt;margin-right:0cm;margin-bottom:11.25pt;margin-left:
0cm;line-height:13.5pt;background:#FAFAFA;word-break:break-all;border:none;
mso-border-alt:solid #DDDDDD .75pt;padding:0cm;mso-padding-alt:8.0pt 8.0pt 8.0pt 8.0pt">[圖片上傳失敗...(image-3a6ada-1552978443418)] </pre>
此時,我們將看到,g/git_code目錄下多了gitskills文件夾:
[圖片上傳失敗...(image-a428b-1552978443421)]
而里面則是README.md文件
GitHub給出的地址不止一個,還可以用https://github.com/hchuanZ/gitskills.git這樣的地址。實(shí)際上,Git支持多種協(xié)議,默認(rèn)的git://使用ssh,但也可以使用https等其他協(xié)議。
使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https。
分支管理:
每次提交,GIT都把他們串成一條時間線,這條時間線就是一個分支。
Git里,如果只有一條分支,那么這條分支就是主分支,叫做master分支。
HEAD嚴(yán)格來說,不是指向提交,而至指向master,而master才是指向提交的。所以HEAD指向的就是當(dāng)前分支。[圖片上傳失敗...(image-cdcfa0-1552978443421)] 每次提交,master分支都會向前移動一步,這樣,隨著你的不斷提交,master分支的線也會越來越長;
當(dāng)我們要創(chuàng)建新的分支:
例如要創(chuàng)建dev分支,就是創(chuàng)建一個dev指針,指向master同樣的提交,再把HEAD指向dev,就表示當(dāng)前分支在dev上。
[圖片上傳失敗...(image-8b7981-1552978443421)]
現(xiàn)在開始,對工作區(qū)的修改和提交就是針對dev分支了,比如新提交一次后,dev指針往前移動一步,而Master指針不變,如圖:[圖片上傳失敗...(image-adab7c-1552978443421)]
假如,我們在dev分支上的任務(wù)完成了,就可以把dev合并到master上。Git怎么合并呢? 最簡單的方法就是直接把master指向當(dāng)前的提交,就完成了合并:
[圖片上傳失敗...(image-6dce77-1552978443421)]
這個過程只是指針的變化,工作區(qū)沒有做什么更改,所以Git分支合并是很快的;
顧名思義,如果我們想刪除dev分支,只需要把dev指針給刪除掉就好了
實(shí)際代碼:
創(chuàng)建dev分支:git checkout –b dev
這相當(dāng)于以下兩行:git branch dev
git checkout dev
如:
[圖片上傳失敗...(image-ba1398-1552978443420)]
用git branch可以查看當(dāng)前分支:
如:
[圖片上傳失敗...(image-7f98db-1552978443420)]
如圖所示,當(dāng)前的分支前面,會加上一個*號,那么我們當(dāng)前的分支就是dev
我們可以試一試在當(dāng)前分支下進(jìn)行提交,比如,我已經(jīng)修改了readme.txt的內(nèi)容,
[圖片上傳失敗...(image-c6736a-1552978443420)]
完成提交后,此時我們切換回master分支,
git checkout master
[圖片上傳失敗...(image-dfb802-1552978443420)]
可是,如果直接切換回master的話,我們之前的修改是找不到的!
因?yàn)槟莻€提交是在dev上完成的,所以我們需要吧dev分支的工作成功整合到master上:
git merge dev 可以幫我們辦到,merge 表示把指定分支整合到當(dāng)前分支。
[圖片上傳失敗...(image-3fbad5-1552978443420)]
注意顯示的是Fast-forward,這個代表的是,本次合并是“快進(jìn)模式”,也就是直接把Master指向dev的提交,所以會很快,但并不是每次合并都可以快進(jìn)模式完成。
好了,現(xiàn)在我們也可放心的刪除掉dev分支了
git branch –d dev
[圖片上傳失敗...(image-99350b-1552978443420)]
如圖所示,刪除后,再用git branch 查看,就只剩master一個分支了。
因?yàn)閯?chuàng)建、合并、刪除分支非常快,所以鼓勵使用分支來完成某個任務(wù),合并后再刪掉分支,這和直接再master分支上工作是一樣的,但是過程會更安全。
小結(jié):
查看分支:git branch
創(chuàng)建并切換分支:git checkout –b 分支名
只創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
合并某分支到當(dāng)前分支:git merge <name>
刪除分支:git branch –d <name>
不過,如果是Fast Forward模式,我們再刪除分支后,會丟掉分支信息,也許這不是我們期望的。所以,我們再git merge 時可以強(qiáng)制禁用Fast Forward 模式,這樣git就會新生成一個commit。
禁用Fast Forward:
git merge --no-ff –m “添加commit,所以需要備注信息” <name>
實(shí)際開發(fā)中,master通常需要很穩(wěn)定的發(fā)布版本,所以不會再master上做開發(fā),每個員工都會有自己的一個分支,通常會把這些分支時不時的往dev合并。
所以實(shí)際開發(fā)時應(yīng)當(dāng)如圖:
[圖片上傳失敗...(image-690869-1552978443420)]
當(dāng)手頭工作沒有完成時,先把工作現(xiàn)場git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場。
用Git stash 可以保留現(xiàn)場,保留后,創(chuàng)建一個用于修復(fù)bug的分支,修復(fù)后,將該分支合并,最后git stash pop,還原現(xiàn)場。 Git stash list 可以查看stash里的狀態(tài)。
Feature****分支:每次添加新功能,最好新建一個feature分支,在這上面做開發(fā)。如果:已經(jīng)在feature上提交修改,但是還沒合并,此時我們想要刪除這個開發(fā)的內(nèi)容,怎么辦呢?
Git branch –d <name>
是嗎?其實(shí)這樣是不可以的,我們需要吧-d 替換成-D,就可以強(qiáng)制刪除了。
多人協(xié)作:
1.首先,可以用git push origin<branch-name>推送自己的修改
2.如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你本地更新,需要先用git pull試圖合并。
3.如果合并有沖突,則解決沖突,并在本地提交
4.再執(zhí)行第一步
如果 git pull提示no stracking information,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
更新碼云項(xiàng)目常用操作順序:
1 git status查看狀態(tài)
2 git add . 本地添加改動
3 git commit -m 'info' 本地提交
4 git branch 查看分支
5 git cheakout master 如果不是master則切換到master
6 git merge 提交的分支name 把操作分支同步到主分支
7 git push 推到碼云