Git筆記

1、Git簡介

1 什麼是Git

​ 分佈式版本控制系統,C語言開發

2 集中式與分佈式:

所有的版本控制系統,只能跟蹤文本文件的活動,版本控制系統可以告訴你它每次的改動;而無法跟蹤二進制文件1

1 集中式版本控制系統
  1. 特點:版本庫集中存放在中央服務器

  2. 工作方式:先從中央服務器中取出最新版本,在自己電腦上修改,再傳回至中央服務器

  3. 缺點:必須在聯網狀態下才能工作

  4. SVN是目前應用最廣泛的集中式版本庫控制系統

2 分佈式版本控制系統
  1. 特點:沒有中央服務器,每個人的電腦上都是一個完整的版本庫

  2. 協作:把修改的部分推送給對方,分佈式版本控制系統通常也有一臺電腦充當“中央服務器”,方便交換大家的修改

  3. 優勢:

    • 安全性高

    • 不需要互聯網的支持

  4. 分佈式版本控制系統:Git、BitKeeper、Bazaar、Mercurial等。

3 安裝Git

1 運行平臺

​ Linux、Unix、Windows、Mac

2 安裝
2.1 Linux

​ ebian或Ubuntu Linux,通過sudo apt-get install gita 安裝

2.2 Windows

​ 安裝完成後,設置姓名與郵箱:

$ git config --global user.name "name"

$ gitconfig --global user.email "email"

​ 參數--global : 表示這臺計算機上所有的Git倉庫都會使用這個配置

4 創建版本庫2

1、創建一個空目錄
2、初始化一個Git倉庫

git init

.git的目錄是Git來跟蹤管理版本庫的

3、把文件添加到版本庫裏:(將文件修改加入暫存區)
  • 將文件添加到倉庫,文件一定要放在learngit目錄下,可以反覆使用,添加多個文件

    git add <file>

  • 將文件提交到倉庫:(將暫存區的所有內容提交到當前分支)

git commit -m <message>

2、Git基本操作

1 回退回歸版

  1. Git可以在版本之間移動,使用命令git reset --hard commit_id

  2. 退前,用git log可以查看提交歷史,以便確定要退到哪個版本,英文狀態下按下q鍵

  3. 前,用git reflog查看命令歷史,以便確定要回到哪個版本

2 工作區和暫存區

  1. 工作區:能在電腦裏看見的目錄,如:learngit

  2. 暫存區:在版本庫裏起過渡作用的,git add是把文件傳到暫存區裏。

文件夾裏的目錄.git爲Git的版本庫,其中存了很多東西,最重要的就是稱爲stage(或者叫index)的暫存區。

Git還爲我們自動創建了第一個分支master,以及指向master的一個指針叫HEAD

每次修改都要把文件提交給暫存區,才能commit

3 撤銷修改

當文件保存後才能進行操作

  1. 改亂文件內容,但還未添加至暫存區時,用git checkout -- file
  2. 改亂文件內容,且添加至暫存區時,用git reset HEAD file回到步驟1,然後按步驟1執行。
  3. 已經將文件提交到了版本庫中,在未遠程推送之前,可以先進行版本回退。

4 刪除文件

  • 刪除文件rm file後,工作區和版本區會不一致,有兩種選擇
  1. 從版本庫中刪除:git rm並且git commit
  2. 恢復到最新版本:git checkout -- file(是用版本庫裏的版本替換工作區的版本)

3、遠程倉庫

1 添加遠程庫

在GitHub上創建一個庫

  1. 關聯一個遠程庫,用命令

    git remote add origin [email protected]:oouapatia/learngit.git

    如果關聯錯誤,用git remote rm origin清除。

  2. 關聯後,第一次用git push -u origin master推送master分支所有內容。

  3. git push origin master推送最新的修改。

2 從遠程庫克隆

git clone [email protected]:oouapatia/gitskills.git克隆

Git支持多種協議,https,但通過ssh支持的原生git更快

4、分支管理

1 創建與合併分支

master分支,HEAD指向mastermaster指向提交,so,HEAD指向的就是當前分支

  1. 創建分支:增加一個dev指針,改變HEAD指向(改變後,對工作區的修改和提交就是對dev分支,而master分支不變)

git checkout -b dev ( git checkout加上-b表示創建並切換)

相當於以下兩條分支:

git branch dev`創建分支

git checkout dev切換分支

git branch列出所有分支,並且在當前分支前會有一個*

  1. 合併分支:把master指向的dev的當前提交

    git merge name 命令用於合併指定分支到當前分支

  2. 刪除分支

    git branch -d dev

2 解決衝突

一個分支與另一個分支內容不同時,進行合併會出現衝突。

Git的用<<<<<<<=======>>>>>>>標記出不同分支的內容

  • Git無法合併分支時,需要手動解決衝突,然後在提交

    git log --graph 查看分支合併歷史

    提交後已經是合併後的結果,不需要再進行合併,直接刪除分支即可

3 普通合併分支

合併分支時,通常情況下,Git會用Fast forward 模式,但刪除分支後,會丟掉分支信息。

強制禁用Fast forward 模式,Git會在merge時生成一個新的commit,這樣可以在分支歷史上看出分支信息

git merge --no-ff -m "" branch_name (--no-ff參數表示禁用Fastforward-m參數把commit描述進去)

git log --graph --pretty=oneline --abbrev-commit查看分支歷史

合併分支時

  • 加上--no-ff參數就可以用普通模式合併,會記錄合併歷史
  • fast forward合並沒有合併歷史記錄.

4 Bug分支

首先確定在哪個分支上修復bug,在此分支上創建新的bug分支來修復,修復完成,然後合併,最後刪除臨時分支

  • 創建臨時分支之前需要查看工作區是否乾淨,乾淨則創建分支來修復bug

  • 當工作未完成時,需先將工作現場git stash一下,然後修復bug,再git stash pop,回到工作現場

    git stash 功能:把當前工作儲存起來,在恢復現場後繼續工作

    git stash list查看stash記錄

    git stash pop ,恢復的同時將stash內容刪除

    git stash apply 恢復,但並未刪除stash內容,需要用git stash drop

5 Feature分支

每添加一個新功能,最好新建一個feature分支

  1. 新建feature分支(git checkout -b feature

  2. 在上面開發,完成後,合併(git checkout dev

  3. 最後,刪除該feature分支。

如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。

6 推送抓取分支

要查看遠程庫的信息,用git remote,或者用git remote -v顯示更詳細的信息

  1. 推送分支

    git push origin branch-name

    • master分支是主分支,需要時刻與遠程同步

    • dev分支是開發分支,也需要與遠程同步

    • bug分支只用於在本地修復bug,不用推到遠程

    • feature分支是否推到,取決於是否在上面合作合作開發

  2. 抓取分支

    • 1、用git pull把最新的提交從遠程倉庫抓下來

    • 2、在本地合併,解決衝突,再推送

    • 3、git pull失敗,原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據提示,設置devorigin/dev的鏈接

      git branch --set-upstream-to=origin/dev dev

    • 4、合併有衝突,需要手動解決,解決的方法和分支管理中的解決衝突一樣

  3. 多人協作的工作模式:

    1. git push origin <branch-name>推送自己的修改;
    2. 如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull合併;
    3. 如果合併有衝突,則解決衝突,並在本地提交;
    4. 沒有衝突或者解決掉衝突後,再用git push origin <branch-name>推送。
  • 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
  • 建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name

7 Rebase3

git rebase改變本地的提交位置

5、標籤

1 創建標籤

git tag name 創建標籤,標籤默認打在最新的commit上(HEAD)
git tag name commit id 指定要創建的標籤的位置
git tag -a name -m "" 創建帶有說明的標籤
git tag 查看所有標籤
git show tagname 查看標籤信息

2 刪除標籤

git tag -d name 刪除本地標籤
git push origin name 推送標籤到遠程
git push origin --tags 推送所有未推送的標籤到遠程
git push origin :refs/tags/name 刪除遠程標籤

6、GitHub與碼雲

1 GithHub4

  • 在GitHub上,可以任意克隆開源倉庫
  • 自己有克隆後的倉庫的讀寫權限
  • 可以推送pull request給官方倉庫來貢獻代碼

2 碼雲5

關聯碼雲遠程庫與GitHub一致

可以同時使用GitHub與碼雲,使用多個遠程庫時,需要用不同的名稱來標識不同的遠程庫

7、自定義Git

1 忽略特殊文件

在Git工作區的根目錄下創建一個特殊的.gitignore文件,把需要忽略的文件名加入,將.gitignore提交到Git

配置文件:https://github.com/github/gitignore

忽略文件的原則:

  1. 忽略操作系統自動生成的文件,比如縮略圖等;
  2. 忽略編譯生成的中間文件、可執行文件等,比如Java編譯產生的.class文件;
  3. 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。

2 配置別名

配置

git config --global alias.co checkout 			//checkout
git config --global alias.ci commit	  			//commit
git config --global alias.br branch   			//branch
git config --global alias.unstage 'reset HEAD'  //把暫存區的修改撤銷掉
git config --global alias.last 'log -1'			//顯示最後一次提交信息

–global`參數是全局參數,也就是這些命令在這臺電腦的所有Git倉庫下都有用。

每個倉庫的Git配置文件放在.git/config文件中

當前用戶的Git配置文件放在用戶主目錄下的.gitconfig文件夾中:

刪除

別名就在[alias]後面,要刪除別名,直接把對應的行刪掉即可

3 搭建Git服務器

運行Linux的機器

  1. 安裝git
sudo apt-get install git
  1. 創建一個git用戶,用來運行git服務:
sudo adduser git
  1. 創建證書登錄:

收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。

  1. 初始化Git倉庫:

先選定一個目錄作爲Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:

sudo git init --bare sample.git

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

sudo chown -R git:git sample.git
  1. 禁用shell登錄:

出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改爲:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

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

6.克隆遠程倉庫:

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

git clone git@server:/srv/sample.git

Git跟蹤並管理的是修改


  1. 圖片、視頻、word文件等 ↩︎

  2. 版本庫(倉庫),repository,裏面的所有文件都可以被Git管理,每個文件的修改,刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來的某個時刻可以“還原”。 ↩︎

  3. 把本地未push分支的提交歷史整理成直線 ↩︎

  4. 免費託管開源代碼的遠程倉庫 ↩︎

  5. 國內的Git託管服務 ↩︎

發佈了43 篇原創文章 · 獲贊 32 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章