Git學習筆記

img

前言

  • 本文檔筆記是本人經過學習廖雪峯Git教程的整理而來
  • 本文檔主要記錄本人當時在學習過程當中認爲重要的概念和命令
  • 原始連接(轉載請註明出處):Git學習筆記 

建立一個版本庫

mkdir learngit //使用命令建立一個目錄
cd learngit //進入這個目錄
pwd //用於顯示當前目錄

初始化倉庫

git init

添加文件到倉庫

第一步:git add <file>
第二步:git commit -m '本次提交的說明'
git status:查看當前Git倉庫的狀態,是否有文件沒有提交,讓咱們掌握倉庫最新的狀態
git diff: 查看不一樣,當修改文件後,能夠查看修改了什麼內容(只適用於文本文件)

img

實現版本之間回退

git log:顯示從最近到最遠的提交日誌
git log --pretty=oneline:若是信息太多,使用這行命令
  1. 在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上一個版本就是HEAD^^,固然往上100個版本寫100個^比較容易數不過來,因此寫成HEAD~100
  2. 一大串相似882e1e0...67hko896的是commit id 版本號
  3. git reset --hard HEAD^: 回退到上一個版本此時,當再次使用git log命令時,發現以前的版本已經消失了,此時想要再次回到那個版本,有兩種方式:一種是當命令窗口沒有關閉時,找到那個版本的版本號,如:81ac3c5,此時又回到最新的那個版本的命令是:
git reset --hard 81ac3c5

若是已通過去好久了,已經記不得想要回退的版本的ID號,此時能夠依據這個命令來找回版本號:html

git reflog

img

工做區與暫存區的概念

  1. 工做區(Working Directory):就是能在電腦上看到的目錄,好比倉庫文件夾java

  2. 版本庫(Repository):工做區裏有一個隱藏目錄.git ,這個不算工做區,而是git的版本庫前面咱們講了往Git版本庫裏添加文件的時候,分兩步,這兩步更詳細的說是:git

  • 第一步使用git add 把文件添加進去,實際上就是把文件修改添加到暫存區;github

  • 第二步使用git commit提交修改,其實是把暫存區的全部內容提交到當前分支由於咱們建立Git版本庫的時候,Git自動爲咱們建立了惟一的一個master 分支,而git commit就是往 master分支上提交更改。也能夠簡單理解爲須要提交的文件修改統統放到了暫存區,等到要提交的時候,一次性提交暫存區裏全部的文件到分支。數據庫

注意點服務器

git diff 是工做區與暫存區的對比
git diff -- cached 是暫存區與分支的對比
git diff HEAD -- <file> 是工做區與分支的對比app

撤銷修改

在如下三種狀況下能夠撤銷修改:分佈式

  1. 修改了文件,沒有添加到暫存區(修改了工做區)git checkout -- <file>
  2. 修改文件後添加到了暫存區,可是沒有提交到分支(修改了暫存區)git reset HEAD <file> //把暫存區的修改回退到工做區git checkout -- <file>//把工做區的修改撤銷
  3. 已經提交到了本地倉庫分支,沒有同步到遠程倉庫(版本回退便可)git reset --hard HEAD^

刪除文件以及恢復文件

當咱們使用 rm 命令或者直接在圖形界面刪除文件後,只是修改了工做區,若先使用 git rm <file> 命令刪除文件,此時不只修改了工做區,還修改了暫存區,此時使用撤銷修改的命令還能找回被刪除的文件。當刪除操做被提交到分支後,只能使用版本回退操做來找回刪除的文件。學習

git rm <file> 命令至關於先執行了rm命令 ,而後把工做區的修改添加到了暫存區,也就是說使用git rm <file>命令後不只工做區的文件被刪除了,也把刪除操做添加到了暫存區。這就告訴咱們,要想快速刪除文件並提交到分支,只需執行git rm <file> 命令後commit就好了,若是想要更加謹慎,能夠先使用rm 命令刪除工做區中的文件,此時若想要撤銷刪除可使用git checkout -- <file> 命令;若是想要添加修改操做到暫存區,使用git rm <file> 命令,到了這一步若是想要撤銷刪除能夠先使用git reset HEAD <file> 命令撤銷對暫存區的修改,而後使用 git checkout -- <file>命令來撤銷對工做區的修改;若是已經把修改操做提交到了分支,此時想要撤銷刪除,找回文件則只能使用版本回退操做,即便用git reset --hard HEAD^命令。fetch

添加遠程庫,並保持同步

  1. 當咱們的系統以前從未使用SSH進行加密傳輸操做時,咱們應該首先在用戶主目錄下建立SSH Key,由於你的本地Git 倉庫和GitHub 倉庫之間的傳輸是經過SSH 加密的。
    img

  2. 在Github 上建立一個和本地倉庫同名的倉庫,要讓本地倉庫與該遠程倉庫關聯可使用命令:
git remote add origin git@server-name:path/repo-name.git
  1. 關聯後,使用命令git push -u origin master第一次推送master 分支的全部內容
    例如:
    img

  2. 此後,每次本地提交後,要想實現遠程倉庫的同步,只需使用命令git push origin master推送最新的修改

從遠程倉庫克隆

在合適的目錄下使用命令

git clone git@server-name:path/repo-name.git

例如:
img

建立與合併分支

  1. 建立一個名爲dev的分支
git branch dev
  1. 切換到dev分支
git checkout dev
  1. 以上兩步能夠用一條下面的命令完成
git checkout -b dev //加上-b 參數表示建立並切
  1. 查看分支狀況
git branch //這個命令會列出全部的分支,而且在當前分支上會標註星號*
  1. dev分支的工做合併分支master
git checkout master //首先切換到master分支git merge dev //合併指定分支(dev)到當前分支(master)
  1. 刪除分支
git branch -d dev //刪除分支 dev

img

分支合併時衝突解決

當咱們在兩個分支上對同一個文件進行修改,而且修改的內容不同,此時合併這兩個分支時就會產生衝突
img
此時查看該修改的文件時,就會發現Git用<<<<<<<=======>>>>>>>標記出不一樣分支的內容,此時咱們須要手動修改文件,刪除Git的標記,而後將修改後的文件先添加到暫存區,而後提交到分支
img
提交成功後使用命令:git log --graph --pretty=oneline --abbrev-commit能夠看到分支合併圖

分支管理策略

一般,合併分支的時候,Git會使用Fast forward模式,當是在這種模式下刪除分支後就會丟掉分支的信息,若是咱們想要在刪除分支後還想在分支歷史上看到分支的信息就能夠強制禁用Fast forward 模式,此時Git 會在合併分支時生成一個新的commit:強制禁用Fast forward 模式的命令:

git merge --no-ff -m 'merge with no-ff' dev //由於本次合併會生成一個commit ,因此須要加上 -m 參數說明

img

保存現場,修復bug後恢復

咱們在開發過程當中須要常常修復軟件中發現的bug,在git中咱們就能夠經過建立一個臨時的分支來修復bug,修復bug後合併分支,而後刪除臨時分支
可是若是咱們在dev分支上的內容還沒提交怎麼辦,此時咱們可使用命令來保存現場:

git stash

此時再查看Git庫的狀態就是乾淨的。當咱們在master分支上經過建立臨時分支修復bug後,再checkoutdev分支時,咱們有兩條命令均可以恢復修復bug以前dev分支的狀態:

(1)git stash apply // 恢復工做現場,可是不刪除現場,就是說之後還能夠恢復到該狀態
(2)git stash pop // 恢復工做現場後刪除stash的內容

咱們可使用命令git stash list 來查看有多少現場被保存了,咱們也能夠屢次使用stash,恢復的時候,經過 list後查看stash 的值, 而後經過恢復現場的命令來選擇回到具體哪個現場,如:

(1) git stash apply stash@{1}  //恢復到 stash@{1} 後不刪除該現場
(2) git stash pop stash@{0} //恢復到 stash@{0} 後刪除該現場

強行刪除沒有徹底合併的分支

當咱們要添加一個新功能時咱們會新建一個分支來進行添加,等到要合併新功能的分支到主分支時,接到通知說該新功能不須要了,此時若是咱們刪除該新功能分支會提示咱們該新功能分支沒有徹底合併,若是確認要刪除它,執行:git branch -D <分支名稱>使用這個命令就能夠刪除未合併的分支,其實就是將小寫 d 換成大寫D

多人協做開發

咱們通常在開發中都是多人協做開發項目的,當你clone你的另外一名小夥伴的項目庫到你電腦上後,默認你只能看到該項目的本地master分支,你若是想要在dev分支上開發,就必須建立遠程origindev分支到本地來,使用的命令是:

git checkout -b dev origin/dev

這樣你就能夠繼續在dev上修改,修改完以後還能夠 push dev分支到遠程庫,可是若是你的小夥伴也push了一次到遠程庫,而且此時你和你的小夥伴都對一樣的文件進行了修改,你如今試圖推送該分支到遠程庫,結果出現
img
推送失敗,由於你的提交與你小夥伴的最新提交之間有衝突。此時根據提示咱們先用git pull把最新的提交從 origin/dev抓取下來,而後在本地合併解決衝突後而後提交分支而且推送dev到遠程庫。有的時候,咱們git pull也會失敗,緣由是由於沒有指定本地 dev 分支與遠程origin/dev 分支的連接。咱們根據提示,設置連接
設置的命令如提示:

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

此時就能夠git pull 了,可是在本地合併時還會有衝突,此時咱們經過手動解決衝突後而後推送到遠程庫。
img
小結

  • 查看遠程庫的信息,使用命令git remote -v
  • 本地新建的分支若是不推送到遠程對其餘人是不可見的
  • 在本地建立和遠程分支對應的分支使用git checkout -b branch-name origin/branch-name 本地和遠程分支的名稱最好一致

建立和操做標籤

爲了更加方便的操做不一樣的版本,使用commit號(如:fs3k1hgk)是很是不方便的,若是使用版本號如v 1.2等標號就能很快的確認一個版本.
標籤:tag就是一個讓人容易記住的有意義的名字,它跟某一個commit 綁在一塊兒。它能夠相似的理解爲 IP 與域名的關係.

  1. 使用以下命令用於新建一個標籤,默認爲HEAD,也能夠指定一個commit id
git tag <tagname> 
如:git tag v1.0
git tag <tagname> <commit id> 
如:git tag v1.0 ew326gd | git tag v 1.0 HEAD@{1}

img

注: 標籤不是按時間順序列出,而是按字母排序的。能夠用git show <tagname>查看標籤信息

  1. 刪除一個本地標籤git tag -d <tagname>
  2. 推送一個本地標籤到遠程庫git push origin <tagname>
  3. 推送所有未推送到遠程庫的標籤到遠程庫git push origin --tags
  4. 刪除一個已經推送到遠程庫的標籤
git tag -d <tagname> //先刪除本地標籤
git push origin:refs/tags/<tagname> // 再刪除遠程標籤

一個本地庫關聯多個遠程庫

因爲git自己是分佈式版本控制系統,能夠同步多個不一樣的遠程庫。例如能夠同時同步到GitHUb和碼雲,可是咱們在使用多個遠程庫時要注意,由於git給遠程庫起的默認名稱是origin,若是有多個遠程庫,咱們就須要使用不一樣的名稱來標識不一樣的遠程庫。
通常關聯多個遠程庫分爲下面幾個步驟:

  1. 若是以前關聯過一個遠程庫,且遠程庫的名稱是默認的origin,此時你能夠繼續保留這個庫或者先刪除這個庫,而後再關聯而且起一個更加有辨識度的名稱
git remote rm origin //刪除已經關聯的名爲origin 的遠程庫
  1. 接着再關聯如GitHub上的遠程庫,並將遠程庫的名稱叫作 GitHub,不使用默認的名稱
git remote add github git@github.com:dmego/learngit.git
  1. 而後再關聯一個遠程倉庫,如碼雲上的遠程庫,並將遠程庫的名稱叫作gitee
git remote add gitee git@gitee.com:dmocgo/learngit.git
  1. 如今,咱們用git remote -v查看遠程庫信息,能夠看到兩個遠程庫:
git remote -v
gitee git@gitee.com:dmocgo/learngit.git (fetch)
gitee git@gitee.com:dmocgo/learngit.git (push)
github git@github.com:dmego/learngit.git (fetch)
github git@github.com:dmego/learngit.git (push)
  1. 若是要推送到GitHub,使用命令:
git push github master
  1. 若是要推送到碼雲,使用命令:
git push gitee master

這樣一來,咱們的本地庫就能夠同時與多個遠程庫同步
img

自定義Git

  1. 讓Git命令顯示顏色,輸出更加醒目:
git config --global color.ui true
  1. 忽略特殊的文件,其中忽略文件的原則是:

    忽略操做系統自動生成的文件,如縮略圖
    忽略編譯生成的中間文件,可執行文件,也就是說一個文件時經過其餘文件自動生成的就沒有必要放進版本庫了,例如java編譯產生的.class 文件
    忽略帶有敏感信息的配置文件,好比保存了數據庫密碼的配置文件

咱們在Git工做區的根目錄下建立一個特殊的 .gitignore文件,而後把要忽略的文件名寫進去,Git就會每次在提交的時候自動忽略這些文件,咱們不須要從頭寫一個.gitignore文件,GitHub已經爲咱們準備了各類配置文件,全部的配置文件均可以在線瀏覽:https://github.com/github/gitignore。
有的時候,你想添加一個文件到git ,可是卻發現添加不了,緣由多是這個文件被忽略了,若是想強制添加可使用命令:

git add -f <filename>

還有的時候發現多是 .gitignore文件寫錯了,須要找出來到底哪一個規則寫錯了,可使用命令檢查:

git check-ignore -v <filename>
  1. 配置別名,簡化命令。有時候命令太長或者單詞很差記就可使用Git來配置別名來達到高效的目的,例如將命令git status簡化爲git st:
git config --global alias.st status

注意
--global 參數是全局參數,也就是這些命令在這臺電腦的全部Git 倉庫下均可以使用(是針對當前用戶起做用),若是不加這個參數,就只能對當前倉庫起做用。
每一個倉庫的配置文件都放在.git/config 文件中,其中別名就在 [alias] 後面,要想刪除別名直接把對應的那行刪除就好了
而每一個用戶的配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中。其中別名就在 [alias]後面,要想刪除別名直接把對應的那行刪除就好了。

搭建Git服務器

教程地址:廖雪峯GIt教程

相關文章
相關標籤/搜索