初始設(shè)置
git config --global user.name "lanbin"
git config --global user.email "imlanbin@163.com"
創(chuàng)建倉庫
git init
創(chuàng)建完畢目錄會多了個.git的隱藏文件夾
版本回退
- HEAD指向的版本就是當前版本,因此耕餐,Git允許我們在版本的歷史之間穿梭斤程,使用命令git reset --hard commit_id
- 穿梭前寸癌,用git log可以查看提交歷史,以便確定要回退到哪個版本于未。
- 要重返未來撕攒,用git reflog查看命令歷史,以便確定要回到未來的哪個版本烘浦。
本地倉庫
用git add把文件添加進去抖坪,實際上就是把文件修改添加到暫存區(qū);
用git commit提交更改闷叉,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支擦俐。
用git status查看狀態(tài)
用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別
用git checkout -- readme.txt可以丟棄工作區(qū)的修改
用git reset HEAD <file> 可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)
用git rm test.txt刪掉文件握侧,并且git commit
在文件系統(tǒng)上誤操作刪除了文件蚯瞧,可以用git checkout -- test.txt還原
GIT把內(nèi)容按元數(shù)據(jù)方式存儲,而SVN是按文件方式存儲品擎,git管理的是修改而不是文件埋合;
SVN在Commit前,我們都建議是先Update一下萄传,跟本地的代碼編譯沒問題甚颂,并確保開發(fā)的功能正常后再提交,這樣其實挺麻煩的秀菱,有好幾次同事沒有先Updata西设,就Commit了,發(fā)生了一些錯誤答朋,耽誤了大家時間,Git可能這種情況會少些棠笑。
遠程倉庫
先有本地庫梦碗,后有遠程庫的時候,如何關(guān)聯(lián)遠程庫
首先登陸GitHub,然后洪规,在右上角找到“Create a new repo”按鈕印屁,創(chuàng)建一個新的倉庫
添加到遠程倉庫
git remote add origin git@github.com:lanbin/learngit.git
遠程庫的名字就是origin
- 推送到遠程倉庫
git push -u origin master
先創(chuàng)建遠程庫,然后斩例,從遠程庫克隆
- 從遠程倉庫克隆
$ git clone git@github.com:lanbin/learngit.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
Git支持多種協(xié)議雄人,包括https,但通過ssh支持的原生git協(xié)議速度最快念赶。
分支管理
HEAD指向的就是當前分支
- git checkout命令加上-b參數(shù)表示創(chuàng)建并切換
$ git checkout -b dev
Switched to a new branch 'dev'
- 用git branch命令查看當前分支
$ git branch
* dev
maste
- 切換回master分支
$ git checkout master
Switched to branch 'master'
- 把dev分支的工作成果合并到master分支上
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
- 合并完成后础钠,就可以放心地刪除dev分支了
$ git branch -d dev
Deleted branch dev (was b17d20e
Git鼓勵大量使用分支:
- 查看分支:git branch
- 創(chuàng)建分支:git branch <name>
- 切換分支:git checkout <name>
- 創(chuàng)建+切換分支:git checkout -b <name>
- 合并某分支到當前分支:git merge <name>
- 刪除分支:git branch -d <name>
沖突管理
如果存在沖突,將合并失敗并有提示
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.git status也可以告訴我們沖突的文件
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
可以直接查看readme.txt的內(nèi)容
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
- 修改后再提交叉谜,然后用帶參數(shù)的git log也可以看到分支的合并情況
$ git log --graph --pretty=oneline --abbrev-commit
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file
- 用git log --graph命令可以看到分支合并圖旗吁。
- 當Git無法自動合并分支時,就必須首先解決沖突停局。解決沖突后很钓,再提交,合并完成
- 解決沖突就是把Git合并失敗的文件手動編輯為我們希望的內(nèi)容董栽,再提交码倦。
分支管理策略
- master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本锭碳,平時不能在上面干活袁稽;
- dev分支是不穩(wěn)定的,到某個時候工禾,比如1.0版本發(fā)布時运提,再把dev分支合并到master上,在master分支發(fā)布1.0版本闻葵;
- 開發(fā)者都在dev分支上干活民泵,每個人都有自己的分支,時不時地往dev分支上合并就可以了槽畔。
所以栈妆,團隊合作的分支看起來就像這樣:
BUG分支
修復(fù)bug時,我們會通過創(chuàng)建新的bug分支進行修復(fù)厢钧,然后合并鳞尔,最后刪除;
當手頭工作沒有完成時早直,先把工作現(xiàn)場git stash寥假,然后去修復(fù)bug,修復(fù)后霞扬,再git stash pop糕韧,回到工作現(xiàn)場枫振。
- 用git stash命令把工作現(xiàn)場“儲藏”起來
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
- 用git stash list命令看看儲存清單
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
用git stash apply從儲存恢復(fù)到工作現(xiàn)場,恢復(fù)后stash內(nèi)容并不刪除
用git stash drop命令來刪除儲存
git stash pop = git stash apply + git stash drop
feature分支
- 開發(fā)一個新實驗功能萤彩,最好新建一個分支粪滤;
- 如果要丟棄一個沒有被合并過的分支,可以通過git branch -D <name>強行刪除雀扶;
推送分支
查看遠程庫信息杖小,使用git remote -v;
本地新建的分支如果不推送到遠程愚墓,對其他人就是不可見的予权;
從本地推送分支,使用git push origin branch-name转绷,如果推送失敗伟件,先用git pull抓取遠程的新提交;
在本地創(chuàng)建和遠程分支對應(yīng)的分支议经,使用git checkout -b branch-name origin/branch-name斧账,本地和遠程分支的名稱最好一致;
建立本地分支和遠程分支的關(guān)聯(lián)煞肾,使用git branch --set-upstream branch-name origin/branch-name咧织;
從遠程抓取分支,使用git pull籍救,如果有沖突习绢,要先處理沖突。
哪些分支需要推送蝙昙,哪些不需要呢闪萄?
- master分支是主分支,因此要時刻與遠程同步奇颠;
- dev分支是開發(fā)分支败去,團隊所有成員都需要在上面工作,所以也需要與遠程同步烈拒;
- bug分支只用于在本地修復(fù)bug圆裕,就沒必要推到遠程了,除非老板要看看你每周到底修復(fù)了幾個bug荆几;
- feature分支是否推到遠程吓妆,取決于你是否和你的小伙伴合作在上面開發(fā)。
合并分支
在rebase的過程中吨铸,也許會出現(xiàn)沖突(conflict). 在這種情況行拢,Git會停止rebase并會讓你去解決 沖突;在解決完沖突后诞吱,用"git-add"命令去更新這些內(nèi)容的索引(index), 然后剂陡,你無需執(zhí)行 git-commit,只要執(zhí)行:
$ git rebase --continue
這樣git會繼續(xù)應(yīng)用(apply)余下的補丁狈涮。
在任何時候,你可以用--abort參數(shù)來終止rebase的行動鸭栖,并且"mywork" 分支會回到rebase開始前的狀態(tài)
$ git rebase --abort
標簽管理
- 命令git tag <tagname>用于新建一個標簽,默認為HEAD握巢,也可以指定一個commit id晕鹊;
- 命令git tag -a <tagname> -m "blablabla..."可以指定標簽信息;
- 命令git tag可以查看所有標簽暴浦。
- 命令git show <tagname>查看標簽信息
- 命令git push origin <tagname>可以推送一個本地標簽溅话;
- 命令git push origin --tags可以推送全部未推送過的本地標簽;
- 命令git tag -d <tagname>可以刪除一個本地標簽歌焦;
- 命令git push origin :refs/tags/<tagname>可以刪除一個遠程標簽飞几。
使用github
- 在GitHub上,可以任意Fork開源倉庫
eg. https://github.com/twbs/bootstrap - 自己擁有Fork后的倉庫的讀寫權(quán)限独撇;
點“Fork”就在自己的賬號下克隆了一個bootstrap倉庫屑墨,然后從自己的賬號下clone
git clone git@github.com:lanbin/bootstrap.git
- 可以推送pull request給官方倉庫來貢獻代碼。
對方是否接受你的pull request就不一定了
使用碼云gitee
自定義Git
忽略特殊文件
- 忽略某些文件時纷铣,需要編寫.gitignore卵史;
- .gitignore文件本身要放到版本庫里,并且可以對.gitignore做版本管理