Git 從入門到熟練|不敢說精通

前言

如果有一定版本管理軟件基礎或使用過 svn 的你,這篇 git 的文章應該是最適合你的。作者也是從 svn 過來,從開始的覺得 git 麻煩,到最後還是感覺 git 是最好用的版本控制軟件。

雖然,大部分情況下,IDEA 已經對 Git 兼容特別好;可以完成大部分的 Git 的提交,push ,合併等操作,但有時候一些回退的操作還是通過命令來操作會方便點。

預期讀者

  • 有一定軟件版本管理基礎的同學
  • 事先有了解過 git 的同學
  • 想系統學習 git 的同學

文章思路

本文不會像大多數文章一樣,通篇給你介紹一堆的 git 命令。個人認爲,這種命令的東西用多了自然記住了,沒用到的時候記再多,用的時候一樣忘,而且用的時候可以使用 git 的幫助或直接網上搜命令。

文章從 git 的倉庫,分支,常用 git 工具及 git 和 svn 的區別來說明

git 版本庫

git 分爲兩個版本庫,所有 git 信息都保存在 .git 隱藏文件夾中,大部分情況,我們會在本地維護自已的版本信息。

  • 一個是本地版本庫,改動和提交的信息都是保存在本地的,默認會有一個 master 分支
  • 一個遠程倉庫,這是真正和別人協作的倉庫,通過 push ,pull 等來和遠程倉庫提交獲抓取數據

常見的倉庫命令

# 初始化本地倉庫,默認會初始化一個 master 分支 
git init 
# clone 一個遠程倉庫, 創建了一個本地倉庫,一個本地倉庫的 master 分支,拉取遠程倉庫 master 的內容 
git clone address 
# 初始化本地倉庫後,添加一個遠程倉庫
git remote add 倉庫Id 倉庫地址

遠程倉庫的增刪改查,通過在 git 控制檯 git remote 雙擊 tab 即可看到所有操作,包含 rename,remove,set-url,add 等。

官網示例-把代碼添加到版本庫

創建本地版本庫,然後添加遠程版本庫,然後把文件 commit 到本地,最後 push 到遠程版本庫

# 在你的代碼文件夾根目錄中初始化本地版本庫
git init
# 添加需要提交的文件
git add .
# 提交到本地倉庫
git commit -m "初始提交"
# 添加遠程倉庫,並命倉庫名爲 test
git add test [email protected]:sanri/test.git
# 推送代碼到遠程版本庫的 master 分支 
git push test master 

本地版本庫(又叫工作區)

工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫(Repository)。

工作區,暫存區,版本庫

Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD

  • git add 實際就是把文件添加進了暫存區
  • git commit 把暫存區的所有內容提交到了版本庫

Git 和 Svn 的區別

Git跟蹤並管理的是修改,而非文件,你每次修改工作區中的內容,都需重新添加到暫存區才能提交。

Svn 是跟蹤文件的,文件狀態:untracked -> tracked -> commited

Git 是跟蹤修改的,只要文件有修改,就需添加到暫存區,然後提交

撤銷修改

建議下載 sourceTree 來看這部分內容,比 git status 會更加清晰,它會明確的給你標出暫存區,工作區,本地倉庫和遠程倉庫。

  • git add 添加到暫存區了,想撤回

    git reset HEAD file 不加 file 表示全部撤回,只是撤回添加,不會影響工作區文件

  • git commit 添加到版本庫了,想撤回

    git reset --soft HEAD^ ^ 表示撤回一次提交,關於有幾次提交,在 IDEA 中可以看得更清楚

    這個撤回撤回到了暫存區,也不會影響工作區文件。

  • 再使用 git checkout -- file 可以把工作區的文件還原成暫存區的或版本庫中的文件

    1. 如果暫存區有此文件,使用暫存區的版本替換工作區文件,與 git reset HEAD file 區別是,git reset 不會影響工作區的文件,但 git checkout -- 會替換工作區的文件。
    2. 如果暫存區沒有此文件,但版本庫中有,則使用版本庫文件替換工作區文件
總結
  • 如果當前工作區改亂了,還沒添加到暫存區;可以使用 git checkout -- file 來還原。
  • 如果改亂的代碼添加到了暫存區,還沒提交; 先撤回暫存區文件,然後使用 git checkout -- file 還原來版本庫版本

    git reset HEAD file git checkout -- file

  • 如果改亂的代碼已經提交,還沒有推送到遠程庫 ;先查看需要的 commitId ,然後git checkout commitId file

git 分支管理

本地倉庫和遠程倉庫都會有分支,一般來說是一一對應的,創建倉庫時會默認初始化一個 master 分支。

真實項目如何建立分支

建立倉庫時,會有一個默認分支master 分支,現已經基本約定這個分支是可以隨時發佈的分支。

最佳分支管理實踐

個人理解 :

  • master 分支,用於發佈可用版本 *
  • develop 分支,用於開發目前的需求 *
  • test 分支,即上面鏈接中說的的 release 分支,用於測試和修改 bug 。從 develop 分支創建,上線時合併進 master 和 develop 並刪除,改 bug 後合併進 develop 分支
  • hotfix 分支,從 master 分支創建,用於修改線上 bug ,然後合併回 master 和 develop

解決衝突

當拉取遠程代碼的時候,如果你和別人改的是同一個文件,則很有可能出現衝突,展示如下

$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

查看 readme.txt 的內容

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

<<<<<<< HEAD 表示遠程的內容,>>>>>>> feature1 表示你的分支的內容,中間用 ======== 分隔,有幾個這樣的區志就是有幾個衝突,使用 compare 可 idea 工具解決衝突後,然後重新添加,提交,推送。

常用 Git 工具及下載地址

SourceTree 工具

Git 工具

SourceTree 的安裝

在需要註冊的時候,關閉安裝,然後找到 %LOCALAPPDATA%\Atlassian\SourceTree 添加文件 accounts.json 內容如下:

[
  {
    "$id": "1",
    "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
    "Authenticate": true,
    "HostInstance": {
      "$id": "2",
      "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
      "Host": {
        "$id": "3",
        "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
        "Id": "atlassian account"
      },
      "BaseUrl": "https://id.atlassian.com/"
    },
    "Credentials": {
      "$id": "4",
      "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
      "Username": "",
      "Email": null
    },
    "IsDefault": false
  }
]

常見問題解決

忽略特殊文件

.git 目錄添加一個文件 .gitignore 每一行是忽略的文件,可以使用能配符,目錄。

被 github 標記爲 javascript 標籤的問題

可能你的項目中 js 腳本比較多,被 github 自動判斷爲 javascript 項目了,可以強制改回來,git 目錄添加一個文件 .gitattributes 內容爲

*.js linguist-language=Java

ssl 證書錯誤,或一直需要用戶名密碼

fatal:unable to access ': SSL certicate problem: unable to get local issuer certificate

解決辦法,兩種:

  1. 使用 ssh 模式 ,配置免登錄,參考我的免登錄配置文章 https://blog.csdn.net/sanri1993/article/details/52203010
  2. 配置全局用戶名密碼和跳過 ssl 認證

    # 跳過 ssl 認證
    git config --global http.sslVerify false
    # 存儲用戶名密碼認證信息,不需要每次都輸入用戶名密碼
    git config --global credential.helper store

常用命令

# 初始化本地倉庫,默認會初始化一個 master 分支 
git init 
# clone 一個遠程倉庫, 創建了一個本地倉庫,一個本地倉庫的 master 分支,拉取遠程倉庫 master 的內容 
git clone address 
# 初始化本地倉庫後,添加一個遠程倉庫
git remote add 倉庫Id 倉庫地址

# 創建分支
git branch 分支名
# 合併分支到當前分支
git merge 分支名
# 切換分支
git checkout 分支名

# 版本還原相關
git reset --mixed # 此爲默認方式,不帶任何參數的git reset,它 回退 commit 和 add 信息
git reset --soft # 回退到某個版本,只回退了commit的信息。如果還要提交,直接commit即可
git reset  --hard # 徹底回退到某個版本,本地的源碼也會變爲上一個版本的內容,慎用!
# stage -> workspace                         
    git reset HEAD <files>                 
# repository -> stage                        
    git reset --soft <hash>
    git reset --soft HEAD^
    git reset --soft HEAD~2
# repository -> workspace                    
    git reset --mixed <hash>
# workspace 重置爲 repository 內容          
    git reset --hard <hash>                

# 使某個文件使用上次的內容
git checkout -- file 
# 使某個文件使用某個版本的內容
git checkout commitId file 

一點小推廣

創作不易,希望可以支持下我的開源軟件,及我的小工具,歡迎來 gitee 點星,fork ,提 bug 。

Excel 通用導入導出,支持 Excel 公式
博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi

使用模板代碼 ,從數據庫生成代碼 ,及一些項目中經常可以用到的小工具
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-maven

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