剛開始使用git的時候,總想拿git來和cvs或者svn來作對比,但不久后發(fā)現(xiàn)這個想法本身就是錯的,git完全就是另外一種物種,一種本屬于未來的物種。它的對象存儲方式,快照,分支等,都是完全不同的。
相信每個使用git的人,都想了解git內存文件的存儲對象,快照,提交在歷史和分支等內部的原理。都想知道它是否有傳說中的那么強大?
Git相比較其他版本控制系統(tǒng)最大的優(yōu)勢無異于:
1、底層文件存儲系統(tǒng)
2、分布式的特性

git基本原理
需要搞清楚以下名詞的概念
工作區(qū)(Workspace):就是你在電腦里能看到的目錄
暫存區(qū)(Index/Stage):所有變動的文件,Git 都記錄在一個區(qū)域,叫做"暫存區(qū)"
本地倉庫(Repository):本地的代碼倉庫,不用上網(wǎng),純本地管理。
遠程倉庫(Remote):線上倉庫,本地倉庫某個版本在線上的鏡像存在。
常用命令
-
初始化
git init
git remote add origin #遠程倉庫地址 -
添加文件到版本庫
git add <file>/.未暫存區(qū) >> 已暫存區(qū)
git commit -m '版本說明'已暫存區(qū) >> 本地倉庫 -
查看倉庫狀態(tài)
git status查看工作目錄中所有文件的狀態(tài)
git log命令可以顯示所有提交過的版本信息
git reflog可以查看所有分支的所有操作記錄(包括已經(jīng)被刪除的 commit 記錄和 reset 的操作) -
暫存
git stashgit stash作用的范圍包括工作區(qū)和暫存區(qū)中的內容,也就是說沒有提交的內容都會保存至堆棧中。后續(xù)可以在某個分支上恢復出堆棧中的內容。
git stash clear清空緩存
git stash pop釋放緩存到當前分支 -
撤銷
git reset --hard HEAD回退到當前版本,清空暫存區(qū)和工作區(qū)的所有修改;
git reset --hard HEAD~回退到上一個版本,清空暫存區(qū)和工作區(qū)的所有修改;
git reset --hard 1094a回退到某個指定版本,清空暫存區(qū)和工作區(qū)的所有修改;
git checkout -- <file>撤銷某文件的修改。
1.一種是自修改后還沒有被放到暫存區(qū),則回到和版本庫一樣的狀態(tài);
2.一種是已經(jīng)添加到暫存區(qū)后,又作了修改,則回到添加到暫存區(qū)后的狀態(tài)。
git checkout commid_id src/main/main.c回退某文件到指定版本,注意:/ -
提交到遠程倉庫
git push origin master -f強制執(zhí)行
git push origin master -u-u后,以后執(zhí)行可以簡化為git push -
從遠程倉庫更新本地倉庫
git pull origin master -f強制執(zhí)行 -
分支
git checkout -b dev創(chuàng)建dev分支,然后切換到dev分支。(等于下面兩步)
1、git branch dev創(chuàng)建dev分支
2、git checkout dev切換到dev分支
git branch查看所有分支
git branch -d dev刪除分支
git checkout master從當前分支切換回master分支
git merge dev把dev分支的工作成果合并到master分支上(需要處于master分支上時執(zhí)行) -
常見沖突(conficts)
場景一 (這種場景比較多)
user0有新提交
user1沒有pull -> 寫新代碼 -> pull -> 提示有沖突
解決辦法
-> stash save(把自己的代碼隱藏存起來) -> 重新pull -> stash pop(把存起來的隱藏的代碼取回來 ) -> 代碼文件會顯示沖突 -> 右鍵選擇edit conficts,解決后點擊編輯頁面的 mark as resolved -> commit&push
場景二
user0有新提交
user1沒有pull -> 寫新代碼 -> commit&push -> 提示有沖突
解決辦法
-> pull -> 代碼文件會顯示沖突 -> 右鍵選擇edit conficts,解決后點擊編輯頁面的 mark as resolved -> commit&push
圖形化軟件推薦:Source Tree
創(chuàng)建倉庫兩種方式
一、從遠程倉庫克隆到本地倉庫
- 在碼云新建一個倉庫,命名為
GitTest,里面默認生成兩個說明文件:README.en.md、README.md。 - 從遠端倉庫clone到本地,
git clone https://gitee.com/***/GitTest.git。
二、從本地倉庫Push到遠程倉庫
- 本地初始化一個項目,執(zhí)行
git init初始化。會在當前目錄中生成一個.git隱藏目錄,用于記錄代碼變化。 - 關聯(lián)遠程倉庫,
git remote add origin https://gitee.com/***/GitTest.git
設置用戶名和郵箱
git config --global user.name "你的名字或昵稱"
git config --global user.email "你的郵箱"
3、設置好用戶名和郵箱,執(zhí)行首次提交
git add .
git commit -m "第一次提交"
git push origin master
參考資料
提交第一行代碼
Git教程 - 廖雪峰的官方網(wǎng)站
只下載子文件夾代碼
git init test && cd test //新建倉庫并進入文件夾
git config core.sparsecheckout true //設置允許克隆子目錄
echo 'tt*' >> .git/info/sparse-checkout //設置要克隆的倉庫的子目錄路徑 //空格別漏
git remote add origin git@github.com:mygithub/test.git //這里換成你要克隆的項目和庫
git pull origin master //下載
git學習之git clone 克隆或下載一個倉庫單個文件夾
創(chuàng)建忽略文件.gitignore**
git base中運行vim .gitignore,創(chuàng)建.gitignore文件,可以設置哪些文件/文件夾不需要加入到倉庫。
保存文件:1、esc、2、:wq
micro-cloud/
QT客戶端/
數(shù)據(jù)庫/
文檔/
WEB前臺/.DS_Store
WEB前臺/node_modules/
WEB前臺/dist/main.index
WEB前臺/dist/static
WEB前臺/npm-debug.log*
WEB前臺/yarn-debug.log*
WEB前臺/yarn-error.log*
WEB前臺//test/unit/coverage/
WEB前臺//test/e2e/reports/
WEB前臺/selenium-debug.log
# Editor directories and files
WEB前臺/.idea
WEB前臺/.vscode
WEB前臺/*.suo
WEB前臺/*.ntvs*
WEB前臺/*.njsproj
WEB前臺/*.sln
.gitignore