作者:你喜歡吃青椒么
juejin.im/post/5d157bf3f265da1bcc1954e6
前言
本文是參考廖雪峰老師的Git資料再加上我自己對Git的理解,記錄我的Git學習歷程,作下此文是為以后學習,作業,開發中如果遇到問題可以回過頭來參考參考,因為水平有限,難免會有出錯的地方,歡迎指正,
Git是什么
官方話:Git是一個免費的開源分布式版本控制系統,旨在快速高效地處理從小型到大型專案的所有事務,
參考廖雪峰老師的話,它能自動幫我記錄每次檔案的改動,還可以讓同事協作編輯,這樣就不用自己管理一堆類似的檔案了,也不需要把檔案傳來傳去,如果想查看某次改動,只需要在軟體里瞄一眼就可以,
為什么要學習Git
-
面試要被問,可以應付面試,
-
很多公司開發都用Git來處理專案,現在不學,以后肯定還要學,
-
在我看來Git是現如今所有程式員都要掌握的,以后與同事共同開發專案必定要用到的,熟練掌握Git命令,可以提高開發的效率,
安裝Git
Windows
直接在官網上去下載,下載完成后,隨便在某個檔案下右鍵如果有Git Bash Here就安裝成功,安裝后,還要在命令列輸入
$git config --global user.name "你的名字"
$git config --global user.email "你的郵箱"
global表示全域,這臺機器所有的Git倉庫都會使用這個配置,允許單個倉庫使用其他的名字和郵箱,
Mac
Mac也可以像Windows一樣,按上面的步驟安裝,
也可以直接從AppStore安裝Xcode,Xcode集成了Git,不過默認沒有安裝,你需要運行Xcode,選擇選單“Xcode”->“Preferences”,在彈出視窗中找到“Downloads”,選擇“Command Line Tools”,點“Install”就可以完成安裝了,
倉庫

本地倉庫是對于遠程倉庫而言的,本地倉庫 = 作業區 + 版本區,
-
作業區即磁盤上的檔案集合,
-
版本區(版本庫)即.git檔案,
-
版本庫 = 暫存區(stage) + 分支(master) + 指標Head,
以我使用最頻繁的git命令為例,即提交到github為例,
-
git init 原本本地倉庫只包含著作業區,這是最常見的作業狀態,此時,git init一下,表示在本地區域創建了一個.git檔案,版本區建立,
-
git add . 表示把作業區的所有檔案全部提交到版本區里面的暫存區
-
當然你也可以通過 git add ./xxx/ 一條一條分批添加到暫存區,
-
git commit -m "xxx" 把暫存區的所有檔案提交到倉庫區,暫存區空空蕩蕩,
-
git remote add origin https://github.com/name/name_cangku.git 把本地倉庫與遠程倉庫連接起來,
-
git push -u origin master 把倉庫區的檔案提交到遠程倉庫里,
-
一旦提交后,如果你又沒有對作業區做任何修改,那么作業區就是“干凈”的,會有這樣的資訊nothing to commit, working tree clean
提交到GitHub
以前不熟悉git命令的時候,我提交專案到github上都是直接在網頁上直接拉取檔案提交上去的,有點羞恥,

-
git init .初始化,表示把這個檔案變成Git可以管理的倉庫,初始化后打開隱藏的檔案可以看到有一個.git檔案,
-
git add . 后面的一個點表示把這個檔案全部提交到暫存區,
-
git add ./readme.md/ 表示把這個檔案下面的readme.md檔案提交到暫存區,
-
git commit -m "你要評論一點什么東西" git commit的意思是把暫存區的全部檔案提交到本地倉庫,-m后接評論,
-
git remote add origin https://github.com/name/name_cangku.git表示把你本地的倉庫與GitHub上的遠程倉庫連接起來,只需要連接一次,以后提交的時候就可以不用謝這條命令了,name是你的github名字,name_cangku是你的倉庫名,注意不要把后面的.git給漏掉了,因為我前面就是這么走過來的,繞了很多彎路,至于如何在GitHub上新建倉庫,網上有很多教程,這里不再贅述了,
-
git push -u origin master 把本地倉庫提交到遠程倉庫,(最后一步)在你的遠程倉庫上重繪一下就可以看到你提交的檔案了,
-
最后提到的是,在git commit -m ""之前,可以重復git add到暫存區,但是git commit會把你之前存放在暫存區的全部檔案一次性全部提交到本地倉庫,
版本的回溯與前進
提交一個檔案,有時候我們會提交很多次,在提交歷史中,這樣就產生了不同的版本,每次提交,Git會把他們串成一條時間線,如何回溯到我們提交的上一個版本,用git reset --hard + 版本號即可,版本號可以用git log來查看,每一次的版本都會產生不一樣的版本號,
回溯之后,git log查看一下發現離我們最近的那個版本已經不見了,但是我還想要前進到最近的版本應該如何?只要git reset --hard + 版本號就行,退一步來講,雖然我們可以通過git reset --hard + 版本號,靠記住版本號來可以在不同的版本之間來回穿梭,
但是,有時候把版本號弄丟了怎么辦?git reflog幫你記錄了每一次的命令,這樣就可以找到版本號了,這樣你又可以通過git reset來版本穿梭了,
撤銷
場景1:在作業區時,你修改了一個東西,你想撤銷修改,git checkout -- file,廖雪峰老師指出撤銷修改就回到和版本庫一模一樣的狀態,即用版本庫里的版本替換作業區的版本,
場景2:你修改了一個內容,并且已經git add到暫存區了,想撤銷怎么辦?回溯版本,git reset --hard + 版本號,再git checkout -- file,替換作業區的版本,
場景3:你修改了一個內容,并且已經git commit到了master,跟場景2一樣,版本回溯,再進行撤銷,
洗掉
如果你git add一個檔案到暫存區,然后在作業區又把檔案洗掉了,Git會知道你洗掉了檔案,如果你要把版本庫里的檔案洗掉,git rm 并且git commit -m "xxx".
如果你誤刪了作業區的檔案,怎么辦?使用撤銷命令,git checkout --就可以,這再次證明了撤銷命令其實就是用版本庫里的版本替換作業區的版本,無論作業區是修改還是洗掉,都可以“一鍵還原”,
分支
分支,就像平行宇宙,廖雪峰老師如是說,你創建了一個屬于你自己的分支,別人看不到,還繼續在原來的分支上正常作業,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人作業,用 Git 和 Github 提高效率的 10 個技巧!這篇也推薦看下,
創建與合并分支

在沒有其他分支插進來時,只有一個master主分支,每次你git push -u origin master 提交就是增加一條時間軸,master也會跟著移動,

創建一個other的分支,通過other提交,雖然時間軸向前走了,但是主分支master還在原來的位置,

理論分析完,看一下命令怎么寫,
創建分支other,切換到other分支,
git branch other
git checkout other
查看當前所有分支
git branch
* other master
當前的分支會有一個*
用other提交
git add ./xxx/
git commit -m "xxx"
other分支完成,切換回master
git checkout master
此時,master分支上并沒有other的檔案,因為分支還沒有合并,
合并分支
git merge other
合并完成之后,就可以在master分支上查看到檔案了,
洗掉other分支
git branch -d other
我由此想到,在以后作業中,應該是一個開放小組共同開發一個專案,組長會創建很多分支,每一個分支可以交給一個人去開發某一個功能,一個小組共同開發而且不會相互干擾,誰的功能完成了,可以由組長合并一下完成了的分支,哦,完美!
解決合并分支問題

假如有這樣一種情況,分支other已經commit了,但是此時指標指回master時,并且master沒有合并,而是git add / commit 提交了,這樣,就產生了沖突,主分支master檔案內容與other分支的內容不一樣,合并不起來!所以,
-
修改檔案的內容,讓其保持一致,
-
git add git commit 提交,
-
分支合并了,

-
git log --graph 查看分支合并圖
-
git branch -d other 洗掉分支,任務結束,
分支管理策略
git merge --no-ff other 禁用Fast forward模式,因為使用Fast forward模式,洗掉分支后,分支歷史資訊會丟失,超詳細的 Git 實戰教程,傻瓜一看也會!這篇也推薦看下,
BUG分支
廖雪峰老師提到,作業中每個bug都可以通過一個新的臨時分支來修復,修復后,合并分支,然后將臨時分支洗掉,但如果你手上有分支在作業中,你的上級要你改另外的分支的BUG,
你要把現在正在作業的分支保存下來,git stash,把當前作業現場“存盤”起來,等以后恢復后繼續作業,當你解決BUG后,git checkout other回到自己的分支,用git stash list查看你剛剛“存放”起來的作業去哪里了,
此時你要恢復作業:
-
git stash apply恢復卻不洗掉stash內容,git stash drop洗掉stash內容,
-
git stash pop恢復的同時把stash內容也刪了.
-
此時,用git stash list查看,看不到任何stash 內容,
總結:修復bug時,我們會通過創建新的bug分支進行修復,然后合并,最后洗掉;當手頭作業沒有完成時,先把作業現場git stash一下,然后去修復bug,修復后,再git stash pop,回到作業現場
洗掉分支
-
git branch -d + 分支有可能會洗掉失敗,因為Git會保護沒有被合并的分支,
-
git branch -D + 分支 強行洗掉,丟棄沒被合并的分支,
多人協作
-
git remote 查看遠程庫的資訊,會顯示origin,遠程倉庫默認名稱為origin
-
git remote -v顯示更詳細的資訊
-
git push -u origin master推送master分支到origin遠程倉庫,
-
git push -u origin other 推送other到origin遠程倉庫,
抓取分支

產生上圖的沖突時,
-
git pull 把最新的提交從遠程倉庫中抓取下來,在本地合并,解決沖突,在進行git pull
-
如果git pull 也失敗了,還要指定分支之間的鏈接,這一步Git會提醒你怎么做,然后再git pull,
廖雪峰老師的總結:多人協作的作業模式通常是這樣:
-
首先,可以試圖用git push origin
推送自己的修改;
-
如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合并;
-
如果合并有沖突,則解決沖突,并在本地提交;
-
沒有沖突或者解決掉沖突后,再用git push origin
推送就能成功!
-
如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream-to origin/,
Rebase
git rebase 把分叉的提交歷史“整理”成一條直線,看上去更直觀.缺點是本地的分叉提交已經被修改過了,
最后在進行git push -u origin master
rebase的目的是使得我們在查看歷史提交的變化時更容易,因為分叉的提交需要三方對比,
標簽管理
比如一個APP要上線,通常在版本庫中打一個標簽(tag),這樣,就確定了打標簽的版本,將來無論什么時候,取某個標簽的版本,就是把那個打標簽的時刻的歷史版本取出來,所以,標簽也是版本庫的一個快照,
Git的標簽雖然是版本庫的快照,但其實它就是指向某個commit的指標,
tag其實就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起,比如tag v2.1就是把歷史上的一個版本的東西叫做v2.1
創建標簽
步驟:
-
git branch查看當前分支,git checkout master切換到master分支,
-
git tag
打標簽,默認為HEAD,比如git tag v1.0 -
默認標簽是打在最新提交的commit上的,如果想要打標簽在以前的commit上,要git log找到歷史提交的commit id.
-
如果一個commt id是du2n2d9,執行git tag v1.0 du2n2d9就把這個版本打上了v1.0的標簽了,
-
git tag 查看所有標簽,可以知道歷史版本的tag
-
標簽不是按時間順序列出,而是按字母排序的,
-
git show
查看標簽資訊, -
git tag -a <標簽名> -m "<說明>",創建帶說明的標簽,-a指定標簽名,-m指定說明文字,用show可以查看說明,
操作標簽
-
git tag -d v1.0 洗掉標簽,因為創建的標簽都只存盤在本地,不會自動推送到遠程,所以,打錯的標簽可以在本地安全洗掉,
-
git push origin
推送某個標簽到遠程 -
git push origin --tags 一次性推送全部尚未推送到遠程的本地標簽
-
如果標簽推送到遠程,git tag -d v1.0 先洗掉本地標簽v1.0,git push origin :refs/tags/v1.0洗掉遠程標簽v1.0
自定義Git
-
git config --global color.ui true讓Git顯示顏色,會讓命令輸出看起來更醒目
-
忽略特殊檔案 創建一個.gitignore檔案,把需要忽略的檔案名填進去,Git就會自動忽略這些檔案,我也在學習中遇到過這樣的問題,比如node_modules檔案就可以忽略,
忽略檔案原則:忽略作業系統自動生成的檔案,比如縮略圖等;忽略編譯生成的中間檔案、可執行檔案等,也就是如果一個檔案是通過另一個檔案自動生成的,那自動生成的檔案就沒必要放進版本庫,比如Java編譯產生的.class檔案;忽略你自己的帶有敏感資訊的組態檔,比如存放口令的組態檔,
-
強制提交已忽略的的檔案,git add -f
-
git check-ignore -v
檢查為什么Git會忽略該檔案, -
給Git命令配別名,這個有點騷,就是你以后想輸入git rebase時,你給它一個“外號”,就叫它git nb,以后你可以通過git nb來代替git rebase,
常用Git命令總結
-
git config --global user.name "你的名字" 讓你全部的Git倉庫系結你的名字
-
git config --global user.email "你的郵箱" 讓你全部的Git倉庫系結你的郵箱
-
git init 初始化你的倉庫
-
git add . 把作業區的檔案全部提交到暫存區
-
git add ./
/ 把作業區的 檔案提交到暫存區 -
git commit -m "xxx" 把暫存區的所有檔案提交到倉庫區,暫存區空空蕩蕩
-
git remote add origin https://github.com/name/name_cangku.git 把本地倉庫與遠程倉庫連接起來
-
git push -u origin master 把倉庫區的主分支master提交到遠程倉庫里
-
git push -u origin <其他分支> 把其他分支提交到遠程倉庫
-
git status查看當前倉庫的狀態
-
git diff 查看檔案修改的具體內容
-
git log 顯示從最近到最遠的提交歷史
-
git clone + 倉庫地址下載克隆檔案
-
git reset --hard + 版本號 回溯版本,版本號在commit的時候與master跟隨在一起
-
git reflog 顯示命令歷史
-
git checkout --
撤銷命令,用版本庫里的檔案替換掉作業區的檔案,我覺得就像是Git世界的ctrl + z -
git rm 洗掉版本庫的檔案
-
git branch 查看當前所有分支
-
git branch <分支名字> 創建分支
-
git checkout <分支名字> 切換到分支
-
git merge <分支名字> 合并分支
-
git branch -d <分支名字> 洗掉分支,有可能會洗掉失敗,因為Git會保護沒有被合并的分支
-
git branch -D + <分支名字> 強行洗掉,丟棄沒被合并的分支
-
git log --graph 查看分支合并圖
-
git merge --no-ff <分支名字> 合并分支的時候禁用Fast forward模式,因為這個模式會丟失分支歷史資訊
-
git stash 當有其他任務插進來時,把當前作業現場“存盤”起來,以后恢復后繼續作業
-
git stash list 查看你剛剛“存放”起來的作業去哪里了
-
git stash apply 恢復卻不洗掉stash內容
-
git stash drop 洗掉stash內容
-
git stash pop 恢復的同時把stash內容也刪了
-
git remote 查看遠程庫的資訊,會顯示origin,遠程倉庫默認名稱為origin
-
git remote -v 顯示更詳細的資訊
-
git pull 把最新的提交從遠程倉庫中抓取下來,在本地合并,和git push相反
-
git rebase 把分叉的提交歷史“整理”成一條直線,看上去更直觀
-
git tag 查看所有標簽,可以知道歷史版本的tag
-
git tag
打標簽,默認為HEAD,比如git tag v1.0 -
git tag
<版本號> 把版本號打上標簽,版本號就是commit時,跟在旁邊的一串字母數字 -
git show
查看標簽資訊 -
git tag -a
-m "<說明>" 創建帶說明的標簽,-a指定標簽名,-m指定說明文字 -
git tag -d
洗掉標簽 -
git push origin
推送某個標簽到遠程 -
git push origin --tags 一次性推送全部尚未推送到遠程的本地標簽
-
git push origin :refs/tags/
洗掉遠程標簽 -
git config --global color.ui true 讓Git顯示顏色,會讓命令輸出看起來更醒目
-
git add -f
強制提交已忽略的的檔案 -
git check-ignore -v
檢查為什么Git會忽略該檔案
關注公眾號Java技術堆疊回復"面試"獲取我整理的2020最全面試題及答案,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141655.html
標籤:Java
下一篇:創建執行緒池注意、自定義執行緒池
