Git教程--廖雪峰的官方網(wǎng)站
克隆一個(gè)倉(cāng)庫(kù)本質(zhì)上就是僅僅從別的地方復(fù)制一份 .git 目錄朴沿。
“Untracked files” ?
“Changes to be committed”在暫存區(qū)域生成了快照,等待被提交败砂。
“Changes not staged for commit” 表明文件已經(jīng)修改赌渣,但是還沒(méi)有放入暫存區(qū)域,也就是沒(méi)生成快照昌犹。如果現(xiàn)在進(jìn)行commit操作坚芜,只是將修改之前的文件快照提交到了git目錄。
一定記仔崩选:只有暫存區(qū)域的文件(即:文件狀態(tài)為“Changes to be committed”)才會(huì)被提交鸿竖。
前面講了我們把文件往Git版本庫(kù)里添加的時(shí)候,是分兩步執(zhí)行的:
第一步是用git add把文件添加進(jìn)去疾渴,實(shí)際上就是把文件修改添加到暫存區(qū)千贯;
第二步是用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支搞坝。
git init? ? git add readme.txt ? ? ?git commit -m "wrote a readme file"
初始化一個(gè)Git倉(cāng)庫(kù)搔谴,使用git init命令。
添加文件到Git倉(cāng)庫(kù)桩撮,分兩步:
第一步敦第,使用命令git add 峰弹,注意,可反復(fù)多次使用芜果,添加多個(gè)文件鞠呈;
第二步,使用命令git commit右钾,完成蚁吝。
要隨時(shí)掌握工作區(qū)的狀態(tài),使用git status命令舀射。
如果git status告訴你有文件被修改過(guò)窘茁,用git diff可以查看修改內(nèi)容。
git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫(kù)里面最新版本的區(qū)別脆烟。
HEAD指向的版本就是當(dāng)前版本山林,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭邢羔,使用命令git reset --hard commit_id驼抹。
穿梭前,用git log可以查看提交歷史拜鹤,以便確定要回退到哪個(gè)版本框冀。
要重返未來(lái),用git reflog查看命令歷史署惯,以便確定要回到未來(lái)的哪個(gè)版本左驾。
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區(qū)的修改全部撤銷极谊,這里有兩種情況:
一種是readme.txt自修改后還沒(méi)有被放到暫存區(qū)诡右,現(xiàn)在彻秆,撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài)摸屠;
一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改播掷,現(xiàn)在咙边,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)猜煮。
總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)败许。
git checkout -- file命令中的--很重要王带,沒(méi)有--,就變成了“切換到另一個(gè)分支”的命令市殷,我們?cè)诤竺娴姆种Ч芾碇袝?huì)再次遇到git checkout命令愕撰。
先有本地庫(kù),后有遠(yuǎn)程庫(kù)的時(shí)候,如何關(guān)聯(lián)遠(yuǎn)程庫(kù)搞挣。
要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫(kù)带迟,使用命令git remote add origin git@server-name:path/repo-name.git;
關(guān)聯(lián)后囱桨,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容仓犬;
此后,每次本地提交后舍肠,只要有必要搀继,就可以使用命令git push origin master推送最新修改;
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫(kù)的存在貌夕,也就是有沒(méi)有聯(lián)網(wǎng)都可以正常工作律歼,而SVN在沒(méi)有聯(lián)網(wǎng)的時(shí)候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時(shí)候啡专,再把本地提交推送一下就完成了同步,真是太方便了制圈!
先創(chuàng)建遠(yuǎn)程庫(kù)们童,然后,從遠(yuǎn)程庫(kù)克隆鲸鹦。
git clone git@github.com:michaelliao/gitskills.git
Git鼓勵(lì)大量使用分支:
查看分支:git branch
創(chuàng)建分支:git branch
切換分支:git checkout
創(chuàng)建+切換分支:git checkout -b
合并某分支到當(dāng)前分支:git merge
刪除分支:git branch -d
用git log --graph命令可以看到分支合并圖慧库。
通常,合并分支時(shí)馋嗜,如果可能齐板,Git會(huì)用Fast forward模式,但這種模式下葛菇,刪除分支后甘磨,會(huì)丟掉分支信息。如果要強(qiáng)制禁用Fast forward模式眯停,Git就會(huì)在merge時(shí)生成一個(gè)新的commit济舆,這樣,從分支歷史上就可以看出分支信息莺债。
git merge --no-ff -m?"merge with no-ff" dev
Git還提供了一個(gè)stash功能滋觉,可以把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來(lái),等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作齐邦。當(dāng)手頭工作沒(méi)有完成時(shí)椎侠,先把工作現(xiàn)場(chǎng)git stash一下,然后去修復(fù)bug措拇,修復(fù)后我纪,再git stash pop,回到工作現(xiàn)場(chǎng)。你可以多次stash宣羊,恢復(fù)的時(shí)候璧诵,先用git stash list查看,然后恢復(fù)指定的stash仇冯。
查看遠(yuǎn)程庫(kù)信息之宿,使用git remote -v;
本地新建的分支如果不推送到遠(yuǎn)程苛坚,對(duì)其他人就是不可見(jiàn)的比被;
從本地推送分支,使用git push origin branch-name泼舱,如果推送失敗等缀,先用git pull抓取遠(yuǎn)程的新提交;
在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支娇昙,使用git checkout -b branch-name origin/branch-name尺迂,本地和遠(yuǎn)程分支的名稱最好一致;
建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)冒掌,使用git branch --set-upstream branch-name origin/branch-name噪裕;
從遠(yuǎn)程抓取分支,使用git pull股毫,如果有沖突膳音,要先處理沖突。