如果多人做一個(gè)項(xiàng)目奔穿,那就要用到版本控制豹休。
SVN是集中式控制炊昆,GIt是分布式控制 這里說Git
SVN是都在服務(wù)器管理(斷網(wǎng)傳不了),Git是服務(wù)器有一份倉庫威根,本地有一份倉庫(斷網(wǎng)還能存本地的)
第一凤巨,防止項(xiàng)目崩掉,可以退回之前版本
第二洛搀,每次上傳都有個(gè)信息敢茁,你改了什么代碼
第三,保存是改變差異留美,而不是重新再來一份彰檬,不會占硬盤
第四,還有改了同一腳本代碼谎砾,會進(jìn)行自動合并逢倍,改到同一代碼就需要手動合并,選擇去用哪一個(gè)版本景图。(沖突是傳不上去的)
GitHub是全球最大的代碼托管倉庫
不過在國外網(wǎng)速上傳可能有點(diǎn)感人 之前有用過碼云
教程看的是廖雪峰的Git 其實(shí)還有MySQL教程
雖然人家是Java Python大神但是不影響我們學(xué)習(xí)
https://www.liaoxuefeng.com/wiki/896043488029600
因?yàn)镚it一開始是在Linux上開發(fā)的所以少不了命令行较雕,需要下一定的學(xué)習(xí)成本去用命令行控制
然后開始下載Git 這個(gè)是官網(wǎng)
https://git-scm.com/downloads
選擇系統(tǒng)第二個(gè)就是Windows系統(tǒng) 然后開始下載
國外網(wǎng)網(wǎng)速感人 停停走走 網(wǎng)速為0我建議刪了重新下載 這個(gè)是網(wǎng)盤 不過是2.15版本,我現(xiàn)在最新的是2.21
https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fgit
然后選擇一個(gè)安裝目錄之后一路Next
配置Git添加文件
安裝完畢 在桌面右鍵
就會有這兩個(gè)
點(diǎn)擊Bash有個(gè)小黑窗口
然后設(shè)置名字郵箱挚币,改一改自己敲上去亮蒋,好像復(fù)制不太行
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
--global參數(shù)表示你電腦上所有Git倉庫都會用這個(gè)配置
然后創(chuàng)建版本庫
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd命令用于顯示當(dāng)前目錄 但是不要有中文
然后用 git init 把這個(gè)目錄改變?yōu)镚it可管理的目錄
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
然后我們創(chuàng)建的目錄多了個(gè)這個(gè)
桌面自動多了個(gè)這個(gè)文件件
現(xiàn)在我們試著吧Text文件添加到倉庫
創(chuàng)建一個(gè)ReadMe.txt 然后放在learngit目錄下外面的目錄Git找不到
用這個(gè)添加命令
$ git add readme.txt
什么都不報(bào)就是成功了
然后用命令git commit把文件提交到倉庫
$ git commit -m'readMeFile'
[master (root-commit) 783b9ec] readMeFile
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 ReadMe.txt
-m后是本次提交說明
成功了會告訴后兩句
1個(gè)文件發(fā)生改變,插入0行妆毕,刪除0行
然后發(fā)現(xiàn)我們Add是分別多個(gè)Add慎玖,提交就是一起提交
Git修改
然后我們在txt多寫幾行別的東西
用git status命令查看當(dāng)前倉庫狀態(tài)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: ReadMe.txt
no changes added to commit (use "git add" and/or "git commit -a")
上面輸出說文件被改過了
然后用git diff(diff就是difference差別)查看怎么修改的這個(gè)文件信息
$ git diff ReadMe.txt
diff --git a/ReadMe.txt b/ReadMe.txt
index e69de29..85476a8 100644
--- a/ReadMe.txt
+++ b/ReadMe.txt
@@ -0,0 +1 @@
+sdfsdfsdfsdf
\ No newline at end of file
下面的+1就是我們改了一行
然后我們用命令git add
$ git add ReadMe.txt
然后再git status查看狀態(tài)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: ReadMe.txt
將要被提交的修改包括ReadMe.txt
用git commit提交
$ git commit -m'change'
[master 42158b4] change
1 file changed, 1 insertion(+)
再用git status查看倉庫狀態(tài)
$ git status
On branch master
nothing to commit, working tree clean
告訴我們沒有什么可以提交的,工作目錄是干凈的
Git 版本退回
用git log查看一共多少個(gè)版本
$ git log
commit 42158b41256749a880ad58bb191bd64470eed1cc (HEAD -> master)
Author: Corn <1004019267@qq.com>
Date: Sun Jun 2 15:02:37 2019 +0800
change
commit 783b9ec203536a24a34d44f5dfd7ad1f114f28b6
Author: Corn <1004019267@qq.com>
Date: Sun Jun 2 14:48:52 2019 +0800
readMeFile
如果嫌比較多可以后面加上--pretty=oneline
$ git log --pretty=oneline
42158b41256749a880ad58bb191bd64470eed1cc (HEAD -> master) change
783b9ec203536a24a34d44f5dfd7ad1f114f28b6 readMeFile
前面是版本號 后面是你的注釋 版本為毛不用123呢 那多人在一個(gè)版本里不就沖突了
用git reset退回 HEAD是當(dāng)前版本 HEAD是上一版本笛粘,上上版本是HEAD^凄吏,如果100個(gè)版本呢,就有了HEAD~100
$ git reset --hard HEAD~1
HEAD is now at 783b9ec readMeFile
然后我們用cat 函數(shù)查看內(nèi)容
$ cat ReadMe.txt
什么都沒有 因?yàn)榈谝话嫖覀兙蜎]寫
然后我們用git log查看版本
$ git log
commit 783b9ec203536a24a34d44f5dfd7ad1f114f28b6 (HEAD -> master)
Author: Corn <1004019267@qq.com>
Date: Sun Jun 2 14:48:52 2019 +0800
readMeFile
發(fā)現(xiàn)之前的未來被抹去了闰蛔,就像平行世界里的世界線一樣痕钢。
怎么回到未來呢,只要你沒關(guān)窗口往上找到id序六,
寫前幾位就行了 Git會自動幫你找
$ git reset --hard 42158b
HEAD is now at 42158b4 change
然后再看看內(nèi)容
$ cat ReadMe.txt
sdfsdfsdfsdf
回來了任连!
Git版本回退速度非常快例诀,他只是把HEAD指針指向不同版本
但是你關(guān)了電腦 之后再打開想回到未來怎么辦
git reflog這個(gè)記錄了你每一次命令
$ git reflog
42158b4 (HEAD -> master) HEAD@{0}: reset: moving to 42158b
783b9ec HEAD@{1}: reset: moving to HEAD~0
783b9ec HEAD@{2}: reset: moving to HEAD~1
42158b4 (HEAD -> master) HEAD@{3}: commit: change
783b9ec HEAD@{4}: commit (initial): readMeFile
然后不就知道id號了
工作區(qū)和暫存區(qū)
Git和SVN不同之一就在于有個(gè)緩存區(qū)
工作區(qū)就是這個(gè)
里面的.git是版本庫
stange是緩存區(qū)随抠,master是Git自動為我們創(chuàng)建的第一個(gè)分支裁着,還有個(gè)HEAD指向第一個(gè)版本
就是add的時(shí)候東西會加入stage緩存區(qū),在我們commit時(shí)候把所有修改提交到分支
一旦提交后拱她,如果你又沒有對工作區(qū)做任何修改二驰,那么工作區(qū)就是“干凈”的
管理修改
第一次修改 -> git add -> 第二次修改 -> git commit只會修改第一次的屬性,
第一次修改 -> git add -> 第二次修改 -> git add -> git commit 相當(dāng)于把兩次修改合并提交秉沼,所以先Add完所有修改在提交
撤銷修改
checkout撤銷工作區(qū)的修改 就是丟棄工作區(qū)的修改
$ git checkout -- ReadMe.txt
這個(gè) -- 很重要 如果沒有就成了切換到另一個(gè)分支的命令了
如果是Add之后用git reset HEAD丟棄暫存區(qū)修改桶雀,然后再checkout丟棄工作區(qū)修改
$ git reset HEAD ReadMe.txt
Unstaged changes after reset:
M ReadMe.txt
如果已經(jīng)提交了想撤銷可以用版本退回,但是起碼沒有推送到遠(yuǎn)程庫
刪除文件
$ rm ReadMe.TXT
我發(fā)現(xiàn)Git好像找文件不區(qū)分大小寫
查看發(fā)現(xiàn)文件被刪了 版本庫告訴你工作區(qū)不一樣了
這個(gè)rm -rf /慎用https://www.zhihu.com/question/29438735這是車禍慘案現(xiàn)場
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: ReadMe.txt
no changes added to commit (use "git add" and/or "git commit -a")
然后有兩個(gè)選擇
git rm刪掉唬复,并且git commit提交
或者刪錯(cuò)了 撤銷恢復(fù)到最新版本 因?yàn)榘姹編煊袛?shù)據(jù) 但是只能回到最近一次最后提交到的位置
$ git checkout -- ReadMe.txt
遠(yuǎn)程倉庫
一臺電腦充當(dāng)服務(wù)器的角色矗积,每天24小時(shí)開機(jī),其他每個(gè)人都從這個(gè)“服務(wù)器”倉庫克隆一份到自己的電腦上敞咧,并且各自把各自的提交推送到服務(wù)器倉庫里棘捣,也從服務(wù)器倉庫中拉取別人的提交
因?yàn)闆]有服務(wù)器所以鏈接GitHub
由于本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的所以要設(shè)置。
后面寫你的郵箱 然后一路回車
$ ssh-keygen -t rsa -C 'youremail@example.com'
$ ssh-keygen -t rsa -C '1004019267@qq.com'
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):
Created directory '/c/Users/Administrator/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XOf1g0shqkpFfD58BkWoXNee5GHV9uSstZGY9afpu7E 1004019267@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| oo. ...|
| . o.. = .+|
| .oooo.*.B=+|
| .++.oo.Bo+B|
| .S= o.o *=|
| . . + . =..|
| . . o. |
| . . .o |
| . Eo |
+----[SHA256]-----+
這個(gè)就是生成的位置
一個(gè)私鑰一個(gè)共鑰 公鑰可以告訴別人
這個(gè)是GitHub官網(wǎng)
https://github.com/
登錄自己賬號 沒有就注冊
英文的話可以用瀏覽器自行翻譯
點(diǎn)擊new新的
起一個(gè)標(biāo)題還有把公鑰粘貼過來
然后你每在一個(gè)電腦都往上添加一個(gè)公鑰就可以每臺電腦都提交了休建,別人只能看不能改
如果不想別人看就掏錢成私有倉庫乍恐,要不然就自己搭一個(gè)Git服務(wù)器
公鑰私鑰就是防止,萬一連接的是假冒服務(wù)器或者中間人攻擊测砂,核對數(shù)據(jù)安全性禁熏。
流程大概是客戶端請求服務(wù)器,客戶端要求驗(yàn)證邑彪,服務(wù)器找你在服務(wù)器放的公鑰瞧毙,然后找到與你本地公鑰核對,公鑰一致寄症,服務(wù)器用公鑰加密發(fā)送給你宙彪,你用私鑰解密,然后再上傳
遠(yuǎn)程倉庫與本地同步(GitHub)
找到GitHub左上角 找到
起一個(gè)名字創(chuàng)建其他默認(rèn)
然后送你一個(gè)鏈接有巧,讓你要么與遠(yuǎn)程倉庫關(guān)聯(lián)释漆,要么創(chuàng)建
我的就是選擇SSH協(xié)議的第二條照著打,你們要打自己生成的不然就關(guān)聯(lián)到我的了篮迎,之后因?yàn)槟愎€不在手中所以推不上去男图。
然后因?yàn)橹暗谋晃覀儎h了 我們要找回來
然后文件回來了
然后
第二條不要選他的復(fù)制!甜橱!大坑
把他給的這兩邊空格去掉 不然一直
git remote add [<options>] <name> <url>
用http的就不會這樣放心的復(fù)制
然后輸入push推送 又掛了
然后又是個(gè)大坑Q钒省!岂傲!復(fù)制過來的 即使不是復(fù)制
點(diǎn)后的空格也不能要D疡伞!
如果添加過遠(yuǎn)程連接
先git remote rm origin取消連接
再添加
終于好了
這個(gè)是GitHub的SSH連接第一次驗(yàn)證GitHub確認(rèn)你的Key信息是否對,是不是你想連接的地址
Yes就對了
這個(gè)警告是永久添加key到已知主機(jī)列表中乃戈,以后就不用來回輸密碼了
如果你怕不是真的GitHub 這個(gè)地址可以去核對 不過一般沒人看
https://help.github.com/en/articles/githubs-ssh-key-fingerprints
然后
網(wǎng)站就出現(xiàn)了我們本地的庫
從現(xiàn)在開始 只用這個(gè)命令就可以提交了
$ git push origin master
從遠(yuǎn)程倉庫克隆
創(chuàng)建一個(gè)庫
最下面勾上克隆 然后自動多了個(gè)ReadMe
下面使用命令git clone克隆出來一個(gè)本地庫
老夫以身試毒 看看能不能粘貼 這個(gè)是可以的褂痰,還有別忘了前面加克隆命令
這樣好像可以查看這個(gè)目錄有什么
如果有多個(gè)人協(xié)作開發(fā),那么每個(gè)人各自從遠(yuǎn)程克隆一份就可以了症虑。
你也許還注意到缩歪,GitHub給出的地址不止一個(gè),還可以用https://github.com/michaelliao/gitskills.git這樣的地址谍憔。實(shí)際上匪蝙,Git支持多種協(xié)議,默認(rèn)的git://使用ssh韵卤,但也可以使用https等其他協(xié)議骗污。
使用https除了速度慢以外崇猫,還有個(gè)最大的麻煩是每次推送都必須輸入口令沈条,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https。
這個(gè)是引用人家的原話