原文地址:http://blog.jboost.cn/2019/06/16/use-git.htmlhtml
對於軟件開發人員來講,git幾乎是天天都須要接觸的工具。但對於相處如此親密的工做夥伴,你對它的瞭解又有多少,是否是還在傻瓜式地打開一個GUI工具,點擊提交按鈕,而後「臥槽,又衝突了」,一臉懵逼到不知所措,責怪誰又在你前面提交了,誰又改了你的代碼。git
博主從一開始接觸git,就沒用過任何GUI工具,都是經過命令行進行操做,發現這種方式不只對git的理解更深,效率也更高,遇到問題時通常都知道如何來處理,故作此分享。本文全部知識與操做只涉及平常使用場景,更多詳細內容可自行查閱其它資料。本文Git版本爲 windows-2.20.1版。github
git的理論知識,對使用者來講只須要知道它是分佈式版本控制系統,瞭解以下三個概念便可,windows
以下圖,咱們平時提交代碼的過程基本都是從工做區add
到暫存區,而後再commit
到本地倉庫,最後push
到遠程倉庫。微信
對於平常工做,掌握以下幾個基本命令通常就夠了ssh
git status
查看修改狀態git pull origin master
拉取遠程倉庫master分支合併到本地,master根據場景換成其它分支名git add file
添加文件到暫存區,可用 * 添加全部git commit -m "commit message"
提交到本地版本庫,並添加註釋,註釋代表這次修改內容,要清晰準確git push origin master
將本地版本提交到遠程倉庫的master分支,master根據場景換成其它分支名對大部分平常工做來講, 上面幾個命令基本就夠用了。分佈式
1. 從本地到遠程工具
項目開發的時候,有時候是先在本地建一個項目,再提交到遠程倉庫的。gitlab
git init
, 將在項目目錄建立.git目錄git add *
,將全部文件添加到暫存區,這裏要先建立一個.gitignore文件,將不須要版本維護的文件添加進去忽略,否則各類IDE編譯文件夾,環境相關文件都加到版本庫去了。刪除文件用git rm file_name
git commit -m "upload project"
,提交到本地倉庫git remote add origin git@server-name:path/repo-name.git
,關聯遠程倉庫,倉庫地址若是是http開頭則要用戶名密碼,若是是git開頭,則是走的ssh協議,須要將你本機的ssh公鑰添加到遠程倉庫服務上。git push -u origin master
,推送本地倉庫內容到遠程倉庫這樣在遠程倉庫目錄,就能看到你提交上去的文件內容了。spa
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)的版本這裏涉及幾個場景
git checkout file_name
。git reset HEAD file_name
,就回到了場景1,第二步按場景1操做。整個版本的還原:
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
, 而後從遠程刪除配置命令別名
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
————————————————————————————————————————
歡迎關注個人微信公衆號,及時獲取最新分享