跳到主要內容

程序員必備基礎:Git 命令全方位學習

前言


掌握Git命令是每位程序員必備的基礎,之前一直是用smartGit工具,直到看到大佬們都是在用Git命令操作的,回想一下,發現有些Git命令我都忘記了,於是寫了這篇博文,複習一下~



https://github.com/whx123/JavaHome



公眾號:撿田螺的小男孩


文章目錄



  • Git是什麼?

  • Git的相關理論基礎

  • 日常開發中,Git的基本常用命令

  • Git進階之分支處理

  • Git進階之處理衝突

  • Git進階之撤銷與回退

  • Git進階之標籤tag

  • Git其他一些經典命令


Git是什麼


在回憶Git是什麼的話,我們先來複習這幾個概念哈~


什麼是版本控制?


百度百科定義是醬紫的~



版本控制是指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管理,是軟件配置管理的核心思想之一。



那些年,我們的畢業論文,其實就是版本變更的真實寫照...腦洞一下,版本控制就是這些論文變更的管理~


什麼是集中化的版本控制系統?


那麼,集中化的版本控制系統又是什麼呢,說白了,就是有一個集中管理的中央服務器,保存着所有文件的修改歷史版本,而協同開發者通過客戶端連接到這台服務器,從服務器上同步更新或上傳自己的修改。



什麼是分佈式版本控制系統?


分佈式版本控制系統,就是遠程倉庫同步所有版本信息到本地的每個用戶。嘻嘻,這裏分三點闡述吧:



  • 用戶在本地就可以查看所有的歷史版本信息,但是偶爾要從遠程更新一下,因為可能別的用戶有文件修改提交到遠程哦。

  • 用戶即使離線也可以本地提交,push推送到遠程服務器才需要聯網。

  • 每個用戶都保存了歷史版本,所以只要有一個用戶設備沒問題,就可以恢複數據啦~



什麼是Git?


Git是免費、開源的分佈式版本控制系統,可以有效、高速地處理從很小到非常大的項目版本管理。



Git的相關理論基礎



  • Git的四大工作區域

  • Git的工作流程

  • Git文件的四種狀態

  • 一張圖解釋Git的工作原理


Git的四大工作區域


先複習Git的幾個工作區域哈:



  • Workspace:你電腦本地看到的文件和目錄,在Git的版本控制下,構成了工作區。

  • Index/Stage:暫存區,一般存放在 .git目錄下,即.git/index,它又叫待提交更新區,用於臨時存放你未提交的改動。比如,你執行git add,這些改動就添加到這個區域啦。

  • Repository:本地倉庫,你執行git clone 地址,就是把遠程倉庫克隆到本地倉庫。它是一個存放在本地的版本庫,其中HEAD指向最新放入倉庫的版本。當你執行git commit,文件改動就到本地倉庫來了~

  • Remote:遠程倉庫,就是類似github,碼雲等網站所提供的倉庫,可以理解為遠程數據交換的倉庫~


Git的工作流程


上一小節介紹完Git的四大工作區域,這一小節呢,介紹Git的工作流程咯,把git的操作命令和幾個工作區域結合起來,個人覺得更容易理解一些吧,哈哈,看圖:



git 的正向工作流程一般就這樣:



  • 從遠程倉庫拉取文件代碼回來;

  • 在工作目錄,增刪改查文件;

  • 把改動的文件放入暫存區;

  • 將暫存區的文件提交本地倉庫;

  • 將本地倉庫的文件推送到遠程倉庫;


Git文件的四種狀態


根據一個文件是否已加入版本控制,可以把文件狀態分為:Tracked(已跟蹤)和Untracked(未跟蹤),而tracked(已跟蹤)又包括三種工作狀態:Unmodified,Modified,Staged




  • Untracked: 文件還沒有加入到git庫,還沒參与版本控制,即未跟蹤狀態。這時候的文件,通過git add 狀態,可以變為Staged狀態

  • Unmodified:文件已經加入git庫, 但是呢,還沒修改, 就是說版本庫中的文件快照內容與文件夾中還完全一致。 Unmodified的文件如果被修改, 就會變為Modified. 如果使用git remove移出版本庫, 則成為Untracked文件。

  • Modified:文件被修改了,就進入modified狀態啦,文件這個狀態通過stage命令可以進入staged狀態

  • staged:暫存狀態. 執行git commit則將修改同步到庫中, 這時庫中的文件和本地文件又變為一致, 文件為Unmodified狀態.


一張圖解釋Git的工作原理



日常開發中,Git的基本常用命令



  • git clone

  • git checkout -b dev

  • git add

  • git commit

  • git log

  • git diff

  • git status

  • git pull/git fetch

  • git push


這個圖只是模擬一下git基本命令使用的大概流程哈~


git clone


當我們要進行開發,第一步就是克隆遠程版本庫到本地呢


git clone url  克隆遠程版本庫


git checkout -b dev


克隆完之後呢,開發新需求的話,我們需要新建一個開發分支,比如新建開發分支dev


創建分支:


git checkout -b dev   創建開發分支dev,並切換到該分支下


git add


git add的使用格式:


git add .	添加當前目錄的所有文件到暫存區
git add [dir] 添加指定目錄到暫存區,包括子目錄
git add [file1] 添加指定文件到暫存區

有了開發分支dev之後,我們就可以開始開發啦,假設我們開發完HelloWorld.java,可以把它加到暫存區,命令如下


git add Hello.java  把HelloWorld.java文件添加到暫存區去


git commit


git commit的使用格式:


git commit -m [message] 提交暫存區到倉庫區,message為說明信息
git commit [file1] -m [message] 提交暫存區的指定文件到本地倉庫
git commit --amend -m [message] 使用一次新的commit,替代上一次提交

把HelloWorld.java文件加到暫存區后,我們接着可以提交到本地倉庫啦~


git commit -m 'helloworld開發'


git status


git status,表示查看工作區狀態,使用命令格式:


git status  查看當前工作區暫存區變動
git status -s 查看當前工作區暫存區變動,概要信息
git status --show-stash 查詢工作區中是否有stash(暫存的文件)

當你忘記是否已把代碼文件添加到暫存區或者是否提交到本地倉庫,都可以用git status看看哦~


git log


git log,這個命令用得應該比較多,表示查看提交歷史/提交日誌~


git log  查看提交歷史
git log --oneline 以精簡模式显示查看提交歷史
git log -p <file> 查看指定文件的提交歷史
git blame <file> 一列表方式查看指定文件的提交歷史

嘻嘻,看看dev分支上的提交歷史吧要回滾代碼就經常用它喵喵提交歷史


git diff


git diff 显示暫存區和工作區的差異
git diff filepath filepath路徑文件中,工作區與暫存區的比較差異
git diff HEAD filepath 工作區與HEAD ( 當前工作分支)的比較差異
git diff branchName filepath 當前分支的文件與branchName分支的文件的比較差異
git diff commitId filepath 與某一次提交的比較差異

如果你想對比一下你改了哪些內容,可以用git diff對比一下文件修改差異哦


git pull/git fetch


git pull  拉取遠程倉庫所有分支更新併合併到本地分支。
git pull origin master 將遠程master分支合併到當前本地master分支
git pull origin master:master 將遠程master分支合併到當前本地master分支,冒號後面表示本地分支

git fetch --all 拉取所有遠端的最新代碼
git fetch origin master 拉取遠程最新master分支代碼

我們一般都會用git pull拉取最新代碼看看的,解決一下衝突,再推送代碼到遠程倉庫的。




有些夥伴可能對使用git pull還是git fetch有點疑惑,其實
git pull = git fetch+ git merge。pull的話,拉取遠程分支並與本地分支合併,fetch只是拉遠程分支,怎麼合併,可以自己再做選擇。



git push


git push 可以推送本地分支、標籤到遠程倉庫,也可以刪除遠程分支哦。


git push origin master 將本地分支的更新全部推送到遠程倉庫master分支。
git push origin -d <branchname> 刪除遠程branchname分支
git push --tags 推送所有標籤

如果我們在dev開發完,或者就想把文件推送到遠程倉庫,給別的夥伴看看,就可以使用git push origin dev~


Git進階之分支處理


Git一般都是存在多個分支的,開發分支,回歸測試分支以及主幹分支等,所以Git分支處理的命令也需要很熟悉的呀~



  • git branch

  • git checkout

  • git merge


git branch


git branch用處多多呢,比如新建分支、查看分支、刪除分支等等


新建分支:


git checkout -b dev2  新建一個分支,並且切換到新的分支dev2
git branch dev2 新建一個分支,但是仍停留在原來分支


查看分支:


git branch    查看本地所有的分支
git branch -r 查看所有遠程的分支
git branch -a 查看所有遠程分支和本地分支


刪除分支:


git branch -D <branchname>  刪除本地branchname分支


git checkout


切換分支:


git checkout master 切換到master分支


git merge


我們在開發分支dev開發、測試完成在發布之前,我們一般需要把開發分支dev代碼合併到master,所以git merge也是程序員必備的一個命令。


git merge master  在當前分支上合併master分支過來
git merge --no-ff origin/dev 在當前分支上合併遠程分支dev
git merge --abort 終止本次merge,並回到merge前的狀態

比如,你開發完需求后,發版全需要把代碼合到主幹master分支,如下:


Git進階之處理衝突


Git版本控制,還是多個人一起搞的,多個分支並存的,這就難免會有衝突出現~


Git合併分支,衝突出現


同一個文件,在合併分支的時候,如果同一行被多個分支或者不同人都修改了,合併的時候就會出現衝突。


舉個粟子吧,我們現在在dev分支,修改HelloWorld.java文件,假設修改了第三行,並且commit提交到本地倉庫,修改內容如下:


public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,撿田螺的小男孩!");
}
}

我們切回到master分支,也修改HelloWorld.java同一位置內容,如下:


public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,jay!!");
}
}

再然後呢,我們提交一下master分支的這個改動,並把dev分支合併過下,就出現衝突啦,如圖所示:



Git解決衝突


Git 解決衝突步驟如下:



  • 查看衝突文件內容

  • 確定衝突內容保留哪些部分,修改文件

  • 重新提交,done


1.查看衝突文件內容


git merge提示衝突后,我們切換到對應文件,看看衝突內容哈,,如下:


2.確定衝突內容保留哪些部分,修改文件



  • Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,

  • <<<<<<<HEAD是指主分支修改的內容,>>>>>>> dev是指dev分支上修改的內容


所以呢,我們確定到底保留哪個分支內容,還是兩個分支內容都保留呢,然後再去修改文件衝突內容~


3.修改完衝突文件內容,我們重新提交,衝突done



Git進階之撤銷與回退


Git的撤銷與回退,在日常工作中使用的比較頻繁。比如我們想將某個修改后的文件撤銷到上一個版本,或者想撤銷某次多餘的提交,都要用到git的撤銷和回退操作。


代碼在Git的每個工作區域都是用哪些命令撤銷或者回退的呢,如下圖所示:


有關於Git的撤銷與回退,一般就以下幾個核心命令



  • git checkout

  • git reset

  • git revert


git checkout


如果文件還在工作區,還沒添加到暫存區,可以使用git checkout撤銷


git checkout [file]  丟棄某個文件file
git checkout . 丟棄所有文件

以下demo,使用git checkout -- test.txt 撤銷了暫存區test.txt的修改


git reset


git reset的理解



git reset的作用是修改HEAD的位置,即將HEAD指向的位置改變為之前存在的某個版本.



為了更好地理解git reset,我們來回顧一下,Git的版本管理及HEAD的理解



Git的所有提交,會連成一條時間軸線,這就是分支。如果當前分支是master,HEAD指針一般指向當前分支,如下:




假設執行git reset,回退到版本二之後,版本三不見了哦,如下:



git reset的使用


Git Reset的幾種使用模式


git reset HEAD --file
回退暫存區里的某個文件,回退到當前版本工作區狀態
git reset –-soft 目標版本號 可以把版本庫上的提交回退到暫存區,修改記錄保留
git reset –-mixed 目標版本號 可以把版本庫上的提交回退到工作區,修改記錄保留
git reset –-hard 可以把版本庫上的提交徹底回退,修改的記錄全部revert。

先看一個粟子demo吧,代碼git add到暫存區,並未commit提交,就以下醬紫回退,如下:


git reset HEAD file 取消暫存
git checkout file 撤銷修改


再看另外一個粟子吧,代碼已經git commit了,但是還沒有push:


git log  獲取到想要回退的commit_id
git reset --hard commit_id 想回到過去,回到過去的commit_id


如果代碼已經push到遠程倉庫了呢,也可以使用reset回滾哦(這裏大家可以自己操作實踐一下哦)~


git log
git reset --hard commit_id
git push origin HEAD --force

git revert



與git reset不同的是,revert複製了那個想要回退到的歷史版本,將它加在當前分支的最前端。



revert之前:

revert 之後:


當然,如果代碼已經推送到遠程的話,還可以考慮revert回滾呢


git log  得到你需要回退一次提交的commit id
git revert -n <commit_id> 撤銷指定的版本,撤銷也會作為一次提交進行保存


Git進階之標籤tag


打tag就是對發布的版本標註一個版本號,如果版本發布有問題,就把該版本拉取出來,修復bug,再合回去。


git tag  列出所有tag
git tag [tag] 新建一個tag在當前commit
git tag [tag] [commit] 新建一個tag在指定commit
git tag -d [tag] 刪除本地tag
git push origin [tag] 推送tag到遠程
git show [tag] 查看tag
git checkout -b [branch] [tag] 新建一個分支,指向某個tag


Git其他一些經典命令


git rebase


rebase又稱為衍合,是合併的另外一種選擇。


假設有兩個分支master和test


      D---E test
/
A---B---C---F--- master

執行 git merge test得到的結果


       D--------E
/ \
A---B---C---F----G--- test, master

執行git rebase test,得到的結果


A---B---D---E---C'---F'---   test, master

rebase好處是: 獲得更優雅的提交樹,可以線性的看到每一次提交,並且沒有增加提交節點。所以很多時候,看到有些夥伴都是這個命令拉代碼:git pull --rebase


git stash


stash命令可用於臨時保存和恢復修改


git stash  把當前的工作隱藏起來 等以後恢復現場後繼續工作
git stash list 显示保存的工作進度列表
git stash pop stash@{num} 恢復工作進度到工作區
git stash show :显示做了哪些改動
git stash drop stash@{num} :刪除一條保存的工作進度
git stash clear 刪除所有緩存的stash。


git reflog


显示當前分支的最近幾次提交



git blame filepath


git blame 記錄了某個文件的更改歷史和更改人,可以查看背鍋人,哈哈


git remote


git remote   查看關聯的遠程倉庫的名稱
git remote add url 添加一個遠程倉庫
git remote show [remote] 显示某個遠程倉庫的信息

參考與感謝


感謝各位前輩的文章:



  • 一個小時學會Git

  • 【Git】(1)---工作區、暫存區、版本庫、遠程倉庫

  • Git Reset 三種模式

  • Git恢復之前版本的兩種方法reset、revert(圖文詳解)

  • Git撤銷&回滾操作(git reset 和 get revert)

  • 為什麼要使用git pull --rebase?


公眾號




  • 歡迎關注我個人公眾號,交個朋友,一起學習哈~

  • 如果文章有錯誤,歡迎指出哈,感激不盡~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?



網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!



※台北網頁設計公司全省服務真心推薦



※想知道最厲害的網頁設計公司"嚨底家"!



新北清潔公司,居家、辦公、裝潢細清專業服務



※推薦評價好的iphone維修中心



Orignal From: 程序員必備基礎:Git 命令全方位學習

留言

這個網誌中的熱門文章

Python 併發總結,多線程,多進程,異步IO

1 測量函數運行時間 import time def profile(func): def wrapper(*args, ** kwargs): import time start = time.time() func( *args, ** kwargs) end = time.time() print ' COST: {} ' .format(end - start) return wrapper @profile def fib(n): if n<= 2 : return 1 return fib(n-1) + fib(n-2 ) fib( 35 )   2 啟動多個線程,並等待完成   2.1 使用threading.enumerate() import threading for i in range(2 ): t = threading.Thread(target=fib, args=(35 ,)) t.start() main_thread = threading.currentThread() for t in threading.enumerate(): if t is main_thread: continue t.join()   2.2 先保存啟動的線程 threads = [] for i in range(5 ): t = Thread(target=foo, args= (i,)) threads.append(t) t.start() for t in threads: t.join()   3 使用信號量,限制同時能有幾個線程訪問臨界區 from threading import Semaphore import time sema = Semaphor...

高雄十大包子名店出爐

, 圖文:吳恩文 高雄包子大賽落幕了,我只能就我個人意見, 介紹一下前十名這些包子,但是不能代表其他四位評審的意見,雖然身為評審長,我通常不會第一個表示意見,以免影響其他評審, 我主要工作是負責發問。   這次參賽的素包子很少,而且都不夠細致,又偏油,我不愛, 但是第一名的甜芝麻包-熔岩黑金包,竟然是素食得名- 漢來蔬食巨蛋店。   這包子賣相太好,竹炭粉的黑色外皮刷上金粉,一上桌,眾人驚呼, 搶拍照,內餡是芝麻餡,混一點花生醬增稠,加入白糖芝麻油, 熔岩爆漿的程度剛剛好,我一直以為芝麻要配豬油才行、 但是選到好的黑芝麻油一樣不減香醇, 當下有二位評審就想宅配回家。   尤其特別的是,黑芝麻餡室溫易化,師傅必須要輪班躲在冷藏室內, 穿著大外套才能包,一天包不了多少,我笑說,漢來美食,集團餐廳那麼多,實力雄厚,根本是「 奧運選手報名參加村裡運動會」嘛,其他都是小包子店啊, 但是沒辦法,顯然大家都覺得它好看又好吃, 目前限定漢來蔬食高雄巨蛋店,二顆88元,可以冷凍宅配, 但是要排一陣子,因為供不應求,聽說,四月份, 台北sogo店開始會賣。   第二名的包子,左營寬來順早餐店,顯然平易近人的多,一顆肉包, 十塊錢,是所有參賽者中最便宜的,當然,個頭也小, 它的包子皮明顯和其他不同,灰灰的老麵,薄但紮實有嚼勁, 肉餡新鮮帶汁,因為打了些水,味道極其簡單,就是蔥薑,塩, 香油,薑味尤其明顯,是老眷村的味道, 而特別的是老闆娘是台灣本省人, 當年完全是依據眷村老兵的口味一步一步調整而來,沒有加什麼糖、 五香粉,胡椒粉,油蔥酥。就是蔥薑豬肉和老麵香,能得名, 應該是它的平實無華,鮮美簡單,打動人心。   這是標準的心靈美食,可以撫慰人心,得名之前,寛來順已經天天排隊,現在,恐怕要排更久了, 建議大家六七點早點上門。   第三名,「專十一」很神奇,我記得比賽最後, 大家連吃了幾家不能引起共鳴的包子,有些累,到了專十一, 就坐著等包子,其他評審一吃,就催我趕快試,我一吃, 也醒了大半。   它的包子皮厚薄適中,但是高筋麵粉高些,老麵加一點點酵母, 我心中,它的皮屬一屬二,至於餡又多又好吃,蛋黃還是切丁拌入, 不是整顆放,吃起來「美味、均衡、飽滿」。一顆二十元。   老闆是陸軍專科十一期畢業取名專十一,...

韋伯連續劇終於更新 期待第一季順利完結

  地球天文學界的跳票大王詹姆斯·韋伯空間望遠鏡 (James Webb Space Telescope,縮寫為 JWST)自 1996 年以來斷斷續續不按劇本演出的連續劇終於讓焦慮的觀眾們又等到了一次更新:五層遮陽罩測試順利完成。 裝配完成的韋伯望遠鏡與好夥伴遮陽罩同框啦。Credit: NASA   嚴格的測試是任何空間任務順利成功的重中之重。遮陽罩,這個韋伯望遠鏡異常重要的親密夥伴,要是無法正常運轉的話,韋伯的這一季天文界連續劇說不準就要一直拖更了。   詹姆斯·韋伯空間望遠鏡是歷史上造出的最先進的空間望遠鏡。它不僅是一架紅外望遠鏡,還具有特別高的靈敏度。但想要達到辣么高的靈敏度來研究系外行星和遙遠的宇宙童年,韋伯童鞋必須非常"冷靜",體溫升高的話,靈敏度會大大折損。這個時候,遮陽罩就要大顯身手啦。   遮陽罩在韋伯的設計中至關重要。韋伯望遠鏡會被發射到拉格朗日 L2 點,運行軌道很高,遠離太陽、地球與月球。太陽是韋伯的主要熱量干擾的來源,其次是地球與月球。遮陽罩會有效阻斷來自這三大熱源的能量並保護韋伯維持在工作溫度正常運轉。這個工作溫度指的是零下 220 攝氏度(-370 華氏度;50 開爾文)。 上圖中我們可以看出,韋伯望遠鏡的配置大致可分為兩部分:紅色較熱的一面溫度為 85 攝氏度,藍色較冷的一面溫度達到零下 233 攝氏度。紅色的這部分中,儀器包括太陽能板、通信設備、計算機、以及轉向裝置。藍色部分的主要裝置包括鏡面、探測器、濾光片等。Credit: STSci.   遮陽罩的那一部分和望遠鏡的鏡面這部分可以產生非常極端的溫差。遮陽的這面溫度可以達到 110 攝氏度,足以煮熟雞蛋,而背陰處的部分溫度極低,足以凍結氧氣。   工程師們剛剛完成了五層遮陽罩的測試,按照韋伯在 L2 時的運行狀態安裝了遮陽罩。L2 距離地球約 160 萬公里。NASA 表示這些測試使用了航天器的自帶系統來展開遮陽罩,測試目前都已成功完成。韋伯望遠鏡遮陽罩負責人 James Cooper 介紹說這是遮陽罩"第一次在望遠鏡系統的电子設備的控制下展開。儘管這個任務非常艱巨,難度高,但測試順利完成,遮陽罩展開時的狀態非常驚艷"。   遮陽罩由五層 Kapton 製成。Kapton 是一種聚酰亞胺薄膜材料, 耐高溫絕...