(參照莫煩教程morvanzhou.github.io/tutorials/others/git/)
1.windos下安裝
git為windows提供了.exe的安裝包劈猪,進(jìn)入https://git-scm.com/download/win,選擇對(duì)應(yīng)的版本,按照默認(rèn)安裝參數(shù)安裝即可。成功安裝后枚驻,會(huì)在所有程序中出現(xiàn)一個(gè)git文件夾,里面有一個(gè)Git Bash,之后的命令行操作都可以在這個(gè)Git Bash下完成。
2.創(chuàng)建git版本庫(kù)
init
首先選擇要對(duì)那個(gè)文件夾進(jìn)行g(shù)it管理痹兜,創(chuàng)建一個(gè)文件夾stud,打開Git Bash窗口颤诀,cd到stud目錄下
使用git config 添加name和email字旭,這樣可以更好的記錄每一個(gè)記錄每一個(gè)修改的人
使用git init 對(duì)該文件進(jìn)行g(shù)it管理
提示已經(jīng)建立了一個(gè)空的git管理庫(kù)
創(chuàng)建一個(gè)1.py文件, .git文件夾下存放的為git的一些配置管理文件
status
使用git stauts 可以查看當(dāng)前版本庫(kù)的狀態(tài)
on branch master 提示當(dāng)前分支在master上,紅色的1.py表示1.py的文件還未被加入版本庫(kù)崖叫,提示使用git add <file>添加至版本庫(kù)
add
使用git add 1.py將1.py文件添加至版本庫(kù)遗淳,還可以使用git add .命令,表示一次性添加所有未被添加的文件
可以看到使用git add 1.py之后再使用git status查看出現(xiàn)了綠色的1.py心傀,表示1.py已添加至版本庫(kù)
commit
使用git commit -m "creat 1.py"將添加至版本庫(kù)的1.py文件提交屈暗,-m參數(shù)表示為此次更改添加的注釋
可以看到提示1 file changed
3.修改日志、查看修改內(nèi)容(log脂男、diff)
log
使用git log 命令可以查看提交的修改記錄养叛,可以看到commit的id號(hào)有二三十位字母加數(shù)字組成,Author為log config 中配置的name和email宰翅,date和注釋一铅。git log --oneline查看提交修改記錄,顯示為一行commit id這里只取7位堕油,注釋潘飘。
編輯1.py加入a = 1,然后git status查看狀態(tài),git add . 添加改動(dòng)至版本庫(kù)掉缺,git commit -m "change 1"提交修改至版本庫(kù)卜录,使用git log 可以查看到所有提交修改的信息。
diff
修改1.py ,a = 2 b = 1眶明。
沒(méi)有使用git add .之前艰毒,查看1.py與上次commit的1.py的不同使用git diff 查看,紅色的-a = 1表示刪除了 a = 1搜囱,綠色的+a = 2 +b = 1表示添加了a = 2 b = 1
使用 git add .添加1.py至版本庫(kù)之后丑瞧,1.py變成了可提交狀態(tài),此時(shí)使用git diff --cached查看1.py與commit之前的1.py的不同蜀肘,可以看到此時(shí)使用git diff沒(méi)有任何返回绊汹。
再次修改1.py 添加c = b,此時(shí)a = 2, b = 1已結(jié)通過(guò)add添加至版本庫(kù)扮宠,c = b的修改未add西乖,使用git diff HEAD 可以查看這種類型的未commit和commit的不同,下圖對(duì)比了三種diff的不同
git diff HEAD --filename查看工作區(qū)(未add到暫存區(qū))和本地版本庫(kù)最新修改的文件不同 ? ? ? ? ? ? ? ? ? git diff --filename 查看工作區(qū)和版本庫(kù)的文件不同 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? git diff --cached ?--filename 查看暫存區(qū)和版本庫(kù)的文件不同
修改已commit 的版本
復(fù)制1.py文件,重命名為2.py获雕,想要吧2.py也寫進(jìn)之前的commit進(jìn)change2中怎么做呢薄腻,可以使用git commit --amend --no-edit (--no-edit不編輯直接合并到上一個(gè)commit)
回到過(guò)去reset
回到add之前
有時(shí)add了修改,又想回到add之前在添加一些修改届案,可以使用git reset 命令庵楷。
編輯1.py,添加d = 1楣颠,git add添加至版本庫(kù)尽纽,然后使用git reset 1.py命令可以回到add之前
git status -s直接顯示文件的狀態(tài),是否添加至版本庫(kù)球碉,綠色的M表示添加至版本庫(kù)蜓斧,紅色的M表示未添加至版本庫(kù)
回到commit之前
每個(gè)commit都有一個(gè)id號(hào)仓蛆,HEAD是一個(gè)指針睁冬,指引當(dāng)前狀態(tài)是哪個(gè)commit,要想回到commit之前看疙,需要讓HEAD回到過(guò)去豆拨,并reset到之前的HEAD。
git reset --hard HEAD會(huì)把當(dāng)前工作目錄中未提交的所有內(nèi)容清空能庆,git reset --hard HEAD^或git reset --hard id號(hào)回到上一個(gè)commit
可以看到change2消失了
恢復(fù)change2施禾,git reflog 查看所有分支的操作記錄,使用git reset --hard id號(hào)可以恢復(fù)change2
回到從前(checkout針對(duì)單個(gè)文件)
上面做的都是讓整個(gè)版本庫(kù)回到commit 之前搁胆,只想讓某單個(gè)文件回到commit之前弥搞,可以使用git checkout id號(hào) -- 文件名
git checkout id -- 1.py之后可以看到1.py回到了上次commit的內(nèi)容,git status看到此時(shí)相當(dāng)于change2中1.py有修改可以提交渠旁,使用git commit -m ""back to change ”提交修改攀例,提交之后之前的change2還存在,又產(chǎn)生了一個(gè)新的commit記錄顾腊,但是1.py文件的狀態(tài)已經(jīng)回到了c1a24fc時(shí)的狀態(tài)粤铭,這就是與reset的區(qū)別,reset之后整個(gè)版本庫(kù)會(huì)回退至c1a24fc的狀態(tài)杂靶,change2的commit記錄會(huì)消失
分支
git branch dev 新建名為dev的分支梆惯,git branch查看分支, git checkout dev 切換分支吗垮,git checkout -b+分支名垛吗,可以直接創(chuàng)建和切換分支,git branch -D dev 刪除某個(gè)分支
在分支中修改文件和在master中修改文件是一樣的烁登, -am add所有改變并直接commit
將dev的修改merge推送至master职烧,先使用git checkout master從dev切換分支master,再git merge dev,使用git merge dev 在git log 下不會(huì)有commit信息蚀之,使用git merge --no-ff -m "keep merge info" dev可以保留merge的commit 信息
merge 分支沖突
可能會(huì)有這樣的情況蝗敢,當(dāng)你在dev分支上進(jìn)行開發(fā),有人在master上更改了遺留的bug足删,這個(gè)時(shí)候當(dāng)你開發(fā)完dev想merge dev到master的時(shí)候就會(huì)出現(xiàn)沖突了
merge的時(shí)候提示出現(xiàn)沖突了
之所以沖突是因?yàn)?.py在master和dev上是不同的寿谴,打開1.py可以看到git已經(jīng)把沖突的部分幫我們標(biāo)記出來(lái)了,手動(dòng)修改下1.py文件
git標(biāo)記的1.py沖突部分
手動(dòng)解決沖突之后的1.py
這個(gè)時(shí)候再進(jìn)行merge失受,可以看到這次可以成功merge
rebase分支沖突
rebase也可以進(jìn)行合并讶泰,當(dāng)有一個(gè)共享的分支master和一個(gè)當(dāng)前正在開發(fā)的dev分支,當(dāng)master分支修改了之前遺留的一些bug后拂到,我想試試看修復(fù)這些bug之后的版本是否和我的dev分支兼容痪署,這個(gè)時(shí)候可以使用rebase.(rebase相當(dāng)于提取了當(dāng)前的修改,然后將其復(fù)制到了目標(biāo)分支之后兄旬,這樣可以在dev分支上看到之前發(fā)生在master上面的修改log)
在master分支下使用git reset --hard id命令回到之前未merge的狀態(tài)
可以看到這時(shí)狼犯,1.py在master和dev中都有不同的修改,因?yàn)槲覀兿朐赿ev上rebase master,使用git checkout dev切換至dev分支领铐,這時(shí)通過(guò)rebase進(jìn)行合并悯森,可以看到提示文件沖突了,這個(gè)時(shí)候使用git branch可以看到此時(shí)不在HEAD即不在dev也不在master上
vi 1.py 去手動(dòng)處理掉沖突绪撵,然后 git add . 再git rebase --continue可以看到此時(shí)rebase成功了瓢姻,使用git log --oneline可以看到,dev里面加入了master的commit記錄音诈,這里和merge不同幻碱,merge會(huì)創(chuàng)建一個(gè)新的commit記錄去進(jìn)行base、目標(biāo)分支的合并细溅。
使用rebase時(shí)只能在自己的分支下面rebase褥傍,不可以在共享的分支下進(jìn)行rebase,這樣的話會(huì)將master中的commit歷史改變
stash
git stash用來(lái)暫存當(dāng)前工作區(qū)的內(nèi)容谒兄,讓工作區(qū)的內(nèi)容回到和上一次commit的內(nèi)容一致摔桦。這個(gè)時(shí)候就可以在當(dāng)前分支下新建一個(gè)新的分支內(nèi)容和當(dāng)前分支內(nèi)容一致了
git stash list 用來(lái)查看當(dāng)前stash中的緩存,git stash pop用來(lái)提取之前暫存的內(nèi)容
git下忽略文件
在創(chuàng)建的git倉(cāng)庫(kù)文件夾下新建一個(gè).gitignore文件承疲。
# 忽略*.o和*.a文件
*.[oa]
# 忽略*.b和*.B文件邻耕,my.b除外
*.[bB]
!my.b
# 忽略dbg文件和dbg目錄
dbg
# 只忽略dbg目錄,不忽略dbg文件
dbg/
# 只忽略dbg文件燕鸽,不忽略dbg目錄
dbg
!dbg/
# 只忽略當(dāng)前目錄下的dbg文件和目錄兄世,子目錄的dbg不在忽略范圍內(nèi)
/dbg
github
注冊(cè)自己的github賬號(hào),在git bash中生成一對(duì)秘鑰啊研,在github setting 中添加ssh key
在github上創(chuàng)建一個(gè)倉(cāng)庫(kù)御滩,在本地新建一個(gè)文件鸥拧,使用git bash cd進(jìn)這個(gè)文件,然后創(chuàng)建一個(gè)README.md文件削解,使用git config 命令添加name和email富弦,git init 對(duì)該文件進(jìn)行g(shù)it 管理,使用git commit -am 提交新添加的README.md文件氛驮,使用git remote add origin +git倉(cāng)庫(kù)url(第一次提交項(xiàng)目需使用這行命令將本地倉(cāng)庫(kù)與遠(yuǎn)程的倉(cāng)庫(kù)建立一個(gè)鏈接腕柜,origin相當(dāng)于是倉(cāng)庫(kù)url的別名)
git push -u origin master將修改提交到遠(yuǎn)程倉(cāng)庫(kù)(這里的-u參數(shù)相當(dāng)于指定origin為默認(rèn)的主機(jī))
git push -u origin dev提交dev分支到遠(yuǎn)程倉(cāng)庫(kù)
git branch -D dev 刪除本地dev分支,git push -u origin :dev刪除遠(yuǎn)程倉(cāng)庫(kù)中的dev分支(:+分支名表示刪除分支)
git clone +git倉(cāng)庫(kù)url矫废,下載整個(gè)項(xiàng)目
git pull -u origin master 將當(dāng)前master分支的更改更新到本地