Git 是一個開源的分佈式版本控制系統,可以有效、高速地進行項目版本管理。
分佈式意味着不需要服務器軟件支持,也可自成體系。如上圖所示,本地倉庫自成系統。在一個目錄下執行 git init,會產生一個 .git 的隱藏文件夾,就開啓了該目錄結構下文件的版本管理,從而可以爲文件形成歷史版本,並進行查看、撤回、比較等。
1、配置信息
任何時候,使用以下命令可以查看配置信息,從而知道當前所於一個怎樣的環境參數之中。
git config --list
每一個版本的形成,都會記錄作者是誰,作者信息通過以下方式配置。
git config --global user.name "username"
git config --global user.email "email"
使用 git log 可以看到每次提交的作者,顯示形式如下。
Author: username <email>
Date: Sat Jul 31 07:56:50 2021 +0000
2、訪問賬戶
訪問遠程項目需要權限時,有兩種授權方式,SSH 和 HTTP/HTTPS。
2.1 SSH
項目路徑的形式爲 [email protected]:hello.git
授權方式爲在本地生成SSH密鑰對再把公鑰上傳到服務器,配置一次,相關有權操作即可自由進行了。
通過以下命令可以產生密鑰對。
ssh-keygen -t rsa
根據提示執行,默認會在生成公鑰 /c/Users/Administrator/.ssh/id_rsa.pub,將公鑰發給管理員,在服務器上添加即可。
在 Windows 如果發現公鑰上傳的無效,有可能是服務器之前已經連接過,並已保存連接記錄在 /c/Users/Administrator/.ssh/know_hosts 中,該服務器對應的行從中刪除即可。
2.2 HTTP/HTTPS
項目路徑的形式爲 https://xxx.domain.com/hello.git
對於需要授權的操作,通常每次都要求輸入用戶名和密碼。通過以下命令可以保存登錄信息從而只需要輸入一次。
git config --global credential.helper store
如果又想要每次操作都輸入用戶名密碼,則可執行以下命令實現。
git config --global credential.helper wincred
git credential-manager uninstall
3、遠程項目
3.1 將本地新項目上傳
當然,首先你需要有遠程項目的權限,假設服務器上已經創建了一個空項目 https://xxx.domain.com/hello.git,則在本地項目的目錄中執行以下命令即可完成初次的上傳至遠程倉庫。
git init
git add .
git commit -m "first commit"
git remote add origin https://xxx.domain.com/hello.git
git push -u origin master
3.2 加載遠程項目到本地
使用 git clone 即可,會在當前目錄創建一個項目的子目錄。如下以命令全創建一個 helloworld 的子目錄即爲項目所在目錄。
git clone https://hub.fastgit.org/triplestudio/helloworld.git
4、修改比較與恢復
通常沒有其它插曲的修改過程如下。
// 加入暫存區
git add .
// 提交至倉庫區
git commit -m "描述一下本次修改"
// 推送至遠程服務器
git push
4.1 關於版本
每次 git commit 會形成一個版本標識,通過 git reflog 可以倒序的看到歷次的相關標識,長度爲 7 個字符。當然,使用 git log 也可以看到,只是太長了,使用其前 7 位的短標識即可。
4.2 比較修改
// 查看修改了哪些文件
git status
// 所有修改比較
git diff
// 具體到某個文件
git diff README.md
// 如果已經 git add . 了,則帶上 --cached 來查看
git diff --cached README.md
// 如果已經 git commint 了,則需要指定比較的
git diff b8576cf aafab27 README.md
4.3 恢復文件
先來看看一些命令的撤銷
撤銷 git add . 命令
git reset HEAD
撤銷 git commit 命令
git reset HEAD^
當文件改亂了,可以使用以下命令恢復爲改之前的樣子。
git checkout -- README.md
如果已經 git add 了,可以撤銷命令再恢復,也可以使用以下命令。
git reset --hard
如果已經 git commit 了,可以撤銷命令再恢復,也可以使用以下命令。
git reset --hard b8576cf
5、分支
從當前分支形成一個新的分支
最好所有修改已是提交狀態,否則工作區中的修改被帶到新分支容易失控。
// 創建 branch2 分支
git branch branch2
// 切換到 branch2 分支
git checkout branch2
創建並切換分支: $ git checkout -b branch2
從遠程獲取新的分支
取遠程分支並分化一個新分支
git checkout -b otherbranch origin/otherbranch
掛起當前分支的修改
如果正在修改某個分支,卻需要切換到另一個分支去修改bug,則切換之前,先藏好當前修改,待重回本分支時再恢復。
// 藏(修改藏起來,工作區變成修改前的狀態)
git stash
// 恢復
git stash pop
git merge mybranch
刪除分支: git branch -D mybranch
衝突
一種情況是基於同一版本各自修改提交,合併時就會產生衝突。
git mergetool
其中上左區爲修改前,上中區爲本地(local)版本庫修改,C區爲遠程版本庫(remote)信息。
修改之後,再次提交即可。
實際上,如果沒有自動合併,就是找到衝突的文件去進行手動修改再重新提交一次。
6、其它
訪問 https://github.com/ 比較慢的時候,可以使用一些鏡像,如 https://hub.fastgit.org/。
附:常用命令:
git config --global user.name "你的名字" 讓你全部的Git倉庫綁定你的名字
git config --global user.email "你的郵箱" 讓你全部的Git倉庫綁定你的郵箱
git init 初始化你的倉庫
git add . 把工作區的文件全部提交到暫存區
git add ./<file>/ 把工作區的<file>文件提交到暫存區
git commit -m "xxx" 把暫存區的所有文件提交到倉庫區,暫存區空空蕩蕩
git remote add origin https://github.com/name/name_cangku.git 把本地倉庫與遠程倉庫連接起來
git push -u origin master 把倉庫區的主分支master提交到遠程倉庫裏
git push -u origin <其他分支> 把其他分支提交到遠程倉庫
git status查看當前倉庫的狀態
git diff 查看文件修改的具體內容
git log 顯示從最近到最遠的提交歷史
git clone + 倉庫地址下載克隆文件
git reset --hard + 版本號 回溯版本,版本號在commit的時候與master跟隨在一起
git reflog 顯示命令歷史
git checkout -- <file> 撤銷命令,用版本庫裏的文件替換掉工作區的文件。我覺得就像是Git世界的ctrl + z
git rm 刪除版本庫的文件
git branch 查看當前所有分支
git branch <分支名字> 創建分支
git checkout <分支名字> 切換到分支
git merge <分支名字> 合併分支
git branch -d <分支名字> 刪除分支,有可能會刪除失敗,因爲Git會保護沒有被合併的分支
git branch -D + <分支名字> 強行刪除,丟棄沒被合併的分支
git log --graph 查看分支合併圖
git merge --no-ff <分支名字> 合併分支的時候禁用Fast forward模式,因爲這個模式會丟失分支歷史信息
git stash 當有其他任務插進來時,把當前工作現場“存儲”起來,以後恢復後繼續工作
git stash list 查看你剛剛“存放”起來的工作去哪裏了
git stash apply 恢復卻不刪除stash內容
git stash drop 刪除stash內容
git stash pop 恢復的同時把stash內容也刪了
git remote 查看遠程庫的信息,會顯示origin,遠程倉庫默認名稱爲origin
git remote -v 顯示更詳細的信息
git pull 把最新的提交從遠程倉庫中抓取下來,在本地合併,和git push相反
git rebase 把分叉的提交歷史“整理”成一條直線,看上去更直觀
git tag 查看所有標籤,可以知道歷史版本的tag
git tag <name> 打標籤,默認爲HEAD。比如git tag v1.0
git tag <tagName> <版本號> 把版本號打上標籤,版本號就是commit時,跟在旁邊的一串字母數字
git show <tagName> 查看標籤信息
git tag -a <tagName> -m "<說明>" 創建帶說明的標籤。-a指定標籤名,-m指定說明文字
git tag -d <tagName> 刪除標籤
git push origin <tagname> 推送某個標籤到遠程
git push origin --tags 一次性推送全部尚未推送到遠程的本地標籤
git push origin :refs/tags/<tagname> 刪除遠程標籤<tagname>
git config --global color.ui true 讓Git顯示顏色,會讓命令輸出看起來更醒目
git add -f <file> 強制提交已忽略的的文件
git check-ignore -v <file> 檢查爲什麼Git會忽略該文件
git branch other