現(xiàn)在已經(jīng)使用git在項(xiàng)目中做版本控制工具神年,但是從來(lái)沒(méi)有詳細(xì)的學(xué)過(guò)一遍git的命令行操作方法卖局,這次也是通過(guò)廖雪峰的git教程在來(lái)仔細(xì)的學(xué)習(xí)了一遍拒秘。這篇文字也是做一個(gè)學(xué)習(xí)的記錄考榨。
廖雪峰Git教程
git init
命令把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù) 創(chuàng)建倉(cāng)庫(kù)
git add
向倉(cāng)庫(kù)中添加文件跨细,實(shí)際上是吧文件添加到暫存區(qū)
$ git add <file>
git commit
提交文件,實(shí)際上是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支
$ git commit -m "提交說(shuō)明"
git status
命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)
git diff
顧名思義就是查看differencegit
$ git diff <file>
$ git diff HEAD --<file> 該命令可以查看工作區(qū)和版本庫(kù)里面最新版本的區(qū)別
git log
命令查看提交日志
git log --pretty=oneline
將日志簡(jiǎn)化顯示 一行
$ git log --graph
查看分支合并日志
$ git log --graph --pretty=oneline
查看分支合并日志董虱,并一行顯示
$ git log --graph --pretty=oneline --abbrev-commit
查看分支合并日志扼鞋,并一行顯示申鱼,簡(jiǎn)化commit id 顯示
git reset
$ git reset --hard HEAD^
退回上一個(gè)版本
$ git reset --hard <commit id>
退回到指定的版本
$ git reset HEAD <file>
可以把暫存區(qū)的修改撤銷掉(unstage)愤诱,重新放回工作區(qū)
HEAD 表示是最新版本
在Git中,用HEAD表示當(dāng)前版本捐友,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣)淫半,上一個(gè)版本就是HEAD,上上一個(gè)版本就是HEAD匣砖,當(dāng)然往上100個(gè)版本寫100個(gè)比較容易數(shù)不過(guò)來(lái)科吭,所以寫成HEAD~100。
git reflog
用來(lái)記錄你的每一次命令:提交切換版本id等
git checkout -- filename
把<file>文件在工作區(qū)的修改全部撤銷猴鲫,這里有兩種情況:
一種是<file>自修改后還沒(méi)有被放到暫存區(qū)对人,現(xiàn)在,撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài)拂共;
一種是<file>已經(jīng)添加到暫存區(qū)后牺弄,又作了修改,現(xiàn)在宜狐,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)势告。
git rm
$ git rm <file> 從版本庫(kù)中刪除文件
Git跟蹤并管理的是修改蛇捌,而非文件。
第一次修改 -> git add -> 第二次修改 -> git commit
你看咱台,我們前面講了络拌,Git管理的是修改,當(dāng)你用git add命令后,在工作區(qū)的第一次修改被放入暫存區(qū)液斜,準(zhǔn)備提交居触,但是,在工作區(qū)的第二次修改并沒(méi)有放入暫存區(qū)祥诽,所以,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了瓮恭,也就是第一次的修改被提交了雄坪,第二次的修改不會(huì)被提交。
撤銷修改的小結(jié):
場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容屯蹦,想直接丟棄工作區(qū)的修改時(shí)维哈,用命令git checkout -- file。
場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容登澜,還添加到了暫存區(qū)時(shí)阔挠,想丟棄修改,分兩步脑蠕,第一步用命令git reset HEAD file购撼,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作谴仙。
場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí)迂求,想要撤銷本次提交,可以使用退回版本晃跺,不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)揩局。
關(guān)聯(lián)GitHUb
SSH Key
第1步:創(chuàng)建SSH Key。在用戶主目錄下掀虎,看看有沒(méi)有.ssh
目錄凌盯,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa
和id_rsa.pub
這兩個(gè)文件烹玉,如果已經(jīng)有了驰怎,可直接跳到下一步。如果沒(méi)有二打,打開(kāi)Shell(Windows下打開(kāi)Git Bash)县忌,創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
第2步:登陸GitHub,打開(kāi)“Account settings”,“SSH Keys”頁(yè)面:
然后芹枷,點(diǎn)“Add SSH Key”衅疙,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容鸳慈。
本地倉(cāng)庫(kù)內(nèi)容推送到GitHub倉(cāng)庫(kù)
在本地倉(cāng)庫(kù)下使用一下命令饱溢,將本地倉(cāng)庫(kù)和GitHub倉(cāng)庫(kù)關(guān)聯(lián)起來(lái)
$ git remote add origin git@github.com:GitHub賬戶名/倉(cāng)庫(kù)名.git
origin是默認(rèn)的遠(yuǎn)程倉(cāng)庫(kù)名稱,可以自己修改
git push
將本地的倉(cāng)庫(kù)推送到遠(yuǎn)程
$ git push -u origin master
由于遠(yuǎn)程庫(kù)是空的走芋,我們第一次推送master分支時(shí)绩郎,加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支翁逞,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái)肋杖,在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。
$ git push origin branchname
在本地倉(cāng)庫(kù)提交后推送到遠(yuǎn)程倉(cāng)庫(kù)
git pull
將遠(yuǎn)程庫(kù)拉下來(lái)(更新遠(yuǎn)程庫(kù)的修改)
注:如果pull失敗挖函,原因是本地的分支沒(méi)有和遠(yuǎn)程的分支鏈接
$ git branch --set-upstream localbranch origin/dev
localbranch:本地分支 origin/dev:遠(yuǎn)程庫(kù)名/分支
git clone
遠(yuǎn)程Clone倉(cāng)庫(kù)
$ git clone git@github.com:GitHub賬戶名/倉(cāng)庫(kù)名.git
git branch
查看分支
git branch <name>
創(chuàng)建分支
git checkout <name>
切換分支
git checkout
git checkout -b <name>
創(chuàng)建+切換分支
注:從遠(yuǎn)程庫(kù)clone下來(lái)時(shí)状植,默認(rèn)只能看到本地的master分支,如果想在clone下的庫(kù)的其它分支開(kāi)發(fā)可以用一下命令
$ git checkout -b dev origin/dev 遠(yuǎn)程origin庫(kù)的dev分支
git merge <name>
合并某分支到當(dāng)前分支:
$ git merge --no-ff -m "commit content" branchname
Git 默認(rèn)的合并方式是 Fast forward 這種模式下怨喘,刪除分支同樣會(huì)刪除分支信息
以--no-ff模式合并分支津畸,會(huì)生成一個(gè)新的commit,刪除分支后能看見(jiàn)分支的歷史信息
默認(rèn) Fast forward模式
git branch
git branch -d <name>
刪除分支
git branch -D <name>
強(qiáng)行刪除一個(gè)未合并的分支
git stash
把當(dāng)前的工作區(qū)“存儲(chǔ)”起來(lái)必怜,可以切換的其他分支修改bug肉拓,用于當(dāng)前開(kāi)到一半,需要去別的分支修改bug 的情況
git stash drop
刪除stash
git stash list
查看當(dāng)前stash的列表
git stash apply
恢復(fù)stash梳庆,但stash內(nèi)容并不刪除
git stash apply stash@{0}
當(dāng)有多個(gè)stash列表的時(shí)候暖途,可以指定stash id 恢復(fù)
git stash pop
恢復(fù)的同時(shí)把stash內(nèi)容也刪了
git remote
查看遠(yuǎn)程庫(kù)的信息
git remote -v
查看遠(yuǎn)程庫(kù)的詳細(xì)信息
git tag
tag就是給提交的一個(gè)commit綁定在一起,起一個(gè)更易于查找的名稱膏执。
git tag <name>用于新建一個(gè)標(biāo)簽驻售,默認(rèn)為HEAD,也可以指定一個(gè)commit id胧后;
git tag -a <tagname> -m "blablabla..."可以指定標(biāo)簽信息芋浮;
git tag -s <tagname> -m "blablabla..."可以用PGP簽名標(biāo)簽抱环;
git tag可以查看所有標(biāo)簽壳快。
git push origin <tagname>可以推送一個(gè)本地標(biāo)簽;
git push origin --tags可以推送全部未推送過(guò)的本地標(biāo)簽镇草;
git tag -d <tagname>可以刪除一個(gè)本地標(biāo)簽眶痰;
git push origin :refs/tags/<tagname>可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。