您好,登錄后才能下訂單哦!
什么是Git
Git是一種非常流行的分布式版本控制系統,它和其他版本控制系統的主要差別在于Git只關心文件數據的整體是否發生變化,而大多數版本其他系統只關心文件內容的具體差異,這類系統(CVS,Subversion,Perforce,Bazaar 等等)
每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內容
Git另一個比較好的地方在于絕大多數操作都可以在本地執行,而每個本地都可以從服務器獲取一份完整的倉庫代碼
而且在沒網時仍然可以修改和使用大部分命令,在方便時再跟服務器進行同步,這樣可以更好的實現多人聯合編程
另外個人感覺Git系統的強大在于它創建了一個個類似于快照的東西
記憶我們每一次的提交并且可以在未來的任何時候回到這里,對于大型項目的管理非常有效
最原始的版本控制是純手工的版本控制:修改文件,保存文件副本。有時候偷懶省事,保存副本時命名比較隨意
時間長了就不知道哪個是新的,哪個是老的了,即使知道新舊,可能也不知道每個版本是什么內容
相對上一版作了什么修改了,當幾個版本過去后,很可能就是下面這個老土的樣子了:
Git特點
分布式相比于集中式的最大區別在于開發者可以提交到本地
每個開發者通過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫
直接記錄快照,而非差異比較 : Git 更像是把變化的文件作快照后,記錄在一個微型的文件系統中
近乎所有操作都是本地執行 :在 Git 中的絕大多數操作都只需要訪問本地文件和資源,不用連網
時刻保持數據完整性 :在保存到 Git 之前,所有數據都要進行內容的校驗和(checksum)計算
并將此結果作為數據的唯一標識和索引
多數操作僅添加數據 :常用的 Git 操作大多僅僅是把數據添加到數據庫
開發流程示意圖:
1、基本概念
Stage:暫存區,緩存區
Repository:倉庫(本地倉庫).git目錄
Remote:遠程倉庫
Track: 將一個新文件加入到git
Unstage:取消放入暫存區
Git存儲原理
Git 保存的不是文件差異或者變化量,而只是一系列文件快照。
快照管理:(微型文件系統,文件指紋驗證是否變化,不便的直接鏈接)
三種區域
所有數據存放在本地.git目錄,可以直接拷貝。
2、基本操作
2.1、倉庫創建
Git init
2.2、倉庫復制
Git clone url
只會復制master下來
Git clone url dir
指定文件夾
git clone https://github.com/libgit2/libgit2 mylibgit
2.3、文件管理
2.3.1、添加文件到暫存區
Git add *
Git add file
Git add dir
2.3.2、刪除文件到暫存區
Git rm
2.3.3、修改文件名(移動)到暫存區
Git mv [file-orgin] [file-rename]
2.3.4、提交暫存區到倉庫
Git commit –m “注釋”
2.3.5、撤銷修改文件
修改的文件可以在git status觀察到
如果撤銷修改
可以采用git checkout -- file的方式撤銷
撤銷所有
git checkout -- *
2.3.6 撤銷暫存區數據
2.4、分支管理
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合并某分支到當前分支:git merge <name>
默認使用fast-forward模式
可以禁用,合并時會生成一個新的commit
git merge --no-ff -m "merge " dev
刪除分支:git branch -d <name>
遠程分支下載:git checkout -b <本地分支名> origin/<遠程分支名>
合并沖突:
當merge出現沖突的時候,git會提醒
需要手動修改后進行提交
Git add
Git commit
2.5、版本管理
每個提交都是一個版本,git提供了一些方便的命令供我們使用。
2.5.1、查看日志
Git log
當前分支的commit歷史
有用的配置
log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
Git reflog
顯示引用變化歷史,相當于head變化
2.5.2、版本回退:
一個git reset --hard HEAD^
倆git reset --hard HEAD^^
多個git reset --hard HEAD~數字
回退到指定版本
git reset --hard commit_id
commitid可以從reflog或者log中查看
--hard表示丟棄暫存區的東西
--soft – 暫存區和工作目錄都不會被改變,改變都放在暫存區
--mixed – 默認選項。緩存區和你指定的提交同步,但工作目錄不受影響,改變不會放在暫存區。
--hard – 緩存區和工作目錄都同步到你指定的提交
Git revert
reset是指將當前head的內容重置,不會留任何痕跡。
revert是撤銷某一次提交,但是這次撤銷也會作為一次提交進行保存
假設當前有3個commit,git log如下:
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c
執行 git revert HEAD~1之后,會提示提交信息,提交后git log如下:
commit4: Reverts “test2.c”
commit3: test3.c
commit2: test2.c
commit1: test1.c
執行完后,test2.c被刪除了,運行git status,無任何變化。
執行 git reset HEAD~1之后,再次看git log,如下:
commit2: test2.c
commit1: test1.c
執行完后,commit3被刪除了
但是test3.c還在本地緩存區,運行git status,可以看見提示test3.c可以用git add包含該文件。
若執行git reset --soft HEAD~1,log為:
commit2: test2.c
commit1: test1.c
執行完后,test3.c也被刪除了,查看git status,提示可以commit以提交test3.c,test3.c在暫存區。
若執行git reset --hard HEAD~1,log為:
commit2: test2.c
commit1: test1.c
執行完后,test3.c也被刪除了,查看git status,無任何變化。
2.6、標簽管理
2.6.1、打標簽
相當于給某個提交取一個好記住的名字,例如v1.0.0
git tag v1.0.0 [commitid]
2.6.2、顯示所有標簽
git tag
2.6.3、顯示標簽信息
Git show tagname
2.6.4、標簽管理
命令git push origin <tagname>可以推送一個本地標簽;
命令git push origin --tags可以推送全部未推送過的本地標簽;
命令git tag -d <tagname>可以刪除一個本地標簽;
命令git push origin :refs/tags/<tagname>可以刪除一個遠程標簽。
2.7、遠程管理
一般都要和兩部分人提供
2.7.1、git clone
從遠程主機克隆一個版本庫
git clone <版本庫的網址> <本地目錄名>
2.7.2、git remote
為了便于管理,Git要求每個遠程主機都必須指定一個主機名。git remote命令就用于管理主機名。
列出所有主機:git remote
帶網址列出主機:git remote –v
clone版本庫的時候,所使用的遠程主機自動被Git命名為origin
如果想用其他的主機名,需要用git clone命令的-o選項指定。
git clone -o jQuery https://github.com/jquery/jquery.git
git remote show命令加上主機名,可以查看該主機的詳細信息。
git remote show <主機名>
git remote add命令用于添加遠程主機。
git remote add <主機名> <網址>
git remote rm命令用于刪除遠程主機。
git remote rm <主機名>
git remote rename命令用于遠程主機的改名。
git remote rename <原主機名> <新主機名>
2.7.3、git fetch
將某個遠程主機的更新,全部取回本地。
如果只想取回特定分支的更新,可以指定分支名。
git fetch <遠程主機名> <分支名>
所取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取
比如origin主機的master,就要用origin/master讀取。
git branch –r,可以用來查看遠程分支,
-a選項查看所有分支。
可以采用git checkout <遠程主機名>/ <分支名>切換到該分支
但是一般用git checkout -b newBrach <遠程主機名>/ <分支名>
意思是在<遠程主機名>/ <分支名>的基礎上,創建一個新分支。
也可以使用merge,合并遠程分支。
2.7.4、git pull
取回遠程主機某個分支的更新,再與本地的指定分支合并。
git pull <遠程主機名> <遠程分支名>:<本地分支名>
等同于先做git fetch,再做git merge
2.7.5、git push
命令用于將本地分支的更新,推送到遠程主機。
git push <遠程主機名> <本地分支名>:<遠程分支名>
省略遠程分支名,表示將本地分支推送與之存在"追蹤關系"的遠程分支(通常兩者同名)
如果該遠程分支不存在,則會被新建。省略本地分支名,則表示刪除指定的遠程分支
如果當前分支與遠程分支之間存在追蹤關系,則本地分支和遠程分支都可以省略。
如果本地版本低,那么會報錯,可以--force強制push,--tags表示也推送tags.
git push --force origin
2.7.6、將本地庫推到遠程端
git push origin master
2.8、自定義Git
2.8.1、自定義命令
可以利用git config命令來給命令取別名。
例如
git config --global alias.co csheckout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
其中,global表示針對當前用戶所有倉庫都起作用
如果不加,表示只對當前倉庫有用,每個倉庫的Git配置文件都放在.git/config文件中:
當前用戶的config存放在用戶主目錄下的一個隱藏文件.gitconfig中:
2.8.2、忽略文件
為了防止沒用的文件被提醒untracked,可以在git倉庫主目錄下添加.gitignore文件
(本身要放到版本庫里面),該文件可以配置git要忽略哪些文件,不添加到倉庫中。
如果發現不能添加文件,可以采用
git check-ignore -v file檢查被哪個規則忽略了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。