Git 入門詳解

Git

git核心概念詳解

什麼是git

git是一個分佈式版本控制軟件,最初由林納斯·託瓦茲創做,於2005年以GPL發佈。最初目的是爲更好地管理Linux內核開發而設計。應注意的是,這與GNU Interactive Tools(一個相似Norton Commander界面的文件管理器)有所不一樣。git最初的開發動力來自於BitKeeper和Monotone。git最初只是做爲一個能夠被其餘前端(好比Cogito或Stgit)包裝的後端而開發的,但後來git內核已經成熟到能夠獨立地用做版本控制。不少著名的軟件都使用git進行版本控制,其中包括Linux內核、X.Org服務器和OLPC內核等項目的開發流程。前端

版本控制系統

Git 是目前世界上最優秀的分佈式版本控制系統。版本控制系統是可以隨着時間的推動記錄一系列文件的變化以便於你之後想要的退回到某個版本的系統。版本控制系統分爲三大類:本地版本控制系統,集中式版本控制系統和分佈式版本控制系統git

本地版本控制(Local Version Control Systems)是將文件的各個版本以必定的數據格式存儲在本地的磁盤(有的VCS 是保存文件的變化補丁,即在文件內容變化時計算出差量保存起來),這種方式在必定程度上解決了手動複製粘貼的問題,但沒法解決多人協做的問題。數據庫

集中式版本控制(Centralized Version Control Systems)相比本地版本控制沒有什麼本質的變化,只是多了個一箇中央服務器,各個版本的數據庫存儲在中央服務器,管理員能夠控制開發人員的權限,而開發人員也能夠從中央服務器拉取數據。集中式版本控制雖然解決了團隊協做問題,但缺點也很明顯:全部數據存儲在中央服務器,服務器一旦宕機或者磁盤損壞,會形成不可估量的損失。後端

分佈式版本控制( Distributed Version Control System)與前二者均不一樣。首先,在分佈式版本控制系統中,像 Git,Mercurial,Bazaar 以及 Darcs 等,系統保存的的不是文件變化的差量,而是文件的快照,即把文件的總體複製下來保存,而不關心具體的變化內容。其次,最重要的是分佈式版本控制系統是分佈式的,當你從中央服務器拷貝下來代碼時,你拷貝的是一個完整的版本庫,包括歷史紀錄,提交記錄等,這樣即便某一臺機器宕機也能找到文件的完整備份。緩存

Git 工做區、暫存區、版本庫之間的關係

工做區(WorkingDirectory)服務器

工做目錄是對項目的某個版本獨立提取出來的內容。 這些從 Git 倉庫的壓縮數據庫中提取出來的文件,放在磁盤 上供你使用或修改。app

暫存區(StagingArea)分佈式

暫存區域是一個文件,保存了下次將提交的文件列表信息,通常在 Git 倉庫目錄中。 有時候也被稱做`‘索 引’',不過通常說法仍是叫暫存區域。測試

版本庫(Repository)fetch

Git 倉庫目錄是 Git 用來保存項目的元數據和對象數據庫的地方。 這是 Git 中最重要的部分,從其它計算機克隆 倉庫時,拷貝的就是這裏的數據。

Git 工做流程

1.在工做目錄中修改文件。
2.暫存文件,將文件的快照放入暫存區域。 3.提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。

若是 Git 目錄中保存着的特定版本文件,就屬於已提交狀態。 若是做了修改並已放入暫存區域,就屬於已暫存狀 態。 若是自上次取出後,做了修改但尚未放到暫存區域,就是已修改狀態。 在Git 基礎一章,你會進一步瞭解 這些狀態的細節,並學會如何根據文件狀態實施後續操做,以及怎樣跳過暫存直接提交。

Git 經常使用命令詳解

1.Git文件操做

$ git help [command]                  # 顯示command的help
$ git show [$id]                      # 顯示某次提交的內容 
$ git checkout  [file]                # 拋棄工做區修改
$ git checkout .                      # 拋棄工做區修改
$ git add [file]                      # 將工做文件修改提交到本地暫存區
$ git add .                           # 將全部修改過的工做文件提交暫存區
$ git reset [file]                    # 從暫存區恢復到工做文件
$ git reset -- .                      # 從暫存區恢復到工做文件
$ git reset --mixed HEAD~1            # 修改版本庫,修改暫存區,保留工做區
$ git reset --soft HEAD~2             # 修改版本庫,保留暫存區,保留工做區
$ git reset --hard HEAD~3             # 修改版本庫,修改暫存區,修改工做區
$ git commit --amend                  # 修改最後一次提交記錄
$ git revert [$id]                    # 恢復某次提交的狀態,恢復動做自己也建立次提交對象
$ git revert HEAD                     # 恢復最後一次提交的狀態
$ git status                          # 查看當前工做區狀態 
$ git config --list                   # 看全部用戶
$ git ls-files                        # 查看已經被提交的文件
$ git commit -a                       # 提交當前repos的全部的改變
$ git commit -v                       # 參數-v能夠查看看commit的差別
$ git commit -m "message"             # 提交到本地並添加提交信息
$ git commit -am "init"               # 添加並提交 

$ git log 的經常使用選項 

-p 按補丁格式顯示每一個更新之間的差別。 
--stat 顯示每次更新的文件修改統計信息。 
--shortstat 只顯示 --stat 中最後的行數修改添加移除統計。 
--name-only 僅在提交信息後顯示已修改的文件清單。 
--name-status 顯示新增、修改、刪除的文件清單。 
--abbrev-commit 僅顯示 SHA-1 的前幾個字符,而非全部的 40 個字符。 
--relative-date 使用較短的相對時間顯示(好比,「2 weeks ago」)。 
--graph 顯示 ASCII 圖形表示的分支合併歷史。 
--pretty 使用其餘格式顯示歷史提交

$ git rm --cached [file]              # 從暫存區中刪除文件
$ git rm -f [file]                    # 強行移除版本控制的文件
$ git rm -r --cached [file]           # 遞歸刪除-r,是文件夾的時候有用

$ git diff [file]                     # 比較當前文件和暫存區文件差別
$ git diff [$id] [$id]                # 比較兩次提交之間的差別
$ git diff [branch1]..[branch2]       # 在兩個分支之間比較
$ git diff --staged                   # 比較暫存區和版本庫差別
$ git diff --cached                   # 比較暫存區和工做區差別
$ git diff --stat                     # 僅僅比較統計信息

$ git stash                           # 暫存當前正在進行的工做
$ git stash push                      # 將暫存給push到一個臨時空間中
$ git stash list                      # 查看全部緩存的代碼
$ git stash clear                     # 清空緩存區內容
$ git stash drop                      # 移除某個貯藏
$ git stash save                      # 指定message
$ git stash show                      # 查看指定stash的diff
$ git stash apply stash@{1}           # 取出指定的緩存代碼
$ git stash pop                       # 將文件從臨時空間pop下來
$ git fetch origin dev:dev            # 獲取最新版本到本地不會自動merge
$ git pull origin master:master       # 獲取最新版本到本地會自動merge

Git分支操做相關命令

$ git branch                          # 查看分支
$ git branch [dev] [master]           # 在master建立dev分支
$ git branch -v                       # 查看各個分支最後提交信息
$ git branch -r                       # 查看遠程分支信息
$ git branch -a                       # 查看全部分支信息
$ git branch -m [aaa] [bbb]           # 將aaa 重命名爲bbb
$ git branch [name]                   # 從當前分支建立分支
$ git branch -d [branch]              # 刪除某個分支
$ git branch -D [branch]              # 強制刪除某個分支
$ git branch --set-upstream-to origin/test master # 本地分支和遠程分支關聯
$ git branch --set-upstream-to=origin/master help #
$ git branch --merged                 # 查看已經被合併到當前分支的分支
$ git branch --no-merged              # 查看還沒有被合併到當前分支的分支

$ git commit [$id] -b [new_branch]    # 從歷史提交記錄建立分支
$ git commit [$id]                    # 從歷史提交記錄checkout出來,但無分支信息,切換到其餘分支會自動刪除
$ git checkout [name]                 # 切換分支
$ git checkout --track origin/dev     # 切換到遠程dev分支
$ git checkout -b [name]              # 從當前分支新建並切換到name
$ git checkout -b [new_br] [br]       # 基於branch建立新的new_branch
$ git merge origin/dev                # 將分支dev與當前分支進行合併
$ git merge [branch]                  # 將branch分支合併到當前分支
$ git merge origin/master --no-ff     # 不要Fast-Foward合併,這樣能夠生成merge提交
$ git rebase master [branch]          # 將master rebase到branch,至關於: git clone [branch] && git rebase master && git clone master && git merge [branch]

Git遠程分支管理

$ git pull                              # 抓取遠程倉庫全部分支更新併合併到本地
$ git pull --no-ff                      # 抓取遠程倉庫全部分支更新併合併到本地,不要快進合併
$ git fetch origin                      # 抓取遠程倉庫更新
$ git merge origin/master               # 將遠程主分支合併到本地當前分支
$ git clone --track origin/branch       # 跟蹤某個遠程分支建立相應的本地分支
$ git clone -b [l_b] origin/[r_b]       # 基於遠程分支建立本地分支,功能同上
$ git push                              # push全部分支
$ git push origin master                # 將本地指定分支推到遠程主分支
$ git push -u origin master             # 將本地主分支推到遠程(如無遠程主分支則建立,用於初始化遠程倉庫)
$ git clone [git@xxx.git]               # 克隆遠程倉庫
$ git remote -v                         # 查看遠程服務器地址和倉庫名稱
$ git remote show [name]                # 查看遠程服務器倉庫狀態
$ git remote add [name] [url]           # 添加遠程倉庫地址
$ git remote rm [repository]            # 刪除遠程倉庫
$ git remote set-url --push [name] [newUrl]# 修改遠程倉庫
$ git pull [rName] [lName]              # 拉取遠程分支
$ git push [rName] [lName]              # 推送遠程分支
$ git push origin [lname]:[rname]       # 本地分支push到遠程
$ git push origin -d [name]             # 刪除遠程分支-d也能夠用--delete
$ git remote set-head origin master     # 設置遠程倉庫的HEAD指向master分支
$ git branch --set-upstream master origin/master

Git版本回退操做相關命令

HEAD :當前版本
HEAD^ :上一個版本
$ git log                               # 查看commit的信息
$ git log --pretty=oneline              # 單行展現歷史記錄
$ git log --oneline                     # 單行簡單展現
$ git reflog                            # 查看命令歷史記錄 
$ git checkout .                        # 撤銷全部本地改動代碼
$ git checkout [file]                   # 撤銷全部本地改動代碼
$ git reset HEAD .                      # 撤銷全部add文件 
$ git reset HEAD [file]                 # 撤銷單個add文件
$ git reset --soft HEAD                 # 只回退commit的信息,保留修改代碼
$ git reset --hard HEAD^                # 完全回退到上次commit版本,不保留修改代碼
$ git revert                            # 之前commit的id
$ git reset --hard [branch]             # 本地代碼回退到與git遠程倉庫保持一致
--hard 參數會拋棄當前工做區的修改
--soft 參數的話會回退到以前的版本,可是保留當前工做區的修改,能夠從新提交

Git標籤操做相關命令

$ git tag                               # 查看標籤
$ git tag [name]                        # 建立版本
$ git tag -d [name]                     # 刪除版本
$ git tag -r                            # 查看遠程版本
$ git push origin [name]                # 建立遠程版本(本地版本push到遠程)
$ git push origin :refs/tags/[name]     # 刪除遠程版本
$ git pull origin --tags                # 合併遠程倉庫的tag到本地
$ git push origin --tags                # 上傳本地tag到遠程倉庫
$ git tag -a [name] -m [message]        # 建立帶註釋的tag

Git子模塊(submodule)相關操做命令

$ git submodule add [url] [path]        # 添加子模塊
$ git submodule init                    # 初始化子模塊,只在首次檢出倉庫時運行一次就行
$ git submodule update                  # 更新子模塊 每次更新或切換分支後都須要運行一下
刪除子模塊:分4步
1) $ git rm --cached [path]
2) 編輯「.gitmodules」文件,將子模塊的相關配置節點刪除掉
3) 編輯「 .git/config」文件,將子模塊的相關配置節點刪除掉
4) 手動刪除子模塊殘留的目錄

Git補丁管理

git diff ] ../sync.patch                # 生成補丁
git apply ../sync.patch                 # 打補丁
git apply --check ../sync.patch         #測試補丁可否成功

Git忽略一些文件、文件夾不提交

在倉庫根目錄下建立名稱爲「.gitignore」的文件,寫入不須要的文件夾名或文件,每一個元素佔一行便可,如

target
*.class

在工做中總結的一些常見的命令,從此還會繼續補充,若有遺漏歡迎補充。

相關文章
相關標籤/搜索