常用命令
- git init
把當(dāng)前目錄初始化為倉(cāng)庫(kù)根吁,多了一個(gè).git的目錄,這個(gè)目錄是Git來(lái)跟蹤管理版本庫(kù)的
也不一定必須在空目錄下創(chuàng)建Git倉(cāng)庫(kù)端盆,選擇一個(gè)已經(jīng)有東西的目錄也是可以的 - git add 文件名
告訴Git怀骤,把文件添加到倉(cāng)庫(kù) - git commit -m "這里寫(xiě)注釋"
告訴Git费封,把文件提交到倉(cāng)庫(kù),-m后面輸入的是本次提交的說(shuō)明蒋伦,可以輸入任意內(nèi)容弓摘,當(dāng)然最好是有意義的 - git status
git status命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài) - git diff
查看difference,顯示的格式正是Unix通用的diff格式 - git log
命令顯示從最近到最遠(yuǎn)的提交日志,版本號(hào)是一個(gè)SHA1計(jì)算出來(lái)的一個(gè)非常大的數(shù)字痕届,用十六進(jìn)制表示
如果嫌輸出信息太多韧献,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù)研叫,后面顯示commit時(shí)的備注
用==HEAD==表示當(dāng)前版本
上一個(gè)版本就是HEAD锤窑,上上一個(gè)版本就是HEAD,當(dāng)然往上100個(gè)版本寫(xiě)100個(gè)比較容易數(shù)不過(guò)來(lái)蓝撇,所以寫(xiě)成HEAD~100
li.tianzeng@litianzeng MINGW64 /f/git (master)
$ git log
commit 9b378c6671d5d975d80e621f047140660f8be617 (HEAD -> master)
Author: ltz150 <ltz150@163.com>
Date: Sun Oct 28 16:38:53 2018 +0800
版本3
commit 60f710a986e854da76fe71561c8bfd59979b00e5
Author: ltz150 <ltz150@163.com>
Date: Sun Oct 28 16:37:54 2018 +0800
版本2
commit b73a42c36aac49acc8eb9bfe4d0d29aba2fd093a
Author: ltz150 <ltz150@163.com>
Date: Sun Oct 28 16:35:20 2018 +0800
版本1
git reset --hard HEAD^ 恢復(fù)到上一個(gè)版本
從最近的一個(gè)commit恢復(fù)
上一個(gè)版本就是HEAD果复,上上一個(gè)版本就是HEAD陈莽,當(dāng)然往上100個(gè)版本寫(xiě)100個(gè)比較容易數(shù)不過(guò)來(lái)渤昌,所以寫(xiě)成HEAD~100git reset --hard 9b378(版本號(hào)前幾位) 恢復(fù)到指定版本
版本號(hào)沒(méi)必要寫(xiě)全,前幾位就可以了走搁,Git會(huì)自動(dòng)去找独柑。當(dāng)然也不能只寫(xiě)前一兩位,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào)私植,就無(wú)法確定是哪一個(gè)了忌栅。git reset HEAD <file>
可以把暫存區(qū)的修改撤銷(xiāo)掉(unstage),重新放回工作區(qū)
用HEAD時(shí)曲稼,表示最新的版本git reflog
記錄你的每一次歷史命令
Git跟蹤并管理的是修改索绪,而非文件
- git checkout --文件名
把文件在工作區(qū)的修改全部撤銷(xiāo),這里有兩種情況:
一種是文件自修改后還沒(méi)有被放到暫存區(qū)贫悄,現(xiàn)在瑞驱,撤銷(xiāo)修改就回到和版本庫(kù)一模一樣的狀態(tài);
一種是文件已經(jīng)添加到暫存區(qū)后窄坦,又作了修改唤反,現(xiàn)在,撤銷(xiāo)修改就回到添加到暫存區(qū)后的狀態(tài)鸭津。
總之彤侍,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)。
git rm 文件名
刪除版本庫(kù)里面的文件逆趋,git checkout -- 文件名盏阶,把版本庫(kù) 的文件恢復(fù)到工作區(qū)git remote add origin git@github.com:id/倉(cāng)庫(kù)名.git
把一個(gè)已有的本地倉(cāng)庫(kù)與github關(guān)聯(lián)git push
把當(dāng)前分支推送git clone github地址
從地址克隆倉(cāng)庫(kù)
master和其他分支名字 才是指向提交的,闻书,HEAD指向的就是當(dāng)前分支
- git checkout -b 分支名字
命令加上-b參數(shù)表示創(chuàng)建并切換名斟,相當(dāng)于以下兩條命令:
git branch 分支名 #創(chuàng)建分支
git checkout 分支名 #切換分支 - git branch
命令會(huì)列出所有分支吴汪,當(dāng)前分支前面會(huì)標(biāo)一個(gè)*號(hào)。
li.tianzeng@litianzeng MINGW64 /f/git (master)
$ git checkout -b fenzhi
Switched to a new branch 'fenzhi'
li.tianzeng@litianzeng MINGW64 /f/git (fenzhi)
$ git branch
* fenzhi
master
- git checkout master # 切換到主分支
- git merge命令用于合并指定分支到當(dāng)前分支
當(dāng)前在master上蒸眠,指定fenzhi合并到mastershang
li.tianzeng@litianzeng MINGW64 /f/git (fenzhi)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
li.tianzeng@litianzeng MINGW64 /f/git (master)
$ git merge fenzhi
Updating a8baa73..49f9e1b
Fast-forward
number.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
- git branch -d fenzhi
git branch -D <name>強(qiáng)行刪除漾橙。
刪除fenzhi,建議合并后刪除
當(dāng)Git無(wú)法自動(dòng)合并分支時(shí)楞卡,就必須首先解決沖突霜运。解決沖突后,再提交蒋腮,合并完成淘捡。
解決沖突就是把Git合并失敗的文件手動(dòng)編輯為我們希望的內(nèi)容,再提交池摧。
用git log --graph命令可以看到分支合并圖焦除。
分支策略
- master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來(lái)發(fā)布新版本作彤,平時(shí)不能在上面干活
- 干活都在dev分支上膘魄,也就是說(shuō),dev分支是不穩(wěn)定的
- 每個(gè)人都有自己的分支竭讳,時(shí)不時(shí)地往dev分支上合并就可以了
- 合并分支時(shí)创葡,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支绢慢,能看出來(lái)曾經(jīng)做過(guò)合并灿渴,而fast forward合并就看不出來(lái)曾經(jīng)做過(guò)合并
git stash
把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來(lái),等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作git stash list
顯示保存的工作是現(xiàn)場(chǎng)-
恢復(fù)現(xiàn)場(chǎng)3種方式
- git stash apply恢復(fù)胰舆,但是恢復(fù)后骚露,stash內(nèi)容并不刪除
- git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了
git remote
git remote -v顯示更詳細(xì)的信息
要查看遠(yuǎn)程庫(kù)的信息 ,遠(yuǎn)程倉(cāng)庫(kù)的默認(rèn)名稱是origin
推送分支
- git push origin master
git push origin dev
- master分支是主分支缚窿,因此要時(shí)刻與遠(yuǎn)程同步棘幸;
- dev分支是開(kāi)發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作滨攻,所以也需要與遠(yuǎn)程同步够话;
- bug分支只用于在本地修復(fù)bug,就沒(méi)必要推到遠(yuǎn)程了光绕,除非老板要看看你每周到底修復(fù)了幾個(gè)bug女嘲;
- feature分支是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開(kāi)發(fā)诞帐。
git checkout -b dev origin/dev
創(chuàng)建遠(yuǎn)程origin的dev分支到本地,這個(gè)命令創(chuàng)建本地dev分支.git branch --set-upstream-to=origin/dev dev
本地dev分支與遠(yuǎn)程origin/dev分支的鏈接欣尼,根據(jù)提示,設(shè)置dev和origin/dev的鏈接git rebase
rebase操作可以把本地未push的分叉提交歷史整理成直線;
rebase的目的是使得我們?cè)诓榭礆v史提交的變化時(shí)更容易愕鼓,因?yàn)榉植娴奶峤恍枰綄?duì)比钙态。
標(biāo)簽tag
git tag <tagname>用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD菇晃,也可以指定一個(gè)commit id册倒;
git tag -a <tagname> -m "blablabla..."可以指定標(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)簽崇呵。