Git:學習筆記


一、概述

下載地址:GitGit客戶端

二、git config(配置)

返回目錄

Git 自帶一個 git config 的工具來幫助設置控制 Git 外觀和行爲的配置變量。 這些變量存儲在三個不同的位置:

  1. /etc/gitconfig 文件: 包含系統上每一個用戶及他們倉庫的通用配置。 如果在執行 git config 時帶上 --system 選項,那麼它就會讀寫該文件中的配置變量。 (由於它是系統配置文件,因此你需要管理員或超級用戶權限來修改它。)

  2. ~/.gitconfig 或 ~/.config/git/config 文件:只針對當前用戶。 你可以傳遞 --global 選項讓 Git 讀寫此文件,這會對你係統上 所有 的倉庫生效。

  3. 當前使用倉庫的 Git 目錄中的 config 文件(即 .git/config):針對該倉庫。 你可以傳遞 --local 選項讓 Git 強制讀寫此文件,雖然默認情況下用的就是它。。 (當然,你需要進入某個 Git 倉庫中才能讓該選項生效。)

每一個級別會覆蓋上一級別的配置,所以 .git/config 的配置變量會覆蓋 /etc/gitconfig 中的配置變量。

1. 查看 config

返回目錄

#查看配置
git config --list

#查看所有的配置以及其所在的文件
git config --list --show-origin

2. 設置用戶信息

返回目錄

#設置全局用戶信息
git config --global user.name "John Doe"
git config --global user.email [email protected]

#設置項目用戶信息
git config user.name "John Doe"
git config user.email [email protected]

三、Git的使用

1. 本地倉庫

返回目錄

#0. 克隆倉庫
git clone <url>

#1. 創建本地倉庫
#該命令將創建一個名爲 .git 的子目錄
git init

#2. 追蹤(暫存)文件 
git add <file>
git add *.c #追蹤所有.c的文件

#3. 提交追蹤(暫存)的文件到倉庫
git commit -m 'text' #-m 表示此次提交的說明
git commit -a -m 'text' #-a 會自動把所有已經跟蹤過的文件暫存起來一併提交

#3.1 修補提交,即:提交後發現忘記了暫存某些需要的修改
git commit -m 'initial commit' #忘提交個文件
git add forgotten_file #添加忘記的文件
git commit --amend #修補提交,最終只會有一個提交——第二次提交將代替第一次提交的結果

#4. 檢查當前文件狀態
#查看哪些文件處於什麼狀態,是否被跟蹤
git status
git status -s #查看簡潔信息

#5. 查看當前與提交的區別
#只顯示尚未暫存的改動,未跟蹤的文件不顯示
git diff <filename>
#查看已暫存的將要添加到下次提交裏的內容
git diff --staged #或 --cached

#6. 刪除文件
#6.1 從"提交"中刪除,並刪除該文件。但不能刪除“暫存”和“未跟蹤”的文件
git rm <file>
#6.2 從"提交"或“暫存”中刪除,並刪除該文件。但不能刪除“未跟蹤”的文件
git rm -f <file>
#6.3 只從"提交"或“暫存”中刪除,不刪除文件。但不能刪除“未跟蹤”的文件
git rm --cached <file>
#6.4 使用 glob 模式
git rm log/\*.log #刪除 log/ 目錄下擴展名爲 .log 的所有文件
git rm \*~ #刪除所有名字以 ~ 結尾的文件

#7. 文件改名
git mv file_from file_to

#8. 取消暫存
git reset HEAD <file>
#回滾
#HEAD^ 上個版本; HEAD^^ 再上一個版本; HEAD~1000 爲之前的1000個版本
git reset --hard HEAD^ 
#不用參數就用 git log 命令中查詢到的 版本號 來控制回滾

#9. 撤消對文件的修改
#會用暫存區全部或指定的文件替換工作區的文件
#這個操作很危險,會清除工作區中未添加到暫存區的改動
git checkout -- <file>

#查看執行過的git命令
git reflog

2. 遠程倉庫

返回目錄

#1. 查看所有的遠程倉庫
git remote -v #默認名稱是 origin。如遠程倉庫爲多個,將會全部列出

#2. 添加遠程倉庫
git remote add <shortname> <url> #用 shortname 來代替整個 URL

#3. 從遠程倉庫中拉取
#訪問遠程倉庫,從中拉取所有本地還沒有的數據。
#執行完成後,將會擁有那個遠程倉庫中所有分支的引用,可以隨時合併或查看。
git fetch <remote>

#4. 從遠程倉庫中抓取
#自動抓取後合併該遠程分支到當前分支
git pull

#5. 推送到遠程倉庫
git push <remote> <branch>

#6. 查看某一個遠程倉庫的信息
git remote show <remote>

#7. 重命名遠程倉庫
git remote rename <remote> <newname>

#8. 刪除遠程倉庫
git remote remove <remote>

3. 標籤

返回目錄

Git 支持兩種標籤:輕量標籤(lightweight)與附註標籤(annotated)

#1. 查看標籤
git tag
git tag -l "v1.8.5*" #查看某一系列的標籤

#2. 創建輕量標籤
git tag <tag>

#3. 創建附註標籤
git tag -a <tag> -m "msg"

#4. 查看標籤詳細信息
git show <tag>

#5. 對已提交的操作打標籤
git tag -a <tag> <commitHash>

#6. 推送標籤
git push <remote> <tag>
git push <remote> --tags #推送所有標籤

#7. 刪除標籤
git tag -d <tag>

#8. 刪除遠程的標籤
git push <remote> :refs/tags/<tag>
git push <remote> --delete <tag>

#9. 檢出標籤
#如做了某些更改然後提交,標籤不會發生變化,
#但新提交將不屬於任何分支,並且將無法訪問,
#除非通過確切的提交哈希才能訪問。
git checkout <tag>
#建議創建一個新的分支

4. 分支

返回目錄

#1. 創建分支
git branch <branch>

#2. 分支切換
git checkout <branch>
#2.1 創建並切換到新分支
git checkout -b <branch>

#3. 查看分支歷史
git log --oneline --decorate --graph --all

#4. 查看分支
git branch -a #查看所有分支
git branch -v #查看每一個分支的最後一次提交
git branch --merged #查看已經合併到當前分支的分支
git branch --no-merged #查看尚未合併到當前分支的分支
git branch -vv #查看設置的所有跟蹤分支

#5. 合併分支
#如有衝突,Git用
#<<<<<<<
#當前分支內容
#=======
#合併分支的內容
#>>>>>>>
#標記出不同分支的內容
git merge <branch> #將別的分支合併到本分支
git merge --no-ff -m "merge with no-ff" <branch> #--no-ff 表示禁用快速合併

#6. 變基
#將本分支變基到其它分支。相當於提交到其它分支上,使提交樹更簡潔。
#其它分支並未改變,還需要進行切換、合併操作。
#準則:如果提交存在於你的倉庫之外,而別人可能基於這些提交進行開發,那麼不要執行變基。
git rebase <branch>
#圖1:c1<-c2<-c5<-c6(master)
#         \<-c3<-c4<-c10(server)
#             \<-c8<-c9(client)
git rebase --onto master server client #將 client 的修改變基到 master 分支上
#圖2:c1<-c2<-c5<-c6(master)<-'c8<-'c9(client)
#         \<-c3<-c4<-c10(server)
git checkout master #切換到 master 分支
git merge client #合併 client 分支到 master 分支
#圖3:c1<-c2<-c5<-c6(master)<-'c8<-'c9(master、client)
#         \<-c3<-c4<-c10(server)
git rebase master server #再將 server的修改變基到 master 分支上
#圖4:c1<-c2<-c5<-c6(master)<-'c8<-'c9(master、client)<-'c3<-'c4<-'c10(server)
#記住:只對尚未推送或分享給別人的本地修改執行變基,從不對已推送至別處的提交執行變基

#7. 刪除分支
git branch -d <branch>

5. 遠程分支

返回目錄

#遠程分支以 <remote>/<branch> 命名

#1. 檢出遠程分支
git checkout -b <branch> <remote>/<branch>
#檢出遠程分支,並且本地分支與遠程分支名稱相同
git checkout --track <remote>/<branch>

#2. 推送到遠程分支
git push <remote> <branch>
#將本地的分支推送到遠程倉庫上的另一個分支
git push <remote> <branch>:<otherbranch>

#3. 設置已有的本地分支跟蹤一個剛剛拉取下來的遠程分支,或者想要修改正在跟蹤的上游分支
git branch -u <remote>/<branch>
git branch --set-upstream <branch> <remote>/<branch>

#4. 刪除遠程分支
git push <remote> --delete <branch>

6. 查看提交歷史

返回目錄

  1. git log查看推送日誌,輸入字母q退出
    不傳入任何參數的默認情況下,git log 會按時間先後順序列出所有的提交,最近的更新排在最上面。

    -p 或 --patch 會顯示每次提交所引入的差異

    git log -p -2 #-2表示顯示最近的兩條提交
    

    –stat 會顯示每次提交的簡略統計信息

    git log --stat
    

    –pretty=oneline|short|full|fuller|format

    #每個提交放在一行顯示
    git log --pretty=oneline
    #short、full 和 fuller 顯示的信息長度不一樣
    git log --pretty=short
    #自定義輸出 
    git log --pretty=format:"%h - %an, %ar : %s"
    
  2. git log --pretty=format常用的選項

    選項 說明
    %H 提交的完整哈希值
    %h 提交的簡寫哈希值
    %T 樹的完整哈希值
    %t 樹的簡寫哈希值
    %P 父提交的完整哈希值
    %p 父提交的簡寫哈希值
    %an 作者名字
    %ae 作者的電子郵件地址
    %ad 作者修訂日期(可以用 --date=選項 來定製格式)
    %ar 作者修訂日期,按多久以前的方式顯示
    %cn 提交者的名字
    %ce 提交者的電子郵件地址
    %cd 提交日期
    %cr 提交日期(距今多長時間)
    %s 提交說明
  3. git log的常用選項

    選項 說明
    -p 按補丁格式顯示每個提交引入的差異。
    –stat 顯示每次提交的文件修改統計信息。
    –shortstat 只顯示 --stat 中最後的行數修改添加移除統計。
    –name-only 僅在提交信息後顯示已修改的文件清單。
    –name-status 顯示新增、修改、刪除的文件清單。
    –abbrev-commit 僅顯示 SHA-1 校驗和所有 40 個字符中的前幾個字符。
    –relative-date 使用較短的相對時間而不是完整格式顯示日期(比如“2 weeks ago”)。
    –graph 在日誌旁以 ASCII 圖形顯示分支與合併歷史。
    –pretty 使用其他格式顯示歷史提交信息。可用的選項包括 oneline、short、full、fuller 和 format(用來定義自己的格式)。
    –oneline –pretty=oneline --abbrev-commit 合用的簡寫。
  4. 過濾 git log 輸出的選項

    選項 說明 示例
    -<n> 僅顯示最近的 n 條提交 顯示最近的兩條提交
    git log -2
    –since, --after 僅顯示指定時間之後的提交 顯示最近兩週的所有提交
    git log --since=2.weeks
    可以是 "2008-01-15"的某一天
    可以是 “2 years 1 day 3 minutes ago” 的相對日期
    –until, --before 僅顯示指定時間之前的提交 同上
    –author 僅顯示作者匹配指定字符串的提交
    –committer 僅顯示提交者匹配指定字符串的提交
    –grep 僅顯示提交說明中包含指定字符串的提交 如果添加了 –all-match 選項, 則只會輸出 所有 匹配 --grep 模式的提交
    -S 僅顯示添加或刪除內容匹配指定字符串的提交
    –no-merges 隱藏合併提交

7. 忽略文件

返回目錄

  1. git 用 .gitignore 文件來標記忽略的文件。其格式規範如下:
    a)所有空行或者以 # 開頭的行都會被 Git 忽略
    b)可以使用標準的 glob 模式匹配,它會遞歸地應用在整個工作區中
    c)匹配模式可以以(/)開頭防止遞歸
    d)匹配模式可以以(/)結尾指定目錄
    e)要忽略指定模式以外的文件或目錄,可以在模式前加上歎號(!)取反

  2. 創建 .gitignore 文件

    #忽略所有以 .o 或 .a 結尾的文件
    *.[oa]
    
    #忽略所有名字以波浪符(~)結尾的文件
    *~
    
    # 忽略所有的 .a 文件
    *.a
    
    # 但跟蹤所有的 lib.a,即便你在前面忽略了 .a 文件
    !lib.a
    
    # 只忽略當前目錄下的 TODO 文件,而不忽略 subdir/TODO
    /TODO
    
    # 忽略任何目錄下名爲 build 的文件夾
    build/
    
    # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
    doc/*.txt
    
    # 忽略 doc/ 目錄及其所有子目錄下的 .pdf 文件
    doc/**/*.pdf
    

GitHub 有一個十分詳細的針對數十種項目及語言的 .gitignore文件列表

四、分支管理策略

返回目錄

  • 主分支 master
    代碼庫應該有一個、且僅有一個主分支。所有提供給用戶使用的正式版本,都在這個主分支上發佈。
    Git主分支的名字,默認叫做Master。它是自動建立的,版本庫初始化以後,默認就是在主分支在進行開發。
  • 開發分支 develop
    主分支只用來分佈重大版本,日常開發應該在另一條分支上完成。我們把開發用的分支,叫做Develop。
    這個分支可以用來生成代碼的最新代碼版本。如果想正式對外發布,就在Master分支上,對Develop分支進行"合併"(merge)。
  • 功能分支 feature
    功能分支,它是爲了開發某種特定功能,從Develop分支上面分出來的。開發完成後,要再併入Develop。
    功能分支的名字,可以採用feature-*的形式命名。
  • 預發佈分支 release
    預發佈分支,它是指發佈正式版本之前(即合併到Master分支之前),我們可能需要有一個預發佈的版本進行測試。預發佈分支是從Develop分支上面分出來的,預發佈結束以後,必須合併進Develop和Master分支。它的命名,可以採用release-*的形式。
  • bug 分支 fixbug
    bug分支。軟件正式發佈以後,難免會出現bug。這時就需要創建一個分支,進行bug修補。修補bug分支是從Master分支上面分出來的。修補結束以後,再合併進Master和Develop分支。它的命名,可以採用fixbug-*的形式。
  • 其它分支 other
    根據需要創建即可

五、搭建Git服務器

返回目錄

  1. 用yum安裝git服務器

    cd src/
    wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
    rpm -ivh epel-release-5-4.noarch.rpm
    Preparing...                ########################################### [100%]
        package epel-release-5-4.noarch is already installed
    yum list
    yum install -y git
    
  2. 創建一個git用戶,用來運行git服務

    adduser git
    
  3. 創建客戶端登錄證書
    注,收集所有需要登錄的用戶的公鑰,就是他們自己生成的id_rsa.pub文件,把所有公鑰複製到/home/git/.ssh/authorized_keys文件裏,一行一個。

    1. 客戶端生成id_rsa.pub文件的命令
      ssh-keygen -t rsa
      cat  .ssh/id_rsa.pub
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
      
    2. 查看服務器上authorized_keys文件
      [root@git ~]# cat /home/git/.ssh/authorized_keys
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwMU4FKB6NRc3XSoIunWsdvVVuSoncbVb5Al6lB3ciswBVd++YmJFhqwkITNGccrO5sycROs9+Fbjgd6oBSzNuaBtCIbwNNsEyM/henTl2euI3XsnJQ/ITr6c/q0P3WoGl4E2QFQ2kZqs+1eDC0CgHcBrqvFv1Jr414sVYK9lfZwIF+jDdtaBOrSJuq1Agx9pGUFUEB4tQfkXxsWm/MvOmKAVvduKDE1eenUEL9zzyeELPcSXLe3NOoTjZhkX6EEXxQR1ZiZRFywLpfM4qopZ10to2KIUyVtzw6hx6V3cg7kn40lYVW0EAMATw9dVldwcRUI+kJzJSKUTKDVSwY3/+Q== root@CHENMINGQIAN
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsmmJuR+KhRSpdSirCiL30RA8WbfgicY1z7itWVnKHJW6hTuJFhzruY59FilVjJR1hbQBluP9JnK3XPSK9PSg+bwiJ2iQRa39rXck35r+trVOLyNbPyfKVRfOemD8YuykMlyr5JeW8gZjsHEuLnJ8//RiCiYzd3RT/SSUQ4yawDoIIWkz3eUSL09xoCRZFBsAp+S/LD3vx2MN+FNOHwvqcE+yK3oRNIqjWwLoKE0e5TRnqNgrPQ95PJYB3XPUulzaeMwsWPZs7jIUMl/5yEqSgAkioa8SVMOsikYJG/erv99NNVgFmpCBIiWqKEGkNrIpYzLLHDSYQ4g5Gbci/RZ54Q== Administrator@WIN2003X323
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
      

    說明:我這裏有三個用戶登錄服務器,所以我這裏就有三個ssh-rsa,大家可以看一下。

  4. 初始化Git倉庫
    注,先選定一個目錄作爲Git倉庫,這裏是/data/git/project.git。

    cd /data/git/
    git init --bare project.git
    ls
    branches  config  description  HEAD  hooks  index  info  objects  refs
    

    執行以上命令 Git命令,會創建一個裸倉庫,裸倉庫沒有工作區,因爲服務器上的Git倉庫純粹是爲了共享,所以不讓用戶直接登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git結尾。然後,把owner改爲git:

    chown -R git.git project.git
    ls -l
    總計 4
    drwxr-xr-x 7 git git 4096 05-09 13:50 project.git
    
  5. 禁用shell登錄
    注,出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下面的一行:

    cat /etc/passwd | grep git
    git:x:1001:1001:git version control:/home/git:/bin/bash
    

    改爲:

    vim /etc/passwd
    git:x:1001:1001:git version control:/home/git:/usr/bin/git-shell
    

    這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因爲我們爲git用戶指定的git-shell每次一登錄就自動退出。

  6. 克隆遠程倉庫
    注,現在可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:

    git clone [email protected]:/data/git/project.git
    

    注,$ git clone [email protected]:/data/git/project.git,其中git用戶名,git.jjhh.com服務器,/data/git/prgject.git是倉庫路徑。好了,到這裏服務器的搭建到這裏就完成了,下面我們來安裝一下客戶端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章