Git 官網:https://git-scm.com/
下載傳送門:https://git-scm.com/downloads
官網Book(中文版):https://git-scm.com/book/zh/v2
Git是最流行的分佈式版本控制系統,Git是Linus用C語言開發的,所以速度是非常快的也很穩定。
所有的版本控制系統,其實只能跟蹤文本文件的改動,比如 TXT 文件,網頁,所有的程序代碼等等,Git 也不例外。
Git 項目一般包括Git 倉庫、工作目錄以及暫存區域:
- Git 倉庫目錄是 Git 用來保存項目的元數據和對象數據庫的地方。 這是 Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這裏的數據。
- 工作目錄是對項目的某個版本獨立提取出來的內容。 這些從 Git 倉庫的壓縮數據庫中提取出來的文件,放在磁盤上供你使用或修改。
- 暫存區域是一個文件,保存了下次將提交的文件列表信息,一般在 Git 倉庫目錄中。 有時候也被稱作"索引",不過一般說法還是叫暫存區域。
基本的 Git 工作流程如下:
- 在工作目錄中修改文件。
- 暫存文件,將文件的快照放入暫存區域。
- 提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄
一、創建版本庫
1、新建一個空文件夾,作爲版本庫的倉庫
$ mkdir Git_Learn
$ cd Git_Learn
2、爲了更好的使用git,git 中添加全局的用戶名username和郵箱email
$ git config --global user.name "holysll"
$ git config --global user.email "[email protected]"
3、通過git init 命令把這個目錄變成 Git 可以管理的倉庫,用ls 或者 ll命令可以看到隱藏的.git文件
$ git init
$ ls
4、在目錄下新建一個文件test.py ,並用git add test.py 命令添加到倉庫 或者使用 git add . 添加目錄下的所有文件到倉庫,其中後面點之前有空格。
$ touch test.py
$ git add .
$ git add test.py
5、通過git commit -m "xxxx" 提交到倉庫,其中 -m 後面輸入的是本次提交的說明
$ git commit -m "test.py"
6、通過git status 查看倉庫狀態
$ git status
7、通過git diff test.py 查看看尚未暫存的文件的修改內容
$ git diff test.py
$ git diff --cached # 查看已暫存的將要添加到下次提交裏的內容
$ git diff HEAD --file # 查看工作區和版本庫裏面最新版本的區別
8、通過 git log 查看提交歷史記錄
# 查看提交歷史記錄
$ git log
# 顯示最近兩次提交內容差異,-p顯示每次提交的內容差異,-2 顯示最近兩次提交
$ git log -p -2
# 每次提交的簡略的統計信息
$ git log --stat
# 只顯示 --stat 中最後的行數修改添加移除統計
$ git log --shortstat
# 僅在提交信息後顯示已修改的文件清單
$ git log --name-only
# 顯示新增、修改、刪除的文件清單
$ git log --name-status
# 僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符
$ git log --abbrev-commit
# 使用較短的相對時間顯示(比如,“2 weeks ago”)
$ git log --relative-date
# 使用其他格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)
$ git log --pretty
# 將每個記錄提交放在一行顯示
$ git log --pretty=oneline
# 用format 固定格式顯示提交記錄
$ git log --pretty=format:"%h - %an, %ar : %s"
# 用ASCII 圖形更形象地展示你的分支、合併歷史
$ git log --pretty=format:"%h %s" --graph
# 列出所有最近兩週內的提交
$ git log --since=2.weeks
# 僅顯示指定時間之後的提交
$ git log --after
$ git log --since
# 僅顯示指定時間之前的提交
$ git log --before
$ git log --until
# 僅顯示指定提交者相關的提交
$ git log --committer
# 僅顯示添加或移除了某個關鍵字的提交
$ git log -S
# 找出添加或移除了某一個特定函數的引用的提交
$ git log -Sfunction_name
# 用 --author 選項顯示指定作者的提交
$ git log --author
# 用 --grep 選項搜索提交說明中的關鍵字
$ git log --grep
git log --pretty=format
常用的選項 :
選項 | 說明 |
---|---|
|
提交對象(commit)的完整哈希字串 |
|
提交對象的簡短哈希字串 |
|
樹對象(tree)的完整哈希字串 |
|
樹對象的簡短哈希字串 |
|
父對象(parent)的完整哈希字串 |
|
父對象的簡短哈希字串 |
|
作者(author)的名字 |
|
作者的電子郵件地址 |
|
作者修訂日期(可以用 --date= 選項定製格式) |
|
作者修訂日期,按多久以前的方式顯示 |
|
提交者(committer)的名字 |
|
提交者的電子郵件地址 |
|
提交日期 |
|
提交日期,按多久以前的方式顯示 |
|
提交說明 |
查看 Git 倉庫中,2008 年 10 月期間,Junio Hamano 提交的但未合併的測試文件,可以用下面的查詢命令:
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t
9、通過 git reflog 查找命令歷史記錄(重返未來)
$ git reflog
10、確實要從版本庫中刪除該文件,那就用命令git rm
刪掉,並且git commit
$ git rm test.py
$ git commit -m "remove test.py"
# 刪除 log/ 目錄下擴展名爲 .log 的所有文件
$ git rm log/\*.log
# 刪除以 ~ 結尾的所有文件
$ git rm \*~
11、文件重命名
$ git mv test test1
二、版本回退
有的時候存在誤刪,誤操作等情況或者是遺漏一些代碼、文件之類的,或者提交信息錯誤。這時,我們想回退到以前版本,或者撤銷操作。
1、撤銷操作
有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 --amend
選項的提交命令嘗試將暫存區中的文件重新提交,如果自上次提交以來你還未做任何修改,那麼快照會保持不變,而你所修改的只是提交信息:
$ git commit --amend
2、取消暫存的文件
# 版本回退(HEAD指向的版本就是當前版本)
$ git rest --hard HEAD^ 會退到上一個版本
$ git rest --hard HEAD^^ 會退到前兩個版本
$ git rest --hard HEAD~100 會退到前100個版本
$ git reset --hard <commit id> 根據commit id回退到某個版本
當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改 :
$ git reset HEAD file
$ git checkout -- file # 當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時
雖然在調用時加上 --hard
選項令 git reset
成爲一個危險的命令(譯註:可能導致工作目錄中所有當前進度丟失!),但本例中工作目錄內的文件並不會被修改。 不加選項地調用 git reset
並不危險 — 它只會修改暫存區域。
3、撤消對文件的修改(文件在工作區的修改全部撤銷)
- 一種是 file 自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
- 一種是 file 已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。
總之,就是讓這個文件回到最近一次git commit
或git add
時的狀態。
$ git checkout -- file
你需要知道 git checkout -- [file]
是一個危險的命令,這很重要。 你對那個文件做的任何修改都會消失 - 你只是拷貝了另一個文件來覆蓋它。 除非你確實清楚不想要那個文件了,否則不要使用這個命令。
三、分支管理
1、分支創建
# 創建 dev 分支,然後切換到 dev 分支,-b參數表示創建並切換
$ git checkout -b dev
# 等同於
$ git branch dev
$ git checkout dev
2、查看當前分支
$ git branch
3、切換分支
$ git checkout master
4、合併分支
# 把 dev 分支的工作成果合併到 master 分支上
$ git checkout master
$ git merge dev
# --no-ff參數,表示禁用 Fast forward ,保留 merge 信息
$ git merge --no-ff -m "keep merge info" dev
5、刪除分支
$ git branch -d dev
# 強行刪除
$ git branch -D dev
6、解決衝突
# 手動進行把dev和master衝突的內容進行合併,然後commit 例如:
<<<<<<< HEAD
aaaaaa
=======
bbbbbb
>>>>>>> dev
# 手動修改合併後
aaaaaa & bbbbbb
# 提交
$ git commit -am "conflict fixed"
# 查看到分支合併圖
$ git log --graph
7、當前工作現場“儲藏”
當工作只進行到一半,還沒法提交,預計還需要一段時間,但是又要忙着去做其他事情,所以可以把當前工作區的內容存儲起來。
# 儲存當前工作區
$ git stash
# 查看剛纔儲存的位置
$ git stash list
# 恢復之前工作區內容, 並刪除stash 內容
$ git stash apply
$ git stash drop
# 直接恢復同時刪除stash內容
$ git stash pop
# 恢復指定的 stash
$ git stash apply stash@{0}
四、遠程倉庫
1、克隆遠程倉庫
# 用git clone克隆github上用戶名爲username 倉庫名爲gitname的遠程倉庫
$ git clone https://github.com/username/gitname
2、查看遠程倉庫
$ git remote
$ git remote show [remote-name] # 查看某一個遠程倉庫的更多信息
# 選項 -v,會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL
$ git remote -v
origin https://github.com/username/gitname (fetch)
origin https://github.com/username/gitname (push)
3、添加遠程倉庫
# 通過 git remote add <shortname> <url> 添加一個新的遠程 Git 倉庫
$ git remote
$ git remote add alg https://github.com/abc/learn_git
$ git remote -v
origin https://github.com/username/gitname (fetch)
origin https://github.com/username/gitname (push)
alg https://github.com/abc/learn_git (fetch)
alg https://github.com/abc/learn_git (push)
4、從遠程倉庫中抓取與拉取
# git fetch 相當於是從遠程獲取最新到本地,不會自動merge
$ git fetch [remote-name]
# git pull:相當於是從遠程獲取最新版本並merge到本地
$ git pull [remote-name]
在實際使用中,git fetch更安全一些
5、推送到遠程倉庫
# -u參數,Git 不但會把本地的 master 分支內容推送的遠程新的 master 分支,還會把本地的 master 分支和遠程的 master 分支關聯起來,在以後的推送或者拉取時就可以簡化命令
$ git push -u origin master
6、遠程倉庫的移除與重命名
# 使用 git remote rename 去修改一個遠程倉庫的簡寫名
$ git remote rename alg aaa # 把遠程倉庫alg重命名爲aaa
# 刪除遠程倉庫aaa
$ git remote rm aaa
參考來源:https://git-scm.com/book/zh/v2