30 分鐘精通 Git- 學不會來找我
一、 版本控制工具
1.1. 什麼是版本控制系統?
版本控制系統(Version Control System): 是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。版本控制系統不僅可以應用於軟件源代碼的文本文件,而且可以對任何類型的文件進行版本控制。
常見的版本控制系統有:cvs、svn、git
1.2. 爲什麼要有版本控制系統?
-
- 在開發過程中,經常需要對一個文件進行修改甚至刪除,但是我們又希望能夠保存這個文件的歷史記錄,如果通過備份,那麼管理起來會非常的複雜。
-
- 在多人開發時,如果需要多人合作開發一個頁面,那麼修改以及合併也會非常的棘手。容易出現衝突。
1.3. 版本控制系統分類
關於版本控制
本地版本控制系統
本地版本控制系統就是在一臺機器上,記錄版本的不同變化,保證內容不會丟失
缺點:如果多人開發,每個人都在不同的系統和電腦上開發,沒辦法協同工作。
集中式版本控制系統
svn/cvs 都是集中式的版本控制系統
-
- 需要一箇中央服務器來管理代碼的的版本和備份
-
- 所有的用戶電腦都是從中央服務器獲取代碼或者是將本地的代碼提交到中央服務器
-
- 依賴於網絡環境,如果連不上中央服務器,就無法提交和獲取代碼。
-
- 如果中央服務器宕機,所有人都無法工作。
分佈式版本控制系統
git 是分佈式的版本控制系統。
-
- 需要一臺服務器作爲代碼倉庫
-
- 每個用戶電腦都是一個服務器(代碼倉庫),並且和代碼倉庫是鏡像的,用戶修改和獲取代碼都是提交到自己的服務器當中。
-
- 不需要網絡就可以進行工作。
-
- 當連接網絡時,用戶可以選擇將自己的服務器與代碼倉庫進行同步。
二、 git
2.1. git 介紹
Git 是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。
Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。
2.2. git 安裝
下載地址
# 推薦使用國內鏡像下載 http://npm.taobao.org/mirrors/git-for-windows
1. 不要安裝在中文目錄
2. 不要使用桌面管理軟件
安裝很簡單,一直下一步即可。在任意的目錄下右鍵,能夠出現下圖,表示安裝成功了。
git 用法方式主要有兩種,
-
git gui,即圖形化界面的方式
-
git bash,命令行的方式
bash 是 linux 系統的命令,因此學習 git 前,我們先學習一下 bash
-
- 在任意文件夾中,都可以使用右鍵,通過 git bash here 打開命令行窗口,此時的路徑就是當前目錄。
-
- 窗口上右鍵,通過 options-->Text-->select 可以調整字體的大小。
# cd 改變目錄 (change directory)
cd images #進入images文件夾
cd .. #進入上一層目錄
cd ~ #進入用戶根目錄
# tab 自動補全,當我們輸命令或者目錄很長時,可以使用tab鍵進行自動補全。
# 按兩次tab,會把所有符合要求的內容都列出來。
# pwd 打印當前目錄的路徑 (print work directory)
pwd
# ls 展示當前目錄列表(list)
ls # 展示當前目錄
ls -a # 展示全部內容,包括隱藏文件
ls -l # 以列表的形式展示內容
ls -al # 以列表的形式展示所有的內容,包括隱藏文件。
ls --help # 查看ls所有的參數。
ls -l images # 展示images目錄下的文件,如果沒有寫目錄,默認展示當前目錄。
# clear reset清屏
clear # 清除屏幕內容,滾動條,保留了歷史
reset # 重置,歷史記錄沒了。
# mkdir 創建一個文件夾 (make directory)
mkdir css # 創建一個css的文件夾
mkdir css img js # 創建了三個文件夾
# rmdir 刪除一個空的文件夾(沒啥用)
rmdir img # 刪除文件夾
# touch 創建文件
touch index.html #創建了一個index.html文件
touch css/index.css # 在css目錄下創建idnex.css文件
# rm 刪除一個文件獲取文件夾
rm index.html # 刪除index.html文件
rm js # 刪除空的js文件夾
rm -r css # 遞歸刪除一個文件夾
# mv 移動文件(move)
mv index.html js # 將html文件移動到js文件夾中
mv index.html index2.html # 將index.html重命名爲index2.html
# cp 複製文件(cp)
cp index.html index2.html # 複製index.html文件,命名爲index2.html
cp -r css css02 # 如果複製的是文件夾,需要使用-r參數。
# cat 查看文件全部內容
cat index.html
# less 查看文件部分內容
less index.html
# q退出查看
2.3. 基本操作
-
- 初始化 git 倉庫 git init
-
- 查看當前 git 倉庫的狀態 git status
-
- 將文件添加到 git 的暫存區 git add 文件名
-
- 將文件由暫存區提交到倉庫區 git commit -m '提交說明'
-
- 查看提交日誌 git log
# 初始化git倉庫,會在當前目錄生成一個隱藏文件夾 .git 不要去修改這個文件夾下的任意東西。
git init
# 查看git的狀態 ,如果此時新建一個文件,那麼這個文件是沒有被追蹤的,說白了git還沒有管理這個新建的文件
git status
# 讓git管理這個新建的文件
git add index.html
# 讓文件由暫存區提交到倉庫區。此時文件才真正的被git管理了。
# 如果提交日誌亂碼,右鍵-->options-->Text-->將編碼改成utf-8
git commit -m '第一次提交'
# 查看提交日誌
git log
2.4. 配置郵箱和用戶名
如果第一次使用 git,會要求設置用戶名和郵箱
# git config user.name 你的目標用戶名
# git config user.email 你的目標郵箱名
# 這種配置方式只有在當前倉庫生效
git config user.name shuaige
git config user.email 669104343@qq.com
# 可以使用--global參數,配置全局的用戶名和郵箱,這樣別的git倉庫就不需要重新配置了。
# 如果同時配置了局部的和全局的,那麼局部的用戶名和郵箱將會生效。
git config --global user.name shuaige
git config --global user.email 669104343@qq.com
# 查看配置信息
git config --list
2.5. git 的工作原理
2.6. git 命令詳解
2.6.1. git add(重點)
-
作用:將文件由 工作區 添加到 暫存區,暫存文件
-
命令:
git git add 文件名
-
例如: git add index.html
-
git add --all 或者 git add -A 或者 git add .(簡寫) 添加所有文件
-
git add a.txt b.txt 同時添加兩個文件
-
git add *.js 添加當前目錄下的所有 js 文件
2.6.2. git checkout 文件名
-
作用:暫存區的內容恢復到工作區。
-
git checkout 1.txt 將暫存區中 1.txt 文件恢復到工作區
2.6.3. git commit(重點)
-
作用:將文件由 暫存區 添加到 倉庫區
-
git commit -m "提交說明"
2.6.4. git status
-
作用:查看文件的狀態
-
命令:git status
-
命令:git stauts -s 簡化日誌輸出格式
2.6.5. git log
-
作用:查看提交日誌
-
git log 只能查看當前 head 以及以前的日誌
-
git log --oneline 簡潔的日誌信息
-
git reflog 查看所有的提交變更日誌
2.6.6. git reset
-
作用:版本回退,將代碼恢復到已經提交的某一個版本中。
-
git reset --hard 版本號 將代碼回退到某個指定的版本 (版本號只要有前幾位即可)
-
git reset --hard head~1
將版本回退到上一次提交
-
~1: 上一次提交
-
~2: 上上次提交
-
~0: 當前提交
2.7. git 忽視文件
在倉庫中,有些文件是不想被 git 管理的,比如數據的配置密碼、寫代碼的一些思路等。git 可以通過配置從而達到忽視掉一些文件,這樣這些文件就可以不用提交了。
-
在倉庫的根目錄創建一個. gitignore 的文件,文件名是固定的。
-
將不需要被 git 管理的文件路徑添加到. gitignore 中
# 忽視idea.txt文件
idea.txt
# 忽視.gitignore文件
.gitignore
# 忽視css下的index.js文件
css/index.js
# 忽視css下的所有的js文件
css/*.js
# 忽視css下的所有文件
css/*.*
# 忽視css文件夾
css
三、 git 分支操作
分支就是科幻電影裏面的平行宇宙,當你正在電腦前努力學習 Git 的時候,另一個你正在另一個平行宇宙裏努力學習 SVN。
如果兩個平行宇宙互不干擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了 Git 又學會了 SVN!
3.1. 爲什麼要有分支?
-
如果你要開發一個新的功能,需要 2 周時間,第一週你只能寫 50% 代碼,如果此時立即提交,代碼沒寫完,不完整的代碼會影響到別人無法工作。如果等代碼寫完再提交,代碼很容易丟失,風險很大。
-
有了分支,你就可以創建一個屬於自己的分支,別人看不到,也不影響別人,你在自己的分支上工作,提交到自己的分支上,等到功能開發完畢,一次性的合併到原來的分支。這樣既安全,又不影響他人工作。
-
在工作過程中,經常會碰到多任務並行開發 的情況,使用分支就能很好的避免任務之間的影響。
-
其他版本工具比如 svn,cvs 中也有分支這個概念,但是這些工具中的分支操作非常的慢,形同擺設。
3.2. 分支操作的命令
3.2.1. 創建分支
-
git branch 分支名稱創建分支,分支中的代碼,在創建時與當前分支的內容完全相同。
-
git 在第一次提交時,就有了一個叫 master 的主分支。
3.2.2. 查看分支
-
git branch 可以查看所有的分支,
-
在當前分支的前面會有一個 *
3.2.3. 切換分支
-
git checkout 分支名稱切換分支
-
在當前分支的任何操作,都不會影響到其他的分支,除非進行了分支合併。
-
切換分支之前,必須保證代碼已經提交了
3.2.4. 創建並切換分支
- git checkout -b 分支名稱 創建並切換分支
3.2.5. 刪除分支
-
git branch -d 分支名稱 可以刪除分支
-
注意:不能在當前分支刪除當前分支,需要切換到其他分支才能刪除。
-
注意:master 分支是可以刪除的,但是不推薦那麼做。
3.2.6. 合併分支
-
git merge 分支名稱 將其他分支的內容合併到當前分支。
-
在 master 分支中執行 git merge dev 將 dev 分支中的代碼合併到 master 分支
3.3. git 分支的工作原理
3.4. git 合併衝突
-
對於同一個文件,如果有多個分支需要合併時,容易出現衝突。
-
合併分支時,如果出現衝突,只能手動處理,再次提交,一般的作法,把自己的代碼放到衝突代碼的後面即可。
四、遠程倉庫
所有的程序員都可以通過遠程倉庫來進行版本的共享,達到所有人的代碼一致的效果。
4.1. 遠程倉庫相關的命令
4.1.1. git push
-
作用:將本地代碼提交到遠程倉庫
-
git push 倉庫地址 master 在代碼提交到遠程倉庫,注意 master 分支必須寫,不能省略
-
例子:git push git@github.com:hucongcong/test.git master 如果第一次使用,需要填寫 github 的用戶名和密碼
4.1.2. git pull
-
作用:將遠程的代碼下載到本地
-
git pull 代碼地址 將遠程的代碼中 master 分支下載到本地
-
通常在 push 前,需要先 pull 一次。
4.1.3. git clone
-
作用:克隆遠程倉庫的代碼到本地
-
git clone 倉庫地址 自定義本地倉庫名 將整個倉庫克隆到本地
4.1.4. git remote
每次 push 和 pull 操作都需要帶上遠程倉庫的地址,非常的麻煩,我們可以給倉庫地址設置一個別名
- git remote add 倉庫別名 倉庫地址
使用倉庫別名替代倉庫地址。倉庫別名相當於一個變量,倉庫地址就是對應的值。
-
git remote add hucc git@github.com:hucongcong/test.git 設置了一個 hucc 的倉庫別名,以後 push 和 pull 都可以不用倉庫地址,而用 hucc
-
git remote remove hucc 刪除 hucc 這個倉庫別名。
-
git remote 查看所有的倉庫別名
-
如果使用了 git clone 命令從遠程倉庫獲取下來的,那麼這個本地倉庫會自動添加一個 origin 的遠程地址,指向的就是克隆的遠程地址。
4.2. github
git 與 github 沒有直接的關係。
-
git 是一個版本控制工具。
-
github 是一個代碼託管平臺,是 git 的一個遠程代碼倉庫。
-
將來工作時,公司會有自己的代碼倉庫。
github 官網
開源中國 - git 碼雲
1. gitHub是一個面向開源及私有軟件項目的託管平臺,因爲只支持git 作爲唯一的版本庫格式進行託管,故名gitHub。
2. github免費,代碼所有人都能看到,但是隻有你自己能修改。付費的可以隱藏。
在 github 上創建一個項目,獲取到倉庫的地址。然後就可以將本地的代碼推送到遠程的服務器上。
4.3. SSH 免密碼登陸
(對稱加密與非對稱加密)
每次 push 代碼,都需要輸入用戶名跟密碼,非常的麻煩。因此我們可以配置一個 SSH 免密碼登陸。
-
github 爲了賬戶的安全,需要對每一次 push 請求都要驗證用戶的身份,只有合法的用戶纔可以 push
-
使用 ssh 可以實現免密碼操作(不需要使用密碼)
4.3.1. SSH 免密碼登錄配置
-
1 創建 SSH Key:ssh-keygen -t rsa
-
2 在文件路徑 C:\ 用戶 \ 當前用戶名 \ 找到 .ssh 文件夾
-
3 文件夾中有兩個文件:
-
私鑰:id_rsa
-
公鑰:id_rsa.pub
-
4 在 github -> settings -> SSH and GPG keys 頁面中,新創建 SSH key
-
5 粘貼 公鑰 id_rsa.pub 內容到對應文本框中
-
5 在 github 中新建倉庫或者使用現在倉庫,拿到 git@github.com: 用戶名 / 倉庫名. git
-
6 此後,再次 SSH 方式與 github“通信”,不用輸入密碼確認身份了
五、idea 集成 git
5.1.idea 配置 git
首先,確保本地已經安裝過 git 客戶端,idea 會進行自動檢測,如果沒有,或者想進行手動調整,需要在這裏重新配置。配置成功之後可以通過點擊 Test 按鈕測試是否 OK!
5.2:idea 上傳項目到本地倉庫
選中指定項目右鍵,選擇 Git 將項目添加到版本控制,然後使用 Commit Directory 提交項目到本地倉庫。
5.3:將本地倉庫項目推送到遠程倉庫
注意:如果沒有配置 ssh 公鑰,第一次本地推送,需要輸入 GitHub 或 gitee 遠程倉庫用戶名密碼。
5.4:idea 設置 git 忽略部分文件
0、安裝. ignore 插件
點擊 File->Settings ,找到 Plugins 搜索 ignore,然後 install,OK 重啓 idea
1、創建項目,在項目中添加. gitignore 文件
建議. gitignore 文件內容
######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out
gen
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
!*/build/*.java
!*/build/*.html
!*/build/*.xml
# .gitignore文件內容編寫規則
*.a # 忽略所有 .a 結尾的文件
!lib.a # 但 lib.a 除外
/TODO # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目錄下的所有文件
doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
2、創建本地倉庫
$ git init
3、創建個人分支
$ git checkout -b dev
4、添加文件到版本控制,提交到本地倉庫
$ git add .
$ git commit -m "first commit"
5、推送到遠程倉庫
$ git push https://gitee.com/liyunyi/ssm.git dev
6、合併分支推送到主分支
$ git checkout master
$ git merge dev
$ git push https://gitee.com/liyunyi/ssm.git master
5.5:克隆遠程倉庫項目到本地
附件:命令大全
-
Workspace:工作區
-
Index / Stage:暫存區
-
Repository:倉庫區(或本地倉庫)
-
Remote:遠程倉庫
1、倉庫
# 在當前目錄新建一個Git代碼庫
$ git init
# 新建一個目錄,將其初始化爲Git代碼庫
$ git init [project-name]
# 下載一個項目和它的整個代碼歷史
$ git clone [url]
2、配置
# 顯示當前的Git配置
$ git config --list
# 編輯Git配置文件
$ git config -e [--global]
# 設置提交代碼時的用戶信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
3、增加 / 刪除文件
# 添加指定文件到暫存區
$ git add [file1] [file2] ...
# 添加指定目錄到暫存區,包括子目錄
$ git add [dir]
# 添加當前目錄的所有文件到暫存區
$ git add .
# 添加每個變化前,都會要求確認
# 對於同一個文件的多處變化,可以實現分次提交
$ git add -p
# 刪除工作區文件,並且將這次刪除放入暫存區
$ git rm [file1] [file2] ...
# 停止追蹤指定文件,但該文件會保留在工作區
$ git rm --cached [file]
# 改名文件,並且將這個改名放入暫存區
$ git mv [file-original] [file-renamed]
4、代碼提交
# 提交暫存區到倉庫區
$ git commit -m [message]
# 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]
# 提交工作區自上次commit之後的變化,直接到倉庫區
$ git commit -a
# 提交時顯示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,幷包括指定文件的新變化
$ git commit --amend [file1] [file2] ...
5、分支
# 列出所有本地分支
$ git branch
# 列出所有遠程分支
$ git branch -r
# 列出所有本地分支和遠程分支
$ git branch -a
# 新建一個分支,但依然停留在當前分支
$ git branch [branch-name]
# 新建一個分支,並切換到該分支
$ git checkout -b [branch]
# 新建一個分支,指向指定commit
$ git branch [branch] [commit]
# 新建一個分支,與指定的遠程分支建立追蹤關係
$ git branch --track [branch] [remote-branch]
# 切換到指定分支,並更新工作區
$ git checkout [branch-name]
# 切換到上一個分支
$ git checkout -
# 建立追蹤關係,在現有分支與指定的遠程分支之間
$ git branch --set-upstream [branch] [remote-branch]
# 合併指定分支到當前分支
$ git merge [branch]
# 選擇一個commit,合併進當前分支
$ git cherry-pick [commit]
# 刪除分支
$ git branch -d [branch-name]
# 刪除遠程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
6、標籤
# 列出所有tag
$ git tag
# 新建一個tag在當前commit
$ git tag [tag]
# 新建一個tag在指定commit
$ git tag [tag] [commit]
# 刪除本地tag
$ git tag -d [tag]
# 刪除遠程tag
$ git push origin :refs/tags/[tagName]
# 查看tag信息
$ git show [tag]
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
# 新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]
7、查看信息
# 顯示有變更的文件
$ git status
# 顯示當前分支的版本歷史
$ git log
# 顯示commit歷史,以及每次commit發生變更的文件
$ git log --stat
# 搜索提交歷史,根據關鍵詞
$ git log -S [keyword]
# 顯示某個commit之後的所有變動,每個commit佔據一行
$ git log [tag] HEAD --pretty=format:%s
# 顯示某個commit之後的所有變動,其"提交說明"必須符合搜索條件
$ git log [tag] HEAD --grep feature
# 顯示某個文件的版本歷史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 顯示指定文件相關的每一次diff
$ git log -p [file]
# 顯示過去5次提交
$ git log -5 --pretty --oneline
# 顯示所有提交過的用戶,按提交次數排序
$ git shortlog -sn
# 顯示指定文件是什麼人在什麼時間修改過
$ git blame [file]
# 顯示暫存區和工作區的差異
$ git diff
# 顯示暫存區和上一個commit的差異
$ git diff --cached [file]
# 顯示工作區與當前分支最新commit之間的差異
$ git diff HEAD
# 顯示兩次提交之間的差異
$ git diff [first-branch]...[second-branch]
# 顯示今天你寫了多少行代碼
$ git diff --shortstat "@{0 day ago}"
# 顯示某次提交的元數據和內容變化
$ git show [commit]
# 顯示某次提交發生變化的文件
$ git show --name-only [commit]
# 顯示某次提交時,某個文件的內容
$ git show [commit]:[filename]
# 顯示當前分支的最近幾次提交
$ git reflog
8、遠程同步
# 下載遠程倉庫的所有變動
$ git fetch [remote]
# 顯示所有遠程倉庫
$ git remote -v
# 顯示某個遠程倉庫的信息
$ git remote show [remote]
# 增加一個新的遠程倉庫,並命名
$ git remote add [shortname] [url]
# 取回遠程倉庫的變化,並與本地分支合併
$ git pull [remote] [branch]
# 上傳本地指定分支到遠程倉庫
$ git push [remote] [branch]
# 強行推送當前分支到遠程倉庫,即使有衝突
$ git push [remote] --force
# 推送所有分支到遠程倉庫
$ git push [remote] --all
9、撤銷
# 恢復暫存區的指定文件到工作區
$ git checkout [file]
# 恢復某個commit的指定文件到暫存區和工作區
$ git checkout [commit] [file]
# 恢復暫存區的所有文件到工作區
$ git checkout .
# 重置暫存區的指定文件,與上一次commit保持一致,但工作區不變
$ git reset [file]
# 重置暫存區與工作區,與上一次commit保持一致
$ git reset --hard
# 重置當前分支的指針爲指定commit,同時重置暫存區,但工作區不變
$ git reset [commit]
# 重置當前分支的HEAD爲指定commit,同時重置暫存區和工作區,與指定commit一致
$ git reset --hard [commit]
# 重置當前HEAD爲指定commit,但保持暫存區和工作區不變
$ git reset --keep [commit]
# 新建一個commit,用來撤銷指定commit
# 後者的所有變化都將被前者抵消,並且應用到當前分支
$ git revert [commit]
# 暫時將未提交的變化移除,稍後再移入
$ git stash
$ git stash pop
10、其他
# 生成一個可供發佈的壓縮包
$ git archive
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/5ZDrfIKSfSmmBk3Tk165uQ