前言:本篇博客詳細介紹了項目管理工具 Git 的下載安裝、環境變數配置、使用以及一些常用命令,參考了網上一些博主的介紹。有些博客只介紹下載安裝,或者只介紹 Git 命令,沒有綜合到一起。通過閱讀此博文,能夠讓對 Git 的配置與使用達到比較通達的理解,如果喜歡,請點贊收藏。 博文目錄: 一、Git ...
前言:本篇博客詳細介紹了項目管理工具 Git 的下載安裝、環境變數配置、使用以及一些常用命令,參考了網上一些博主的介紹。有些博客只介紹下載安裝,或者只介紹 Git 命令,沒有綜合到一起。通過閱讀此博文,能夠讓對 Git 的配置與使用達到比較通達的理解,如果喜歡,請點贊收藏。
博文目錄:
- 一、Git 下載安裝
- 二、配置環境變數
- 三、配置 GitHub
- 四、IDEA 中配置Git
- 五、Git 命令總結
- 六、Git 使用問題記錄
一、Git 下載安裝
1、官網 Git 下載
官網Git下載(按住Ctrl然後點擊鏈接成功跳轉)
根據自己的需要選擇 macOS
、Windows
、Linux/Unix
,或者直接點擊右邊電腦中 Downloads for Windows
跳轉到下載頁面。
然後點擊 Click here to download
下載版本,或者也可以選擇 32 位或者 64 位
2、Git 安裝步驟
Git 具體安裝步驟參考下邊鏈接,作者 maanlong
,安裝步驟介紹地較為詳細,不只是 Next 一路油門踩到底,該篇博客中還會說明每到一步以後步驟中的選項是什麼意思,是否建議選擇等。因此在此較為推薦:
版本一直在迭代,安裝步驟大差不差,完全值得參考借鑒。安裝完成以後,在桌面上右鍵選擇:Git Bash Here
會彈出下邊的命令行框。在 $
後邊輸入命令 git -v
會出現當前你所安裝的 Git 的版本號。
二、配置環境變數
與其他的軟體類似,Git 配置環境變數也是同樣的操作步驟:
- 右鍵電腦 → 屬性 → 高級系統設置 → 環境變數 → 系統變數 → Path → 然後添加 Git 安裝目錄
C:\Program Files\Git\bin
- 配置好環境變數以後,在命令提示符(Win + R)中輸入
git
會彈出以下界面,說明安裝配置成功
三、配置 GitHub
相信對於軟體開發人員來說,GitHub 這個詞語必然是耳熟能詳。它是一個面向開源及私有軟體項目的托管平臺,因為只支持 Git 作為唯一的版本庫格式進行托管,故名 GitHub。
Git 與 GitHub 間的關係如下圖所示
上邊安裝的 Git 是版本管理工具,而 GitHub 是一個代碼托管平臺,就是將自己所要提交的代碼通過 Git 工具提交到 GitHub 平臺上,用於每次的增刪改查,並且同一個項目組成員都可以拉取項目代碼,互相提交,避免衝突。
想要通過 Git 將代碼提交到 GitHub 上,就需要事先進行一些配置,這樣才能夠與 GitHub 伺服器進行連接。
1、添加 SSH key 原因
GitHub 管理項目的時候,對於本地或者遠程文件操作可以用 HTTPS 或者 SSH 進行 clone 和 push,兩者的區別在於:
-
使用 HTTPS 可隨意 clone 或者 push 項目到 GitHub,不管誰是項目的擁有者;而使用 SSH 操作必須是項目的擁有者或者管理員,且需要添加 SSH key,否則無法 clone
-
使用 HTTPS url 在 push 時需要驗證用戶名和密碼;使用 SSH 在 push 時可設置成無用戶名密碼,相對方便
-
GitHub 允許添加多個 Key。假定你有若幹電腦,一會兒在公司提交,一會兒在家裡提交,這樣只要把每臺電腦的 Key 都添加到 GitHub ,就可以在每臺電腦上往 GitHub 推送了
2、生成 SSH key 步驟
- GitHub 官網上註冊一個賬號,然後桌面右鍵選擇 Git Bash Here,進行賬號配置,命令:
# 配置用戶名("username"是自己GitHub上的用戶名)
$ git config --global user.name "username"
# 配置郵箱("[email protected]"是註冊GitHub賬號時所用的郵箱)
$ git config --global user.email "[email protected]"
- 執行完成上述命令以後,查看是否配置成功。如果成功,會顯示所配置的用戶名和郵箱,命令:
$ git config --global --list
- 檢查電腦是否已經有 SSH key,在 Git Bash Here 中輸入命令:
$ cd ~/.ssh
# 輸完上邊命令回車
$ ls
這兩個命令就是檢查是否已經存在 id_rsa(私鑰) 或 id_dsa.pub(公鑰) 文件,如果文件已經存在,則運行命令後如下圖所示。那麼可以跳過生成 ssh key 文件的步驟,直接添加 key 到 GitHub 上。
- 執行以下命令生成 ssh-key
# 生成 ssh,ssh-keygen 命令中間無空格
$ ssh-keygen -t rsa
- 運行上面那條命令後會讓你輸入一個文件名,用於保存剛纔生成的 SSH key 代碼,遇到下邊命令直接按回車就可以:
Generating public/private rsa key pair.
# Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
- 接著又會提示你輸入兩次密碼(該密碼是你 push 文件的時候要輸入的密碼,而不是 GitHub 管理者的密碼),可以不輸入密碼,直接按回車。那麼 push 的時候就不需要輸入密碼,直接提交到 GitHub 上了
Enter passphrase (empty for no passphrase):
# Enter same passphrase again:
- 然後會有如下代碼提示,這說明 SSH key 已經創建成功,下一步只需要添加到 GitHub 的 SSH key 上就可以,生成成功後,會有如圖3.3所示的:
Your identification has been saved in /c/Users/you/.ssh/id_rsa.
# Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
# The key fingerprint is:
# 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db [email protected]
- 執行過命令之後,到系統盤 Users 目錄(C:\Users\電腦用戶名.ssh\),查看生成的 ssh 文件。這裡在打開 ssh 文件的時候可能會遇到 pub 文件打不開的問題,那麼在當前目錄行中輸入 cmd,定位到文件目錄下,並且在命令行中執行下述命令,這樣可以將公鑰顯示出來
$ type id_rsa.pub
3、添加公鑰到 Github
- 需要將 id_rsa.pub 文件中一大串密鑰複製到 GitHub 中,可以通過 git 命令複製文件:
$ clip < ~/.ssh/id_rsa.put
-
登錄 GitHub 賬號,右上角進入 Settings,然後選擇左邊欄的 SSH and GPG keys 進行添加操作
-
點擊 Add SSH key 按鈕添加一個 SSH key 。把你複製的 SSH key 代碼粘貼到 key 所對應的輸入框中,記得 SSH key 代碼的前後不要留有空格或者回車。上面的 Title 所對應的輸入框也可以輸入一個該 SSH key 顯示在 Github 上的一個別名
- 在 Git Bash Here 中輸入以下代碼,來檢驗是否添加 SSH 成功
$ ssh -T [email protected]
-
當你輸入以上代碼時,會有一段警告代碼,這是正常的,你輸入 yes 回車即可。如果你創建 SSH key 的時候設置了密碼,接下來就會提示你輸入密碼,直到密碼輸入正確為止
-
密碼正確後你會看到下麵代碼中這段話,說明已經成功設置 SSH 密鑰。如果你看到 “access denied” ,者表示拒絕訪問,那麼你就需要使用 HTTPS 去訪問,而不是 SSH
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
四、IDEA 中配置Git
作為一個後端 Java 開發人員,使用 Git 作為代碼版本管理工具是非常必要的,如果能夠在 IntelliJ IDEA 中配置好 Git,那麼會大大提高開發效率。因此這裡以 IDEA 為例,進行 Git 配置的介紹。
下圖來自 Oliver Steele (http://osteele.com) ,解釋了 git 模型和命令:
相關概念需要清楚:
- workspace:工作區。也就是平時存放代碼的地方
- index 或 staging area:暫存區/緩存區。臨時存放代碼的改動,保存即將提交到文件列表的信息
- local repository:版本庫/本地倉庫。安全存放數據的位置,其中 HEAD 指向最新放入倉庫的版本
- remote repository:遠程倉庫。托管代碼的伺服器
Git 作為支持分散式版本管理的工具,它管理的庫(repository)分為本地庫、遠程庫
-
git add 添加文件到暫存區
-
git commit 操作的是本地庫,將本地修改過的文件提交到本地庫(local repository)中
-
git push 操作的是遠程庫,將本地庫中的最新信息發送給遠程庫(remote repository)中
-
git fetch 操作的是遠程倉庫,從遠程庫中獲取數據到本地倉庫中
-
git pull 是 git fetch + git merge ,就是先 fetch,然後執行 merge 操作,如果加 -rebase 參數,就是使用 git rebase 代替 git merge
-
update project 可以選擇是 merge 還是 rebase
merge 與 rebase 兩個命令的區別聯繫:
-
merge 命令會保留所有 commit 的歷史時間不被修改,這樣就形成了以 merge 時間為基準的網狀歷史結構,每個分支上都會繼續保留各自的代碼記錄,主分支上只保留 merge 的歷史紀錄,子分支隨時可能被刪除
-
rebase 命令會始終把最新的修改放到最前頭,對主分支進行 rebase 後,所有的修改就會在主分支所有修改之前進行修改
創建本地倉庫的兩種方法:一種是創建全新的倉庫,一種是複製遠程的倉庫。
1、IntelliJ IDEA 中配置 Github
- File → Settings → Version Control → Git,如果已經安裝了 Git 工具,點擊
Test
按鈕,會顯示安裝路徑以及所安裝的 Git 版本號
- 然後點擊 Version Control 下邊的 GitHub,點擊 + 號,選擇
Log In via GitHub
,頁面會自動跳轉,需要在 GitHub 中進行授權,出現自己 GitHub 頭像表示綁定成功。既然已經配置了 SSH key,那麼就在下邊Clone git repositories using ssh
前邊打勾
- 點擊 IDEA 上邊 VCS,選擇
Create Git Repository
,然後可以拉取代碼
- 配置完成如下圖4.5所示
- 如果想要讓你的 IDEA 的 Terminal 終端打開能使用 Git 命令,需要做簡單配置:Settings → Tools → Terminal → Shell path,選擇 Git 安裝路徑下邊的 base.exe 即可
2、IDEA中使用 Git 時 Project 中的文件會有不同的顏色
-
紅色——未加入版本控制
-
綠色——已經加入控制暫未提交
-
白色——加入,已提交,無改動
-
藍色——加入,已提交,有改動
-
灰色——版本控制已忽略文件
-
黃色——被 git 忽略,不跟蹤
五、Git 命令總結
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、增加/刪除文件
# 定位到 C盤
$ cd C:
# 顯示當前目錄
$ pwd
# 添加指定文件到暫存區
$ git add [file1] [file2] ...
# 添加指定目錄到暫存區,包括子目錄
$ git add [dir]
# 添加當前目錄的所有文件到暫存區
$ git add .
# 添加每個變化前,都會要求確認
# 對於同一個文件的多處變化,可以實現分次提交
$ git add -p
# 刪除工作區文件,並且將這次刪除放入暫存區
$ git rm [file1] [file2] ...
# 停止追蹤指定文件,但該文件會保留在工作區
$ git rm --cached [file]
# 刪除緩存
$ git rm -r -f cached ./
# 改名文件,並且將這個改名放入暫存區
$ 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
# 顯示當前分支的版本歷史,其中commit後黃色字體顯示的是每次提交的版本號,git log 命令顯示從最近到最遠的顯示日誌
$ 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
# 添加或指定遠程倉庫地址
$ git remote set-url origin "https://..."
$ git config remote.origin.url "https://..."
# 刪除
$ git remote rm origin
六、Git 使用問題記錄
1、Git 提示:Can't update(master has no tracked branc)
-
原因:本地分支和遠程分支沒有關聯,需要關聯遠程分支
-
解決:git push --set-upstream origin maser
2、更新代碼後顯示: unable to unlink old ‘xxx/xxx/xx’ : invalid argument
- 原因:要提交或更新的文件被系統線程占用
- 解決:把相關服務暫停,重新pull代碼
3、更新代碼後顯示: the following untracked working tree files would be overwritten by checkout
- 原因:本地代碼倉庫目錄下有untracked文件
- 解決:如果沒有需要上庫的代碼,直接執行 git clean -d -fx 刪除untracked文件
4、git pull的時候認證失敗:remote: invalid Login or password fatal: Authentication failed for ‘https://…’
- 原因:賬號密碼失效或者是未登錄
- 解決:windows賬戶下,控制面板 → 用戶帳戶 → windows憑據 → 修改git密碼
5、版本回退git reset --hard {hash}後提示:fatal: could not parse object “hash id”
- 原因:切換到master分支後沒有更新最新代碼,git log不包含要reset的節點
- 解決:更新代碼後git log找到對應節點hash id再reset
附錄:
參考鏈接:
https://www.jianshu.com/p/e3385a0e4907
github設置添加SSH - 破男孩 - 博客園 (cnblogs.com)
https://www.cnblogs.com/liudinglong/p/14028026.html
https://blog.csdn.net/baidu_35692628/article/details/78330055