命令行高效操做Git,看這篇就夠了

原文地址:http://blog.jboost.cn/2019/06/16/use-git.htmlhtml

 

對於軟件開發人員來講,git幾乎是天天都須要接觸的工具。但對於相處如此親密的工做夥伴,你對它的瞭解又有多少,是否是還在傻瓜式地打開一個GUI工具,點擊提交按鈕,而後「臥槽,又衝突了」,一臉懵逼到不知所措,責怪誰又在你前面提交了,誰又改了你的代碼。git

博主從一開始接觸git,就沒用過任何GUI工具,都是經過命令行進行操做,發現這種方式不只對git的理解更深,效率也更高,遇到問題時通常都知道如何來處理,故作此分享。本文全部知識與操做只涉及平常使用場景,更多詳細內容可自行查閱其它資料。本文Git版本爲 windows-2.20.1版。github

基礎理論

git的理論知識,對使用者來講只須要知道它是分佈式版本控制系統,瞭解以下三個概念便可,windows

  • 工做區:就是你直接操做的文件目錄與內容
  • 暫存區:暫時爲你保存還沒將內容提交到版本庫的一個區域,對應.git目錄下的stage或index文件
  • 版本庫:分本地版本庫與遠程版本庫,本地版本庫就理解爲對應.git目錄便可,遠程版本庫就是遠程倉庫,如gitlab或github的repository。

以下圖,咱們平時提交代碼的過程基本都是從工做區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

  1. 建立項目目錄(或經過IDE建立),命令行cd到項目目錄
  2. 執行git init , 將在項目目錄建立.git目錄
  3. 執行git add * ,將全部文件添加到暫存區,這裏要先建立一個.gitignore文件,將不須要版本維護的文件添加進去忽略,否則各類IDE編譯文件夾,環境相關文件都加到版本庫去了。刪除文件用git rm file_name
  4. 執行git commit -m "upload project" ,提交到本地倉庫
  5. 在gitlab或github上建立一個倉庫,並將倉庫地址複製下來
  6. 執行git remote add origin git@server-name:path/repo-name.git ,關聯遠程倉庫,倉庫地址若是是http開頭則要用戶名密碼,若是是git開頭,則是走的ssh協議,須要將你本機的ssh公鑰添加到遠程倉庫服務上。
  7. 執行git push -u origin master ,推送本地倉庫內容到遠程倉庫

這樣在遠程倉庫目錄,就能看到你提交上去的文件內容了。spa

2. 從遠程到本地
更多的時候,是遠程倉庫已有項目了,須要下載到本地開發。

  1. git clone git@server-name:path/repo-name.git , 將遠程倉庫的內容下載到本地,這裏倉庫地址的處理同上
  2. 修改內容
  3. git add * ,將修改的內容添加到暫存區
  4. git commit -m "fix xxx issue" ,提交到本地倉庫
  5. 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^的操做)

多人協做

  1. 首先,能夠試圖用 git push origin branch_name 推送本身的修改;
  2. 若是推送失敗,則由於遠程分支比你的本地更新,須要先用 git pull 試圖合併;
  3. 若是合併有衝突,則手動解決衝突,並在本地提交;
  4. 沒有衝突或者解決掉衝突後,再用 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

  1. 配置命令別名

    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 了

     

  2. 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

————————————————————————————————————————

 

歡迎關注個人微信公衆號,及時獲取最新分享

相關文章
相關標籤/搜索