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
可以把工作區的檔案還原成暫存區的或版本庫中的檔案- 如果暫存區有此檔案,使用暫存區的版本替換工作區檔案,與
git reset HEAD file
區別是,git reset
不會影響工作區的檔案,但git checkout --
會替換工作區的檔案。 - 如果暫存區沒有此檔案,但版本庫中有,則使用版本庫檔案替換工作區檔案
- 如果暫存區有此檔案,使用暫存區的版本替換工作區檔案,與
總結
如果當前工作區改亂了,還沒新增到暫存區;可以使用
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
解決辦法,兩種:
使用 ssh 模式 ,配置免登入,參考我的免登入配置文章 https://blog.csdn.net/sanri1993/article/details/52203010
配置全域性使用者名稱密碼和跳過 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-ma