1. 程式人生 > 其它 >Git及Github新手使用保姆級總結教程

Git及Github新手使用保姆級總結教程

技術標籤:GitToolsgitgithub

githubigit

尋找志同道合的學習夥伴,請訪問我的個人網頁.
該內容同步釋出在CSDN耳殼網.

一、Git 和 SVN 的區別
型別描述
Git分散式本地有映象,無網路時也可以提交到本地映象,待到有網路時再push到伺服器
SVN集中式無網路不可以提交, 和 Git 的主要區別是歷史版本維護的位置
二、安裝 :
  1. Git 下載地址 (Linux/Unix, Mac, Windows 等相關平臺)

注意: 以下所有命令都在 Git Bash 中執行,不是 cmd, 拷貝命令的時候不用複製前面的 $ 符號

### 配置所有 Git 倉庫的 使用者名稱 和 email 
$ git config --global user.name "Your Name"
$ git config --global user.email "
[email protected]
" ### 配置當前 Git 倉庫的 使用者名稱 和 email $ git config user.name "Your Name" $ git config user.email "[email protected]" ### 檢視全域性配置的 使用者名稱 和 email $ git config --global user.name 檢視使用者名稱 $ git config --global user.email 檢視郵箱地址 ### 檢視當前倉庫配置的 使用者名稱 和 email $ git config user.name 檢視使用者名稱 $ git config user.email 檢視郵箱地址 # Git 是分散式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址 # git config 命令的 --global 引數,用了這個引數,表示你這臺機器上所有的 Git 倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的使用者名稱和Email地址(不加 --global)。 $ git config --list --show-origin 檢視所有的配置以及它們所在的檔案
三、相關命令
(所有命令都在 Git Bash 中執行)
$ git                           檢視 git 的相關命令 (git --help)
$ git --version                 檢視 git 的版本
$ git config                    檢視 git config 的相關命令
$ git pull origin develop       從遠端(origin) 的 develop 分支拉取程式碼
1. 初始化本地倉庫: 在 Git Bash 中輸入對應的命令
注: 下面所有的命令使用的時候不用拷貝最前面的 $ 符號

$ cd d:
$ mkdir learngit
$ cd learngit
$ pwd

# cd: change directory 改變目錄
# mkdir  建立目錄
# pwd    用於顯示當前目錄
注意: 為避免遇到各種奇怪的問題,確保目錄名 (包括父目錄) 不含中文
# 不想要 git 管理跟蹤的檔案,可以在倉庫根目錄新增 .gitignore 檔案,在裡面寫對應的規則
$ git init              把當前目錄初始化為 git 倉庫
$ ls -ah                檢視當前目錄下的檔案,包含隱藏檔案 (不帶 -ah 看不了隱藏檔案)
2. 新增檔案到倉庫
$ git add <file>              如: git add readme.txt
$ git commit -m "description"     如: git commit -m "add readme.txt"

# 新增檔案到倉庫分兩步:
# 1. add 新增該檔案到倉庫, 
# 新增許多同種型別的檔案,可以使用萬用字元 * (記得加引號)  如: git add "*.txt"  命令就是新增所有 .txt 檔案
# 2. commit 提交該檔案到倉庫, description 為你對該次提交的描述說明, 
注意: 可以多次 add 不同的檔案,commit 可以一次提交多個檔案
3. 檢視倉庫目前狀態 (專案是否有修改、新增、未追蹤的檔案等)
$ git status
4. 檢視修改內容,檢視檔案不同 (difference)
$ git diff 
$ git diff <file>                
$ git diff --cached
$ git diff HEAD -- <file>
# git diff 檢視工作區(work dict)和暫存區(stage)的區別
# git diff --cached 檢視暫存區(stage)和分支(master)的區別
# git diff HEAD -- <file> 檢視工作區和版本庫裡面最新版本的區別
如: git diff readme.txt  表示檢視 readme.txt 修改了什麼,有什麼不同
5. 檢視提交日誌
$ git log
$ git log --oneline     #美化輸出資訊,每個記錄顯示為一行,顯示 commit_id 前幾位數
$ git log --pretty=oneline     #美化輸出資訊,每個記錄顯示為一行,顯示完整的 commit_id
$ git log --graph --pretty=format:'%h -%d %s (%cr)' --abbrev-commit --
$ git log --graph --pretty=oneline --abbrev-commit

# 顯示從最近到最遠的提交日誌
# 日誌輸出一大串類似 3628164...882e1e0 的是commit_id (版本號),和 SVN 不一樣,Git 的commit_id 不是 1,2,3…… 遞增的數字,而是一個 SHA1 計算出來的一個非常大的數字,用十六進位制表示, 因為 Git 是分散式的版本控制系統,當多人在同一個版本庫裡工作,如果大家都用 1,2,3……作為版本號,那肯定就衝突了
# 最後一個會打印出提交的時間等, (HEAD -> master)指向的是當前的版本
# 退出檢視 log 日誌,輸入字母 q (英文狀態)
6. 版本回退
$ git reset --hard HEAD^
$ git reset --hard <commit_id>

# HEAD    表示當前版本,也就是最新的提交
# HEAD^   上一個版本
# HEAD^^  上上一個版本
# HEAD~100   往上100個版本

# 回退到 commit_id 對應的那個版本,commit_id 為版本號,只需要前幾位就行
7. 檢視命令歷史 (用於版本切換)
$ git reflog
# 假如我們依次提交了三個版本 a->b->c,然後昨天我們從版本 c 回退到了版本 b,今天我們又想要回到版本 c,此時就可以使用 reflog 命令來查詢 c 版本的 commit_id,然後使用 reset 命令來進行版本回退
8. 撤銷修改

######- 丟棄工作區 (Working Directory) 的修改

$ git restore <file>  (建議使用) (如: git restore readme.txt)
$ git checkout -- <file>
# 命令中 -- 很重要,沒有就變成 “切換到另一個分支” 的命令

######- 丟棄暫存區 (stage/index) 的修改

# 第一步: 把暫存區的修改撤銷掉(unstage),重新放回工作區
$ git restore --staged <file>

# 第二步: 撤銷工作區的修改
$ git restore <file>

######- 小結

  • 當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git restore <file>
  • 當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git restore --staged <file>,就回到了場景1,第二步按場景1操作。
  • 已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考 版本回退 一節,不過前提是沒有推送到遠端庫。
9. 刪除檔案
$ git rm <file>

# git rm <file> 相當於執行
- rm <file>
- git add <file
其他命令
$ cat <file>    顯示檔案內容,如: cat readme.txt 就是在 git bash 中顯示該檔案內容
$ cd ~         進入使用者主目錄
$ open ~/.ssh  Mac 開啟存放 ssh 資料夾
四、相關名詞理解 :
1. 工作區 (Working Directory): 自己電腦裡能看到的目錄
2. 版本庫 (Repository): 工作區有一個隱藏目錄 .git,這個不算工作區,而是 Git 的版本庫

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

五、遠端倉庫 :
1. 建立 SSH Key
$ ssh-keygen -t rsa -C "[email protected]"
# 郵件地址換成你自己的郵件地址,然後一路回車,使用預設值即可,由於這個Key也不是用於軍事目的,所以也無需設定密碼。

在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,開啟Shell(Windows下開啟Git Bash),建立SSH Key

如果一切順利的話,可以在使用者主目錄裡找到.ssh目錄,裡面有 id_rsa 和 id_rsa.pub 兩個檔案,這兩個就是 SSH Key 的祕鑰對,id_rsa 是私鑰,不能洩露出去,id_rsa.pub 是公鑰,可以放心地告訴任何人。

2. 登入 GitHub ,在 Settings 中找到 SSH 設定項中新增新的 SSH Key,設定任意 title,在 Key 文字框裡貼上 id_rsa.pub 檔案的內容
# 複製Key用這種方式複製
$ cd ~/.ssh
$ cat id_rsa.pub

$ open ~/.ssh   (Mac 下開啟存放 Github 生成的 ssh Key 資料夾)

$ pbcopy < ~/.ssh/id_rsa.pub  Mac 下拷貝生成的公鑰內容
3. 關聯遠端倉庫 (先有本地倉庫)
$ git remote add origin [email protected]:renyuns/learngit.git
# 後面的地址換成自己的 GitHub 倉庫地址
4. 推送到遠端倉庫
$ git remote       檢視遠端庫資訊
$ git remote -v    檢視遠端庫詳細資訊
$ git remote rm origin  刪除已關聯的遠端庫 origin
$ git push -u origin master    #第一次推送
$ git push origin master      推送本地 master 分支到遠端庫
$ git push origin dev         推送本地 dev 分支到遠端庫
#  除了第一次推送,不需要新增 -u 引數

# 一個本地庫關聯多個遠端庫,例如同時關聯 GitHub 和 Gitee:
# 1. 先關聯GitHub的遠端庫:(注意:遠端庫的名稱叫 github,不叫 origin)
$ git remote add github [email protected]:renyun/learngit1.git
# 2. 再關聯Gitee的遠端庫:(注意:遠端庫的名稱叫 gitee,不叫 origin)
$ git remote add gitee [email protected]:renyun/learngit1.git
# 3. 推送到遠端庫
$ git push github master
$ git push gitee master

加上了-u引數,Git 不但會把本地的 master 分支內容推送的遠端新的 master 分支,還會把本地的 master 分支和遠端的master分支關聯起來

5. 從遠端倉庫克隆 (先有遠端庫)
$ git clone [email protected]:renyuns/gitskills.git
# GitHub 支援多種協議,上面是 ssh 協議,還有 https 協議
六、分支
$ git branch       檢視分支列表及當前分支
$ git branch dev   建立 dev 分支
$ git switch dev   切換到 dev 分支  (git checkout dev)
$ git switch -c dev   建立並切換到新的 dev 分支  (git checkout -b dev)
$ git switch -c dev origin/dev  建立遠端 origin 的 dev 分支到本地並切換到該分支
$ git branch -d dev   刪除 dev 分支
$ git branch -D dev   強制刪除 dev 分支
$ git merge dev       合併 dev 分支到當前分支 (當有衝突的時候,需要先解決衝突)
$ git merge --no-ff -m "merge with no-ff" dev  合併 dev 分支到當前分支(禁用Fast forward 合併策略)

$ git pull  拉取遠端分支最新的內容
$ git branch --set-upstream-to=origin/dev dev  指定本地 dev 分支與遠端 origin/dev 分支的連結

# 為本次合併要建立一個新的commit,所以加上 -m 引數,把commit描述寫進去
# 合併分支時,加上--no-ff 引數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而 fast forward 合併就看不出來曾經做過合併

$ git log --graph  檢視分支合併圖
$ git log --graph --pretty=oneline --abbrev-commit

$ git stash  儲存當前工作區和暫存區的修改狀態,切換到其他分支修復 bug 等工作,然後在回來繼續工作
$ git stash list  檢視儲存現場的列表
$ git stash pop   恢復的同時把 stash 內容也刪除
$ git stash apply  恢復現場,stash內容並不刪除
$ git stash drop   刪除 stash 內容
$ git stash apply [email protected]{0}  多次stash,恢復的時候,先用git stash list檢視,然後恢復指定的stash
# 通常在 dev 分支開發時,需要有緊急 bug 需要馬上處理,儲存現在修改的檔案等,先修復 bug 後再回來繼續工作的情況

$ git cherry-pick <commit> 複製一個特定的提交到當前分支(當前分支的內容需要先 commit,然後衝突的檔案需要解決衝突,然後 commit)

$ git rebase 把本地未push的分叉提交歷史整理成直線(使得我們在檢視歷史提交的變化時更容易,因為分叉的提交需要三方對比)
七、標籤
# 切換到對應的分支 branch 上,檢視或者操作對應的標籤 tag 
$ git tag  檢視所有的標籤
$ git tag <tagname>  打標籤(預設標籤是打在最新提交的commit上) 如: git tag v1.0
$ git tag <tagname> <commit_id>  給對應的 commit_id 打標籤
$ git tag -a <tagname> -m "標籤說明資訊" <commit_id> 建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字
$ git tag -d <tagname> 刪除一個本地標籤
$ git push origin :refs/tags/<tagname>可以刪除一個遠端標籤
$ git show <tagname>  檢視標籤資訊

$ git push origin <tagname>  推送一個本地標籤到遠端
$ git push origin --tags     一次性推送全部尚未推送到遠端的本地標籤

# 刪除遠端標籤,需要先刪除本地標籤,然後在刪除遠端標籤,如:刪除標籤 v0.9
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9
八、相關工具及網站
  1. Git 官網
  2. GitHub-開源協作社群
  3. Gitee(碼雲)-國內開源協作社群
  4. 廖雪峰的 Git 教程-新手必看
  5. 15 分鐘學會 Git
  6. Git Book
  7. .gitignore 檔案常用配置

博主更新不易,每月都要承擔伺服器的租用和維護費用,如果網站內容對你有所幫助,希望打個賞支援小站建設,滑到文章下方有打賞按鈕或者到這兒支援我,感謝!

尋找志同道合的學習夥伴,請訪問我的個人網頁.
該內容同步釋出在CSDN耳殼網.