簡介
- Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)(用C寫的)。
- Git和其他版本控制系統(tǒng)如SVN的一個(gè)不同之處就是有暫存區(qū)的概念烦感。
- CVS唯卖、SVN是免費(fèi)的集中式的版本控制系統(tǒng),不但速度慢,而且必須聯(lián)網(wǎng)才能使用掏膏。
- msysgit是Windows版的Git,從https://git-for-windows.github.io下載敦锌。
- 所有的版本控制系統(tǒng)壤追,其實(shí)只能跟蹤文本文件的改動;如果要真正使用版本控制系統(tǒng)供屉,就要以純文本方式編寫文件行冰。
- 不要使用Windows自帶的記事本編輯任何文本文件,建議下載Notepad++代替記事本伶丐,把Notepad++的默認(rèn)編碼設(shè)置為UTF-8 without BOM即可悼做。
- 提交修改和提交新文件是一樣的兩步。
- 在Git中哗魂,用HEAD表示當(dāng)前版本肛走,也就是最新的提交3628164...882e1e0,上一個(gè)版本就是HEAD录别,上上一個(gè)版本就是HEAD朽色,當(dāng)然往上100個(gè)版本寫100個(gè)比較容易數(shù)不過來,所以寫成HEAD~100组题。
- 撤銷修改:
- 場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容葫男,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file崔列。
- 場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容梢褐,還添加到了暫存區(qū)時(shí),想丟棄修改赵讯,分兩步盈咳,第一步用命令git reset HEAD file,就回到了場景1边翼,第二步按場景1操作鱼响。
- 場景3:已經(jīng)提交了不合適的修改到版本庫時(shí),想要撤銷本次提交组底,參考版本回退一節(jié)丈积,不過前提是沒有推送到遠(yuǎn)程庫。
- 遠(yuǎn)程庫的名字就是origin斤寇,這是Git默認(rèn)的叫法桶癣,也可以改成別的拥褂,但是origin這個(gè)名字一看就知道是遠(yuǎn)程庫娘锁。
- Git用<<<<<<<,=======饺鹃,>>>>>>>標(biāo)記出不同分支的內(nèi)容莫秆。
- 分支策略:在實(shí)際開發(fā)中间雀,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
首先,master分支應(yīng)該是非常穩(wěn)定的镊屎,也就是僅用來發(fā)布新版本惹挟,平時(shí)不能在上面干活;
那在哪干活呢缝驳?干活都在dev分支上连锯,也就是說,dev分支是不穩(wěn)定的用狱,到某個(gè)時(shí)候运怖,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上夏伊,在master分支發(fā)布1.0版本摇展;
你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支溺忧,時(shí)不時(shí)地往dev分支上合并就可以了咏连。 - 在Git中,分支完全可以在本地自己藏著玩鲁森,是否推送祟滴,視你的心情而定:
- master分支是主分支,因此要時(shí)刻與遠(yuǎn)程同步歌溉;
- dev分支是開發(fā)分支踱启,團(tuán)隊(duì)所有成員都需要在上面工作,所以也需要與遠(yuǎn)程同步研底;
- bug分支只用于在本地修復(fù)bug埠偿,就沒必要推到遠(yuǎn)程了,除非老板要看看你每周到底修復(fù)了幾個(gè)bug榜晦;
- feature分支是否推到遠(yuǎn)程冠蒋,取決于你是否和你的小伙伴合作在上面開發(fā)。
- 從本地推送分支乾胶,使用git push origin branch-name抖剿,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交识窿。
- 配置Git的時(shí)候斩郎,加上--global是針對當(dāng)前用戶起作用的,如果不加喻频,那只針對當(dāng)前的倉庫起作用缩宜。
- 每個(gè)倉庫的Git配置文件都放在.git/config文件中,別名就在[alias]后面,要?jiǎng)h除別名锻煌,直接把對應(yīng)的行刪掉即可妓布;而當(dāng)前用戶的Git配置文件放在用戶主目錄下的一個(gè)隱藏文件.gitconfig中,配置別名也可以直接修改這個(gè)文件宋梧,如果改錯(cuò)了匣沼,可以刪掉文件重新通過命令配置。
- 如何參與一個(gè)開源項(xiàng)目呢捂龄?比如人氣極高的bootstrap項(xiàng)目释涛,這是一個(gè)非常強(qiáng)大的CSS框架,你可以訪問它的項(xiàng)目主頁倦沧,點(diǎn)“Fork”就在自己的賬號下克隆了一個(gè)bootstrap倉庫枢贿,然后,從自己的賬號下clone:git clone git@github.com:michaelliao/bootstrap.git刀脏,一定要從自己的賬號下clone倉庫局荚,這樣你才能推送修改。如果從bootstrap的作者的倉庫地址git@github.com:twbs/bootstrap.git克隆愈污,因?yàn)闆]有權(quán)限耀态,你將不能推送修改。
- .gitignore文件自己配置暂雹,把不想上傳的文件或文件夾的名字寫在.gitignore里面就行了首装,每行寫一個(gè)名字,#號是注釋杭跪,在后綴名(如.css)后面加星號(*)仙逻,可以忽略所有是這個(gè)后綴的文件。
- 多人協(xié)作:自己創(chuàng)建好倉庫涧尿,在所創(chuàng)建倉庫的setting里添加協(xié)作者系奉,被添加的從這個(gè)倉庫clone到本地就可以修改了。
- git不能push空文件夾姑廉,可以在空文件夾里面加個(gè).gitkeep文件缺亮。
命令行常用命令
- $ pwd 顯示當(dāng)前目錄;
- $ mkdir learngit 創(chuàng)建learngit目錄桥言;
- $ cd learngit 即指定learngit為當(dāng)前目錄萌踱;
- $ ls -a 列出當(dāng)前目錄下的所有子目錄;
- $ ls -al ./.ssh 檢查.ssh是否存在($ ls -al ~/.ssh)号阿;
- ctrl+insert 復(fù)制并鸵;
- shift+insert 粘貼;
- 方向上下箭頭可選擇使用過的命令扔涧;
- ctrl+c 退出當(dāng)前命令园担;
- $ vi readme.txt 進(jìn)入readme.txt編輯區(qū)普通模式,i 進(jìn)入插入模式,esc返回普通模式粉铐,:q退出,:q!不保存退出卤档,:wq保存并退出蝙泼。
- $ vi fileName.py 如果開始時(shí)fileName.py不存在,則是創(chuàng)建了fileName.py文件劝枣;
- $ cat readme.txt 會把文件內(nèi)容打印到屏幕汤踏;
- $ cat > readme.txt 可以向readme.txt輸入內(nèi)容,輸入的內(nèi)容會替換掉原有內(nèi)容舔腾,按ctrl+d結(jié)束輸入溪胶,會將輸入的內(nèi)容保存到文件。
- $ touch fileName 創(chuàng)建文件fileName稳诚;
- $ wc (Word Count) 字?jǐn)?shù)信息統(tǒng)計(jì)哗脖,如 wc index.html;
- $ more less 查看文件,如more /etc/passwd扳还、less /etc/passwd;
- $ mv (move) 移動文件或重命名才避,如 mv index.html ./demo/index.html;
- $ cp (copy) 復(fù)制文件,cp index.html ./demo/index.html;
- $ head 查看文件前幾行氨距,如 head -5 index.html;
- $ tail 查看文件后幾行 –n –f桑逝,如 tail index.html、tail -5 index.html
- $ tab 自動補(bǔ)全俏让,連按兩次會將所有匹配內(nèi)容顯示出來;
- $ history 查看操作歷史;
- $ ssh 遠(yuǎn)程登錄楞遏,如ssh root@gitlab.study.com (此處root是用戶名);
- $ > 和 >>重定向,如echo hello world! > README.md首昔,>覆蓋 >>追加;
- $ wget 下載寡喝,如wget https://nodejs.org/dist/v4.4.0/node-v4.4.0.tar.gz;
- $ tar 解壓縮,如tar zxvf node-v4.4.0.tar.gz;
-$ curl 網(wǎng)絡(luò)請求勒奇,如curl http://www.baidu.com; - $ who am i 查看當(dāng)前用戶;
- $ | 管道符;
- $ grep 匹配內(nèi)容拘荡,一般結(jié)合管道符使用;
vi編輯器常用命令
- 命令行模式命令:
- $ ZZ(大寫) 保存并退出;
- $ u 轍銷操作,可多次使用;
- $ dd 刪除當(dāng)前行;
- $ yy 復(fù)制當(dāng)前行;
- $ p 粘貼內(nèi)容;
ctrl+f 向前翻頁;
ctrl+b 向后翻頁; - $ i 進(jìn)入編輯模式撬陵,當(dāng)前光標(biāo)處插入;
- $ a 進(jìn)入編輯模式珊皿,當(dāng)前光標(biāo)后插入;
- $ A 進(jìn)入編輯模式,光標(biāo)移動到行尾;
- $ o 進(jìn)入編輯模式巨税,當(dāng)前行下面插入新行;
- $ O 進(jìn)入編輯模式蟋定,當(dāng)前行上面插入新行;
- 底行模式命令:
- :w 保存;
- :w filenme另存為草添;
- :q 退出驶兜;
- :wq 保存并退出;
- :e! 撤銷更改,返回到上一次保存的狀態(tài)抄淑;
- :q! 不保存強(qiáng)制退出屠凶;
- :set nu 設(shè)置行號;
git常用命令
- $ git init 把當(dāng)前目錄變成Git可以管理的倉庫肆资;
- $ git add readme.txt 用命令git add告訴Git矗愧,把文件添加到倉庫;
- $ git add . 把所有需要add的文件全add了郑原;
- $ git commit -m "wrote a readme file" 用命令git commit告訴Git唉韭,把文件提交到倉庫(-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容)犯犁;
- $ git status 可以讓我們時(shí)刻掌握倉庫當(dāng)前的狀態(tài);
- $ git diff 可以查看修改內(nèi)容;
- $ git log 顯示從最近到最遠(yuǎn)的提交日志属愤;
- $ git log -1 顯示最后一次的提交日志;
- $ git log --pretty=oneline 相對簡潔的顯示提交日志酸役;
- $ git reset --hard HEAD^ 回退到上一個(gè)版本住诸;
- $ git reset --hard commit_id 回退到commit_id版本(版本號沒必要寫全,前幾位就可以了涣澡,Git會自動去找)只壳;
- $ git reflog 查看命令歷史,以便確定要回到未來的哪個(gè)版本;
- $ git checkout -- readme.txt 把readme.txt文件在工作區(qū)的修改全部撤銷(修改后還沒有被放到暫存區(qū))暑塑;
- $ git checkout 切換到另一個(gè)分支吼句;
- $ git reset HEAD readme.txt 可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)事格,再$ git checkout -- readme.txt即可惕艳;
- $ rm test.txt 從工作區(qū)刪除test.txt文件;
- $ rmdir (Remove Directory) 刪除文件夾驹愚,只能刪除空文件夾远搪,不常用;
- $ git rm test.txt 從版本庫中刪除該文件,并且git commit逢捺;
- $ git checkout -- test.txt 把工作區(qū)誤刪的文件恢復(fù)到版本庫里的最新版本(用版本庫里的版本替換工作區(qū)的版)谁鳍;
- $ ssh-keygen -t rsa -C "youremail@example.com" 創(chuàng)建SSH Key;
- $ eval $(ssh-agent -s) 確認(rèn)ssh-agent是可用的劫瞳;
- $ ssh-add ~/.ssh/id_rsa 將ssh key添加到ssh-agent倘潜;
- $ clip < ~/.ssh/id_rsa.pub 復(fù)制id_rsa.pub的內(nèi)容;
- $ ssh -T git@github.com 驗(yàn)證是否配置成功;
- $ ssh -T -v git@github.com SSH的debug命令;
- $ git remote show 查看遠(yuǎn)程倉庫的別名志于,如origin涮因;
- $ git remote add origin git@github.com:michaelliao/learngit.git 本地倉庫關(guān)聯(lián)遠(yuǎn)程庫(前面的michaelliao替換成你自己的GitHub賬戶名)(給遠(yuǎn)程倉庫起別名origin);
- $ git clone git@github.com:michaelliao/gitskills.git 克隆一個(gè)本地庫伺绽;
- $ git push -u origin master 把本地庫的所有內(nèi)容推送到遠(yuǎn)程庫上养泡,第一次推送master分支時(shí)嗜湃,加上了-u參數(shù)(把本地庫的內(nèi)容推送到遠(yuǎn)程,用git push命令澜掩,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程购披。);
- $ git push origin master 把本地master分支的最新修改推送至GitHub肩榕;
-
分支管理:
- $ git branch 查看分支刚陡,會列出所有分支,當(dāng)前分支前面會標(biāo)一個(gè)*號点把。;
- $ git branch <name> 創(chuàng)建分支;
- $ git checkout <name> 切換分支;
- $ git checkout -b <name> 創(chuàng)建+切換分支;
- $ git merge <name> 合并某分支到當(dāng)前分支;
- $ git branch -d <name> 刪除分支;
- $ git branch -D <name> 強(qiáng)行刪除;
- $ git log --graph --pretty=oneline --abbrev-commit 用帶參數(shù)的git log也可以看到分支的合并情況橘荠;
- $ git merge --no-ff -m "merge with no-ff" dev 準(zhǔn)備合并dev分支屿附,--no-ff參數(shù)表示禁用Fast forward郎逃,因?yàn)楸敬魏喜⒁獎(jiǎng)?chuàng)建一個(gè)新的commit,所以加上-m參數(shù)挺份,把commit描述寫進(jìn)去褒翰;
- $ git stash 把當(dāng)前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作匀泊;
- $ git stash list 查看工作現(xiàn)場被存到哪里去了优训;
- $ git stash pop 恢復(fù)的同時(shí)把stash內(nèi)容也刪了(用git stash apply恢復(fù),但是恢復(fù)后各聘,stash內(nèi)容并不刪除揣非,你需要用git stash drop來刪除);
- $ git stash apply stash@{0} 可以多次stash躲因,恢復(fù)的時(shí)候早敬,先用git stash list查看,然后恢復(fù)指定的stash大脉;
- $ git remote 查看遠(yuǎn)程庫的信息搞监;
- $ git remote show 查看遠(yuǎn)程倉庫別名(origin);
- $ git
- $ git remote -v 顯示更詳細(xì)遠(yuǎn)程庫的信息镰矿;
- $ git checkout -b branch-name origin/branch-name 在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支琐驴,本地和遠(yuǎn)程分支的名稱最好一致(這個(gè)命令失敗了不知原因,替代方法本地先創(chuàng)建branch-name秤标,直接推送到遠(yuǎn)程的這個(gè)分支上即可)绝淡;
- $ git pull 用git pull把最新的提交從origin/dev抓下來;
- $ git branch --set-upstream-to=origin/dev 設(shè)置本地dev和origin/dev的鏈接(建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián));
$ git tag v1.0 打一個(gè)新標(biāo)簽(默認(rèn)標(biāo)簽是打在最新提交的commit上的);
$ git tag v0.9 6224937 其中6224937是commit id苍姜,
$ git tag 查看所有標(biāo)簽够委,標(biāo)簽不是按時(shí)間順序列出,而是按字母排序的怖现;
$ git show <tagname> 查看標(biāo)簽信息;
$ git tag -a v0.1 -m "version 0.1 released" 3628164 創(chuàng)建帶有說明的標(biāo)簽茁帽,用-a指定標(biāo)簽名玉罐,-m指定說明文字;
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a 通過-s用私鑰簽名一個(gè)標(biāo)簽(簽名采用PGP簽名,因此潘拨,必須首先安裝gpg(GnuPG)吊输,如果沒有找到gpg,或者沒有g(shù)pg密鑰對铁追,就會報(bào)錯(cuò),用PGP簽名的標(biāo)簽是不可偽造的季蚂,因?yàn)榭梢则?yàn)證PGP簽名);
$ git tag -d <tagname> 刪除一個(gè)本地標(biāo)簽;
$ git push origin :refs/tags/<tagname> 刪除一個(gè)遠(yuǎn)程標(biāo)簽;
$ git push origin <tagname> 推送一個(gè)本地標(biāo)簽;
$ git push origin --tags 可以推送全部未推送過的本地標(biāo)簽琅束;
$ git config --global color.ui true 讓Git顯示顏色扭屁,會讓命令輸出看起來更醒目;
$ git add -f App.class 強(qiáng)制添加文件;
$ git check-ignore -v App.class 檢查.gitignore的哪個(gè)規(guī)則寫錯(cuò)了涩禀;
$ git config --global alias.st status 配置別名料滥,st就表示status;
$ git config --global alias.last 'log -1' 長命令加單引號艾船;
$ cat .git/config 每個(gè)倉庫的Git配置文件都放在.git/config文件中葵腹;
$ cat .gitconfig 當(dāng)前用戶的Git配置文件放在用戶主目錄下的一個(gè)隱藏文件.gitconfig中;
小結(jié)
- 在這里強(qiáng)烈推薦廖雪峰大神的個(gè)人網(wǎng)站屿岂,里面有各種你想要的干貨践宴!廖大神個(gè)人網(wǎng)站入口: http://www.liaoxuefeng.com/ 。