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。
相關推薦:《php入門教學》
提交到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分支。
gitbranch other gitcheckout other
查看当前所有分支
gitbranch * othermaster
当前的分支会有一个*
用other提交
gitadd ./xxx/ git commit -m"xxx"
other分支完成,切换回master
git checkoutmaster
此时,master分支上并没有other的文件,因为分支还没有合并。
合并分支
gitmergeother
合并完成之后,就可以在master分支上查看到文件了。
删除other分支
gitbranch -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
預設標籤是打在最新提交的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 標籤 -d v1.0 刪除標籤。因為建立的標籤都只儲存在本地,不會自動推送到遠端。所以,打錯的標籤可以在本地安全刪除。
git push origin
git push origin --tags 一次推送全部尚未推送到遠端的本地標籤
#git push origin --tags 一次推送全部尚未推送到遠端的本地標籤
#如果標籤推送到遠端。 git tag -d v1.0 先刪除本地標籤v1.0。 git push origin :refs/tags/v1.0刪除遠端標籤v1.0
#自訂Gitgit config --global color.ui true讓Git顯示顏色,會讓指令輸出看起來更醒目
忽略特殊文件建立一個.gitignore文件,把需要忽略的文件名稱填進去。 Git就會自動忽略這些檔案。我也在學習中遇到這樣的問題,例如node_modules檔案就可以忽略。
忽略文件原則:忽略作業系統自動產生的文件,例如縮圖等;忽略編譯產生的中間文件、執行檔等,也就是如果一個文件是透過另一個文件自動產生的,那自動產生的文件就沒必要放進版本庫,例如Java編譯產生的.class檔案;忽略你自己的帶有敏感資訊的設定文件,例如存放口令的設定檔。
強制提交已忽略的文件。 git add -f
git check-ignore -v
給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 tag
git show
git tag -a
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
gitbranch other
以上是大牛總結出來的Git使用技巧,太實用了的詳細內容。更多資訊請關注PHP中文網其他相關文章!