寫在最前:
Git❓一小時學會 Git
一、基本命令
1、git status #查看修改狀態
# 查看指定文件狀態 # 查看所有文件狀態 |
2、git pull origin master #拉取遠程倉庫 master 分支合併到本地,master 根據場景換成其它分支名
3、git add file #添加文件到暫存區,可用 * or . 添加所有
# 添加指定文件到暫存區 # 添加指定目錄到暫存區,包括子目錄 # 添加當前目錄的所有文件到暫存區 |
4、git commit -m "commit message" #提交暫存區到倉庫區(提交到本地版本庫,並添加註釋,註釋表明此次修改內容,要清晰準確)
# 提交暫存區到倉庫區 # 提交暫存區的指定文件到倉庫區 # 提交工作區自上次commit之後的變化,直接到倉庫區,跳過了add,對新文件無效 # 提交時顯示所有diff信息 # 使用一次新的commit,替代上一次提交 # 重做上一次commit,幷包括指定文件的新變化 |
5、git push origin master #將本地版本提交到遠程倉庫 master 分支,master 根據場景換成其它分支名(將本地的 master
分支推送到 origin
主機的 master
分支,如果後者不存在,則會被新建)
對大部分日常工作來說, 上面幾個命令基本就夠用了。
二、新建項目
1、設置用戶名與郵箱(用戶標識,必要)
當你安裝 Git 後首先要做的事情是設置你的用戶名稱和 e-mail 地址。這是非常重要的,因爲每次 Git 提交都會使用該信息。它被永遠的嵌入到了你的提交中
|
只需要做一次這個設置,如果你傳遞了 --global 選項,因爲 Git 將總是會使用該信息來處理你在系統中所做的一切操作。如果你希望在一個特定的項目中使用不同的名稱或 e-mail 地址,你可以在該項目中運行該命令而不要 --global 選項。 總之--global爲全局配置,不加爲某個項目的特定配置。
2. 從本地到遠程
項目開發的時候,有時候是先在本地建一個項目,再提交到遠程倉庫的。
- 創建項目目錄(或通過 IDE 創建),命令行 cd 到項目目錄
- 執行 git init , 將在項目目錄創建 .git 目錄
- 執行 git add * ,將所有文件添加到暫存區,這裏要先創建一個 .gitignore 文件,將不需要版本維護的文件添加進去忽略,不然各種 IDE 編譯文件夾,環境相關文件都加到版本庫去了。刪除文件用 git rm file_name
- 執行 git commit -m "upload project" ,提交到本地倉庫
- 在 gitlab 或 github 上創建一個倉庫,並將倉庫地址複製下來
- 執行 git remote add origin git@server-name:path/repo-name.git ,關聯遠程倉庫,倉庫地址如果是 http 開頭則要用戶名密碼,如果是 git 開頭,則是走的 ssh 協議,需要將你本機的 ssh 公鑰添加到遠程倉庫服務上。
- 執行 git push -u origin master ,推送本地倉庫內容到遠程倉庫
這樣在遠程倉庫目錄,就能看到你提交上去的文件內容了。
3. 從遠程到本地
更多的時候,是遠程倉庫已有項目了,需要下載到本地開發
- git clone git@server-name:path/repo-name.git , 將遠程倉庫的內容下載到本地,這裏倉庫地址的處理同上
- 修改內容
- git add * ,將修改的內容添加到暫存區
- git commit -m "fix xxx issue" ,提交到本地倉庫
- git push -u origin master , 推送本地倉庫內容至遠程倉庫
版本回退
有時候改了文件,想反悔怎麼辦,git 給你“後悔藥”。
單個文件的還原:
- git checkout file_name ,丟棄工作區的修改,還原到上次提交(commit)的版本,
- git reset HEAD file_name ,把暫存區的修改撤銷掉(unstage),重新放回工作區。即還原到上次添加到暫存區(add)的版本
這裏涉及幾個場景
- 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令 git checkout file_name。
- 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時(執行了 add,但沒執行 commit),想丟棄修改,分兩步,第一步用命令 git reset HEAD file_name,就回到了場景1,第二步按場景1操作。
- 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次的全部提交,參考下面的整個版本的還原,不過前提是沒有推送到遠程庫。
整個版本的還原:
- git reset --hard HEAD^^, 回退到上上個版本
- git reset --hard 3628164, 回退到具體某個版本 3628164 是具體某個 commit_id 縮寫
找不到 commit_id? git reflog 可查看每一個命令的歷史記錄,獲取對應操作的 commit_id。git log [--pretty=oneline], 可查看 commit 記錄
上一個版本就是 HEAD^,上上一個版本就是 HEAD^^,往上 100 個版本寫成 HEAD~100。3628164 是具體某個 commit_id,不需要寫全,只需要唯一確定就行,可往前進也可往後退。(git windows2.20.1 版貌似不支持對 HEAD^ 的操作)
多人協作
- 首先,可以試圖用 git push origin branch_name 推送自己的修改;
- 如果推送失敗,則因爲遠程分支比你的本地更新,需要先用 git pull 試圖合併;
- 如果合併有衝突,則手動解決衝突,並在本地提交;
- 沒有衝突或者解決掉衝突後,再用 git push origin branch-name 推送就能成功!
如果 git pull 提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令 git branch –set-upstream branch-name origin/branch-name
在本地創建和遠程分支對應的分支,使用 git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致
分支管理
平時開發時需要創建子分支來實現你的功能模塊,然後再合併到主分支中。
- git checkout -b your_branch_name , 創建並切換分支
- git branch , 查看分支,標有*號表示當前所在分支
- git merge dev , 合併指定 dev 分支到當前分支
- git merge --no-ff -m "merge with no-ff" dev , 合併分支並生成commit記錄
- git branch -d dev , 刪除分支
git checkout -b dev = git branch dev + git checkout dev
Fast-forward 合併,“快進模式”,也就是直接把 master 指向 dev 的當前提交,所以合併速度非常快。存在衝突的不能 fast forward。git merge --no-ff -m "merge with no-ff" dev Fast forward 模式下,刪除分支後,會丟掉分支信息。如果強制禁用 Fast forward 模式,Git 就會在 merge 時生成一個新的 commit,這樣,從分支歷史上就可以看出分支信息
標籤管理
當發佈版本時,一般需要對當前版本進行標籤記錄,以便後續進行版本查看或回退。
- git tag tag_name , 對當前分支打標籤
- git tag , 查看所有標籤
- git tag v0.9 6224937 ,針對某個具體 commit id 打標籤
- git show tag_name , 查看標籤信息
- git tag -a v0.1 -m "version 0.1 released" 3628164 , 帶有說明的標籤
- git tag -d v0.1 , 刪除標籤
- git push origin tag_name , 推送標籤到遠程
- git push origin --tags , 一次性推送所有標籤
刪除已經推送到遠程的標籤:
- git tag -d v0.9 , 先本地刪除
- git push origin :refs/tags/v0.9 , 然後從遠程刪除
提高效率的 Tips
配置命令別名
# 查看系統config |
git config --global alias.st status # 後面可以用 git st 來代替 git status 了 git config --global alias.ck checkout # 後面可以用 git ck 來代替 git checkout 了 git config --global alias.cm 'commit -m' # 後面可以用 git cm 來代替 git commit -m 了 |
git pull origin master 或 git push origin master, 可直接 git pull 或 git push, 如果出現“no tracking information”的提示,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令 git branch --set-upstream-to=origin/master master 建立關聯即可。