命令列高效操作Git,看這篇就夠了
原文地址:http://blog.jboost.cn/2019/06/16/use-git.html
對於軟體開發人員來說,git幾乎是每天都需要接觸的工具。但對於相處如此親密的工作夥伴,你對它的瞭解又有多少,是不是還在傻瓜式地開啟一個GUI工具,點選提交按鈕,然後“臥槽,又衝突了”,一臉懵逼到不知所措,責怪誰又在你前面提交了,誰又改了你的程式碼。
博主從一開始接觸git,就沒用過任何GUI工具,都是通過命令列進行操作,發現這種方式不僅對git的理解更深,效率也更高,遇到問題時一般都知道如何來處理,故做此分享。本文所有知識與操作只涉及日常使用場景,更多詳細內容可自行查閱其它資料。本文Git版本為 windows-2.20.1版。
基礎理論
git的理論知識,對使用者來說只需要知道它是分散式版本控制系統,瞭解如下三個概念即可,
- 工作區:就是你直接操作的檔案目錄與內容
- 暫存區:暫時為你儲存還沒將內容提交到版本庫的一個區域,對應.git目錄下的stage或index檔案
- 版本庫:分本地版本庫與遠端版本庫,本地版本庫就理解為對應.git目錄即可,遠端版本庫就是遠端倉庫,如gitlab或github的repository。
如下圖,我們平時提交程式碼的過程基本都是從工作區add
到暫存區,然後再commit
到本地倉庫,最後push
到遠端倉庫。
基本命令
對於日常工作,掌握如下幾個基本命令一般就夠了
git status
git pull origin master
拉取遠端倉庫master分支合併到本地,master根據場景換成其它分支名git add file
新增檔案到暫存區,可用 * 新增所有git commit -m "commit message"
提交到本地版本庫,並添加註釋,註釋表明此次修改內容,要清晰準確git push origin master
將本地版本提交到遠端倉庫的master分支,master根據場景換成其它分支名
對大部分日常工作來說, 上面幾個命令基本就夠用了。
新建專案
1. 從本地到遠端
專案開發的時候,有時候是先在本地建一個專案,再提交到遠端倉庫的。
- 建立專案目錄(或通過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
,推送本地倉庫內容到遠端倉庫
這樣在遠端倉庫目錄,就能看到你提交上去的檔案內容了。
2. 從遠端到本地
更多的時候,是遠端倉庫已有專案了,需要下載到本地開發。
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 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
-
配置命令別名
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
建立關聯即可。
總結
以上命令雖然看起來多,但平常用的最頻繁的應該是“基本命令”與“分支管理”部分,只要多用幾次,自然便能記住,應付日常工作完全沒有問題,徹底脫離GUI操作,讓工作更有效率。
我的個人部落格地址:http://blog.jboost.cn
我的頭條空間: https://www.toutiao.com/c/user/5833678517/#mid=1636101215791112
我的github地址:https://github.com/ronwxy
我的微信公眾號:jboost-ksxy
————————————————————————————————————————
歡迎關注我的微信公眾號,及時獲取最新分享