前言: 最近在實(shí)習(xí),寫文章的頻率下來了很多,開幾篇文章寫寫在實(shí)習(xí)中學(xué)到的東西吧。
一、Git的使用
git的主要功能
版本控制:想要記錄歷史版本以備可能會(huì)需要回溯到某個(gè)版本的可能,避免手動(dòng)為每一個(gè)歷史版本做一個(gè)副本,git會(huì)幫助你記錄歷史版本。
合作開發(fā):可以同時(shí)多個(gè)人分別自己開發(fā),最后能合到一起。
分布式?:每個(gè)人都有完整的版本庫,同時(shí)開發(fā)的人可以互相推送分支然后合并成新版本(實(shí)際似乎不是這樣)。
git的基本概念
git倉庫
開始使用git需要在要管理的目錄下初始化一個(gè)git倉庫。
git init #初始化git倉庫
會(huì)在當(dāng)前目錄下自動(dòng)生成.git文件夾(里面的內(nèi)容以后在了解),記錄歷史版本、提交、分支、用戶配置等。
工作區(qū)、暫存區(qū)和版本庫
工作區(qū):正在修改的,尚未加入暫存區(qū)的文件在工作區(qū)。
暫存區(qū):準(zhǔn)備提交到版本庫的文件存在暫存區(qū)。
版本庫:當(dāng)所有工作區(qū)的修改都進(jìn)入暫存區(qū),commit提交后成為一個(gè)版本。
git add foo #將文件foo加入暫存區(qū)git status #查看工作目錄狀態(tài)git commit -m "desc" #將暫存區(qū)文件提交并附上描述
有了上面三個(gè)概念就有了版本控制。
工作區(qū)的修改可以從暫存區(qū)或版本庫中的記錄恢復(fù),也可以加入暫存區(qū)。
git checkout -- foo #將工作區(qū)的foo修改作廢,恢復(fù)至?xí)捍鎱^(qū)或版本庫中的版本
暫存區(qū)的文件可以恢復(fù)到工作區(qū)也可以回退成版本庫中的版本。
git reset HEAD foo #將HEAD指針?biāo)赶虬姹編熘械膄oo文件恢復(fù)到暫存區(qū)。該操作影響暫存區(qū),不影響工作區(qū)內(nèi)容。
也可以使工作區(qū)回到指定版本。
git reset --hard HEAD^ #工作區(qū)恢復(fù)到HEAD的前一個(gè)提交,工作區(qū)的修改全部丟失。
分支
在一個(gè)commit之后像樹分叉一樣兩個(gè)分支獨(dú)立生長(zhǎng)。 開發(fā)者可以擁有自己的工作分支,隨時(shí)提交到自己的分支而不影響主分支。開發(fā)完成后再進(jìn)行合并,解決沖突(如果你的分支和主分支上同時(shí)修改了相同的文件)后,主分支上也有你的工作了。
以下流水賬。
基本操作
創(chuàng)建版本庫
** git init ** git add some.file $ git commit -m "description"
版本回退
** git status ** git reflog $ git reset --hard commit_id
撤銷修改
從工作區(qū)撤銷修改
$ git checkout -- filename
可以撤銷工作區(qū)文件的修改,回退到暫存區(qū),如果未進(jìn)入暫存區(qū),則回退到版本庫。如果被追蹤的文件被刪除同樣可以找回。
從暫存區(qū)撤銷修改
$ git reset HEAD filename
所有撤銷修改僅限于影響被追蹤的文件
刪除文件
讓git不再記錄文件,使用
$ git rm filename
文件將從版本庫中刪除。
遠(yuǎn)程倉庫
關(guān)聯(lián)遠(yuǎn)程倉庫和從遠(yuǎn)程克隆
** git remote add origin git@server-name:path/repo-name.git ** git clone git@github.com:foo/bar.git
分支管理
一個(gè)分支是一串提交串成的時(shí)間線。分支可以從某個(gè)點(diǎn)分化成不同分支各自發(fā)展。不同的分支間可以合并。
創(chuàng)建、切換與合并
** git branch name ** git checkout name ** git checkout -b name ** git merge name $ git branch -d name
merge分支可能會(huì)產(chǎn)生沖突,需手動(dòng)解決。
更重要的是生產(chǎn)環(huán)境中一般不允許merge,而是提交pull request。
問題:fast-forward模式是如何丟失分支信息的
保存現(xiàn)場(chǎng)
$ git stash
可以將工作區(qū)和暫存區(qū)的修改保存起來,此時(shí)可以切換分支進(jìn)行開發(fā)。切換回來想恢復(fù)現(xiàn)場(chǎng),則使用
$ git pop
更多stash
** git stash list ** git stash apply $ git stash drop
feature分支
通常在開發(fā)新特性時(shí)都會(huì)用到。命名以feature開頭。強(qiáng)制刪除分支的命令是
$ git branch -D name
fork 和 pull request
GitHub類網(wǎng)站的一個(gè)功能。想向別人的項(xiàng)目提交代碼卻沒有權(quán)限,可以先fork別人的代碼,自己修改并提交,然后向項(xiàng)目管理者發(fā)起pull request,申請(qǐng)把你的代碼合并到他的分支里。
生產(chǎn)過程中也需要用pull request而不是merge來提交代碼。
自定義git
顏色、name和email
** git config --global color.ui true ** git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
.gitignore
忽略掉不想track的文件如密碼配置等,使其不在git status時(shí)提示。GitHub上推薦的各種工程.gitignore文件
規(guī)則
新加入的規(guī)則不會(huì)忽視已經(jīng)track的文件,status仍會(huì)提示,此時(shí)應(yīng)untrack這些文件。
** git rm -r --cached . ** git add . $ git commit -m 'update .gitignore'
設(shè)置別名
設(shè)置alias可以讓使用更方便。
** git config --global alias.co checkout ** git config --global alias.ci commit $ git config --global alias.br branch
那如何取消設(shè)置呢
config文件
倉庫的配置
每個(gè)倉庫的.git/config
用戶的配置
~/.gitconfig
問題
git是支持分布式的,但現(xiàn)實(shí)中似乎還是使用了一個(gè)中心服務(wù)器。開發(fā)時(shí)先pull下來再開新分支開發(fā)然后push,所以比SVN好在哪。(commit是本地的,push和pull時(shí)需要網(wǎng)絡(luò);SVN可以修改文件但沒網(wǎng)不能提交)
為什么要有暫存區(qū),如果只是好看可以修改完然后提交所有。
分支好難說。
merge的fast-forward方式和noff方式對(duì)分支合并前后的影響。
.git文件夾下的內(nèi)容。
二、zsh+iterm2 中Git快捷鍵


