git(一) 基础必备
git是開源的分布式文件管理系統
為什么說是分布式呢?簡單來說就是除了集中式版本庫,在各個開發本地也保存一份版本庫。
這樣帶來了很多的優點,近乎所有操作都是本地執行,因此速度相當的快,也可以在離線時進行操作。
在Git的基礎上衍生出GitHub和GitLab這兩個非常流行的代碼托管平臺,很多公司包括阿里云、去哪兒、攜程等都在GitLab平臺的基礎上做自己的二次開發。
https://git-scm.com/book/zh/v2為pro git的中文地址,講解的非常好。
http://gitready.com/也是一個不錯的git網站,針對常用場景寫了很多短小但很優秀的博客。
Git的存儲方式
? ? ? ?Git 更像是把數據看作是對小型文件系統的一系列快照。 在 Git 中,每當你提交更新或保存項目狀態時,它基本上就會對當時的全部文件創建一個快照并保存這個快照的索引。 為了效率,如果文件沒有修改,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。 Git 對待數據更像是一個 快照流。
? ? ? ?每次提交,會生成一個commit對象指向一個tree對象(提交時所有文件的一個快照);tree按文件夾的結構來排列,每個文件夾又是一個tree,每個文件指向一個blob對象。注意blob對象和文件并不完全等價,Git認為即使文件名不同只要文件內容相同就是同一個blob,這樣節省了存儲空間。
? ? ? ?Git 中所有的數據在存儲前都計算校驗和,即 SHA-1 散列(hash,哈希), 這是一個由 40 個十六進制字符(0-9 和 a-f)組成的字符串,基于 Git 中文件的內容或目錄結構計算出來,然后以校驗和來引用。 這意味著不可能在 Git 不知情時更改任何文件內容或目錄內容。
git配置
git安裝方式
git --version 查看版本
git config --global user.name yushengjun 設置全局用戶名
git config --global user.email xxx@163.com 設置全局郵箱
git config --global --list 查看global下git的所有配置
git config --global color.ui auto 讓命令更具可讀性
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin" 設置git的默認文本編輯器,這個還是挺有用的,畢竟命令行的編輯不好用
git常用操作
圖中index是按照git的術語稱為索引,但是一般還是叫暫存區,staging,用來存儲下次要commit的文件。
1. 獲取或創建git倉庫
- 在本地目錄初始化 Git 倉庫
git init把已有的項目代碼納入Git管理。git init your_project 會在當前路徑下創建和項目名稱同名的文件夾 - 從其它服務器克隆已存在的倉庫
git clone https://github.com/libgit2/libgit2 http、https、ssh都是使用的智能協議。
2.提交
git add readme.txt git commit readme.txt -m '提交readme文件' git status git status -sgit add 這是個多功能命令:可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區,還能用于合并時把有沖突的文件標記為已解決狀態等。 將這個命令理解為“精確地將內容添加到下一次提交中”而不是“將一個文件添加到項目中”要更加合適。
git status 用來查看文件的狀態。
在 Changes not staged for commit 這行下面,說明已跟蹤文件的內容發生了變化,但還沒有放到暫存區;
在 Changes to be committed 這行下面的,就說明是已暫存狀態,還沒提交到本地倉庫
Untracked files 下面是沒有被跟蹤的文件。
使用 git status -s 命令,你將得到一種格式更為緊湊的輸出, 輸出中有兩欄,左欄指明了暫存區的狀態,右欄指明了工作區的狀態。
3.比較工作區、暫存區、本地倉庫之間的差異
git diff 是比較工作區和暫存區之間的差異,亦可以比較要指定的文件
git diff --cached 比較暫存區和本地倉庫之間的差異(因此文件必須先加到暫存區)
git diff temp master -- 1.txt 比較1.txt這個文件temp分支和master分支最新一次提交之間的差異。其實這里分支也指向提交,所以我們也可以比較不同commit之間的差異(換成commit的唯一標識值即可)。
git diff HEAD HEAD~2 -- 1.txt 比較1.txt和前兩次提交時的不同
4.移除文件
刪除文件git rm ,然后提交即可。 如果要刪除之前修改過或已經放到暫存區的文件,則必須使用強制刪除選項 -f
當你忘記添加 .gitignore 文件,不小心把一個很大的日志文件添加到暫存區時
git rm --cached README把文件從 Git 倉庫中刪除(也從暫存區域移除),但仍然保留在當前工作目錄中
git mv file_from file_to 重命名文件
5.查看提交日志
git log 查看本地提交歷史
git log --oneline --all -n4 --graph --decorate oneline簡略顯示提交歷史,all查看所有分支 ,n4最近4次的提交歷史 graph 圖形化查看
gitk 打開圖形化工具,推薦使用sourceTree或idea自帶的
git log -S function_name 可以顯示那些添加或刪除了該方法的提交。
git log -p file 可以查看指定文件每次提交前后的修改內容。還可以指定目錄查看指定目錄下的提交歷史
git log其實提供了非常豐富的日志查詢參數,一下是記不住的,用到時積極查閱,才能得心應手。
下面是要在 Git 源碼庫中查看 Junio Hamano 在 2008 年 10 月其間, 除了合并提交之外的哪一個提交修改了測試文件,可以使用下面的命令:
$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \--before="2008-11-01" --no-merges -- t/ 5610e3b - Fix testcase failure when extended attributes are in use acd3b9e - Enhance hold_lock_file_for_{update,append}() API f563754 - demonstrate breakage of detached checkout with symbolic link HEAD d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths 51a94af - Fix "checkout --track -b newbranch" on detached HEAD b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch6.撤銷操作
我們有時想回退版本,怎么辦呢?可以使用reset命令,來移動head指針,變更本地倉庫的版本。
這里有三個參數,–soft --hard --mixed
- git reset <commitId> --soft -- 2.txt 1.txt 變更本地倉庫版本。工作區和暫存區不做變動
- git reset <commitId> -- 2.txt 1.txt 變更本地倉庫版本和暫存區,不變更工作區。不加參數就是默認mixed
- git reset <commitId> --hard -- 2.txt 1.txt 變更本地倉庫版本、暫存區和工作區。(注意這個命令十分危險,會丟失你在工作區做的變更!!)
commitId指的是某次提交記錄,使用git reflog 查看所有提交歷史,可以方便的查找提交記錄進行版本的回退和前進。
將commitId換成head,可以實現另一些常用的功能:
-
我們有時取消剛暫存的文件,怎么辦呢?
git reset head -- 2.txt 1.txt 把2.txt和1.txt恢復成head,也可以不指定文件即復原所有文件 -
如果想暫存區和工作區都恢復成最新一次提交的內容該怎么辦呢?
git reset --hard HEAD 將暫存區和工作區都恢復成最新一次提交的內容。 回退到上上個版本 git reset --hard HEAD^^,直到HEAD~100。(注意這個命令十分危險,會丟失你在工作區做的變更!!) -
如果我們想恢復工作區的內容和暫存區一樣,怎么操作呢?使用checkout
git checkout -- 3.txt 丟棄工作區的修改,恢復和暫存區一樣。(注意這個命令比較危險,會丟失你在工作區做的變更!!)
記住,在 Git 中任何已提交的東西幾乎總是可以恢復的。 甚至那些被刪除的分支中的提交或使用 --amend 選項覆蓋的提交也可以恢復 (數據恢復)。 然而,任何你未提交的東西丟失后很可能再也找不到了。
7.遠程倉庫的使用
git remote <-v> 查看本地配置的遠程倉庫信息
git remote show <remote> 查看某一個遠程倉庫的更多信息
git remote add origin git@github.com:xxx/git_test.git 在本地添加遠程倉庫,并指定縮寫origin來指代遠程倉庫,git clone默認是origin
git fetch <remote> 將數據下載到你的本地倉庫——它并不會自動合并或修改你當前的工作
git pull 自動抓取后合并該遠程分支到當前分支
git push <remote> <branch> 推送到遠程服務器
8. 分支的管理
git里的分支非常簡單,其實就是創建個指針指向提交對象,head也是個指針指向當前分支。創建、切換、合并、刪除分支都是很常見的操作。
創建、切換分支
git branch testing 創建分支
git checkout testing 切換分支,注意切換的時候要保證本地的修改已經提交或stash,不然會切換失敗,這是git為了防止丟失你當前工作區的修改
git checkout -b testing 創建分支并切換過去,相當于上面兩個命令的合并
git log --oneline --decorate --graph --all 查看當前分支情況
git merge testing 把testing的修改合并到當前分支,如果沒有分叉就是快進(fast-forward)。如果有分叉且沖突了需要解決沖突,git add 表示沖突已解決,準備提交了,要記得提交!
刪除分支
git branch -d hotfix 刪除分支,如果hotfix分支的代碼已經合并到該分支,會成功刪除。否則會刪除失敗,強制刪除使用-D,這也是git為了防止你丟失hotfix的修改
git branch --merged 查看已經合并到當前分支的分支。此命令下沒有*號的分支都是可以刪除的,因為修改已經合并到當前分支,不會丟失任何東西
git branch --no-merged 查看有修改還沒合并到當前分支的分支信息。這是-d刪除分支就會失敗
遠程分支
git branch <-vv> 查看分支信息,和當前所處分支
git fetch origin --all 獲取遠程倉庫的信息
git push <remote> <branch> 把本地新創建的分支推送到遠程服務器上
git checkout -b serverfix origin/serverfix 從遠程服務器上拉取serverfix 分支到本地 ,這個命令很常用,所以有快捷方式git checkout --track origin/serverfix,甚至git checkout serverfix即可
git branch -u origin/serverfix 讓本地分支跟蹤遠程分支
git push origin --delete serverfix 刪除遠程分支
9. 標簽
git tag 列出標簽
git tag --list '*1.0' 搜索1.0結尾的標簽
git show v1.4 可以查看這個標簽的信息
Git 支持兩種標簽:
輕量標簽(lightweight)很像一個不會改變的分支——它只是某個特定提交的引用。
附注標簽(annotated) 是存儲在 Git 數據庫中的一個完整對象, 它們是可以被校驗的,其中包含打標簽者的名字、電子郵件地址、日期時間, 此外還有一個標簽信息,并且可以使用 GNU Privacy Guard (GPG)簽名并驗證。 通常會建議創建附注標簽,這樣你可以擁有以上所有信息。
git tag -a v1.4 -m "my version 1.4" 附注標簽必須帶上-a ,而且必須輸入一條備注信息。輕量標簽直接git tag v1.0即可
git tag -a v1.2 9fceb02 在之前的某次提前打上標簽
git push origin <tagname> 默認情況下,git push 命令并不會傳送標簽到遠程倉庫服務器上。 在創建完標簽后你必須顯式地推送標簽到共享服務器上
總結
以上是生活随笔為你收集整理的git(一) 基础必备的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最实用的logback讲解(2)—app
- 下一篇: github的基础使用