摘要:掌握了命令行,使用圖形化工具如探囊取物。管理的文件狀態(tài)已修改已暫存已提交。由于我們使用了命令,但并未創(chuàng)建新的分支,所以創(chuàng)建了一個匿名分支。省略遠(yuǎn)程分支名表示將本地分支推送到與之存在追蹤關(guān)系的遠(yuǎn)程分支通常同名。
概述
此篇博文意在讓新手快速上手 Git,滿足工作中的基本需求,而非梳理細(xì)節(jié)。后續(xù)會再開一個系列,來探討 Git 細(xì)節(jié)問題。
一、Git 的安裝
這部分網(wǎng)站上資料非常多,根據(jù)自己的系統(tǒng)版本查找資料并下載安裝包安裝即可。
二、初次使用 Git 之前的配置
git config --global user.name "user_name" git config --global user.email "email_address"
復(fù)制代碼
git config --list
復(fù)制代碼
三、理論基礎(chǔ)
可能有很多小伙伴習(xí)慣了 Windows 的操作模式,對命令行相對抵觸。而且市面上確實有諸如 TortoiseGit、SourceTree 等 Git 圖形化工 具,使用體驗也還尚可。但正所謂“Git 的設(shè)計讓使用者覺得自己比想象中的笨”,Git 擁有太多強大的功能,而圖形化工具中只封 裝了其中的一部分,還是命令行的功能全面。其次,很多老鳥回望來路,都認(rèn)為 Git 的學(xué)習(xí)確實需要自底向上的過程。掌握了命令 行,使用圖形化工具如探囊取物。反之則不知其所以然,倘若后面遇到問題,就要抓瞎咯。
SVN 記錄原理
SVN 記錄的是每一次版本變動的內(nèi)容。換句話說,SVN 只保存差異。
Git 記錄原理
Git 記錄的則是將每個版本獨立保存。譬如說 File1 有 5 個版本,那就有 5 個對應(yīng)的拷貝。這種方式看似更浪費空間,但在分支管理上帶來了很多便利。
工作區(qū):就是我們存放代碼的地方,看得見摸得著。
暫存區(qū):實際上是一個文件,其中保存我們的改動。
Git倉庫:最終存放我們所有版本數(shù)據(jù)的位置。HEAD 指針指向的就是我們最新提交的版本。
在工作目錄中增刪、修改文件;
將需要進(jìn)行版本管理的文件放入暫存區(qū);
將暫存區(qū)的文件提交到 Git 倉庫。
已修改(modified);
已暫存(staged);
已提交(committed)。
四、建倉、拉代碼、添加到暫存區(qū)、提交
建立全新項目(空白目錄)
在新建的空目錄中執(zhí)行以下命令,即可建倉:
git init
復(fù)制代碼
建倉之后,可以看到在空白目錄中新增了一個 .git 目錄。這個目錄就是用來跟蹤版本迭代的。
已有項目代碼建倉
進(jìn)入項目代碼根目錄后,執(zhí)行 git init 即可。
默認(rèn)方式
git clone 倉庫地址
復(fù)制代碼
拉取指定分支
git clone -b branch_name 倉庫地址
復(fù)制代碼
我們可以通過增加 -b branch_name 選項來指定 clone 的分支
拉取所有分支
新建一個 Readme.txt,內(nèi)含部分描述信息(這是在工作區(qū)發(fā)生的)。然后將其添加到暫存區(qū):
git add Readme.txt
復(fù)制代碼
如果我們修改了很多文件,逐一 add 過于繁瑣。此時可以通過如下命令,把工作區(qū)的修改一并加入暫存區(qū):
git add -u
復(fù)制代碼
輸入以下命令,將修改提交到 Git 倉庫:
git commit -m "log"
復(fù)制代碼
我們還可以將略過添加暫存區(qū)的步驟,直接將文件提交到 Git 倉庫:
git commit -am "log"
復(fù)制代碼
五、查看工作狀態(tài)和歷史提交
我們可以使用以下命令來查看當(dāng)前的狀態(tài):
git status
復(fù)制代碼
某個文件已經(jīng)加入暫存區(qū),但我們又在工作區(qū)對其進(jìn)行了修改,此時可以再次執(zhí)行 git add,更新暫存區(qū)中的狀態(tài)。
如果我們在工作區(qū)修改了某個文件,但這些修改不想要了,那么可以執(zhí)行以下命令,來還原工作區(qū)中的文件:
git checkout -- file_name
復(fù)制代碼
這里要注意,如果暫存區(qū)中有此文件,則會用暫存區(qū)的版本來覆蓋工作區(qū)。如果暫存區(qū)中沒有此文件,則會以 Git 倉庫中的版本來覆蓋工作區(qū)中的版本。如果想還原成 Git 倉庫的版本,則可以先用 :
git reset HEAD file_name
復(fù)制代碼
?將其從暫存區(qū)中移出,然后再使用 :
git checkout -- file_name
復(fù)制代碼
從而使工作區(qū)中的文件還原為 Git 倉庫中的狀態(tài)。
我們可以使用 git log 來查看歷史提交。commit ID 是根據(jù) sha1 算出來的。為什么不像 SVN 那樣,從 1 開始排序?因為 Git 是分布式的,這樣會引發(fā)沖突。
?--decorate:顯示每個commit的引用(如:分支、tag等);
?--oneline:單行顯示(簡化版 log)
?--graph:以圖形化方式查看 commit
?--all:查看所有分支的 commit
六、回到過去
用 Git 倉庫中 HEAD 所指版本覆蓋暫存區(qū)(指定文件)
git reset HEAD file_name
復(fù)制代碼
用 Git 倉庫中 HEAD 所指版本覆蓋暫存區(qū)(所有文件)
git reset HEAD
復(fù)制代碼
如何使用 Git 倉庫中的其他版本覆蓋暫存區(qū)
首先,假設(shè)我們在工作區(qū)的所有修改都 add 并且 commit 了,可以用下圖來表示當(dāng)前狀態(tài):
接下來,使用 reset 命令來回滾快照:
git reset HEAD~
復(fù)制代碼
?~ 表示HEAD所指版本的前一個版本,~~ 等以此類推。如果 ~ 太多不便表示,可以在 ~ 后加數(shù)字來指定
回滾之后的狀態(tài)如下:
注意,reset 命令實際包含了兩個動作:
移動 HEAD 的指向,可以將其指向之前的快照(HEAD 指針的位置發(fā)生了改變,所以看 log 時,看不到最后一次提交的信息。要用 git reflog 才能看到所有 log)。
用 HEAD 移動后指向的快照覆蓋暫存區(qū)。
?--mixed
git reset --mixed HEAD~
復(fù)制代碼
--mixed?是默認(rèn)選項,不寫也會自動加上
移動 HEAD 的指向,可以將其指向之前的快照。并用 HEAD 移動后指向的快照覆蓋暫存區(qū)。
?--soft
git reset --soft HEAD~
復(fù)制代碼
使用 --soft 選項,只移動 HEAD 的指向,使其指向之前的快照,但并不覆蓋暫存區(qū)中的內(nèi)容。
這種用法通常用于撤銷錯誤的 commit。
--hard
git reset --hard HEAD~6
復(fù)制代碼
移動 HEAD 的指向,使其指向之前的快照。并用 HEAD 移動后指向的快照來覆蓋暫存區(qū)中的內(nèi)容。此外,還會將暫存區(qū)中的文件還原到工作區(qū)(也是 HEAD 所指的 Git 倉庫版本的狀態(tài))。
git reset commit_ID
復(fù)制代碼
數(shù) HEAD 畢竟麻煩,我們也可以使用commit ID 來指定 reset 到哪個版本(不用全部 ID,足夠識別就行了)。
git reset commit_ID file_name
復(fù)制代碼
回滾個別文件時,HEAD 指針就不移動了。
git reset commit_ID
復(fù)制代碼
?視情況使用 --hard
七、版本對比
git diff
復(fù)制代碼
git diff commit_ID1 commit_ID2
復(fù)制代碼
git diff commit_ID
復(fù)制代碼
?commit ID 用 HEAD 這種方式也可以
git diff --cached/--staged [commit ID]
復(fù)制代碼
?#如果不指定快照ID,則默認(rèn)和倉庫中最新commit比較
八、常用的小技巧
情景一:代碼已經(jīng) commit 到倉庫,突然想起還有兩個文件沒有 add。
情景二:代碼已經(jīng) commit 到倉庫,突然想起 log 寫得不全面。
執(zhí)行帶 --amend 選項的 commit 命令,Git 就會“更正”最近的一次提交。
git commit --amend? ?在接下來的界面中可修改 log
git commit --amend -m "new log"? ? 直接提交新 log
git rm file_name
復(fù)制代碼
此命令刪除的只是工作區(qū)和暫存區(qū)的文件,也就是取消跟蹤,下次提交時,不納入版本控制。已經(jīng)提交到 Git 倉庫的文件是不會刪除的,需要移動 HEAD 指針來切掉。
如果誤刪除,可以使用以下命令來恢復(fù):
git checkout -- file_name
復(fù)制代碼
工作區(qū)和暫存區(qū)有差異
如果某個文件在工作區(qū)和暫存區(qū)的內(nèi)容不一致,git rm 執(zhí)行時會報錯。我們可以用:
git rm -f file_name
復(fù)制代碼
這會同時把工作區(qū)和暫存區(qū)的文件刪除。
如果需要只刪除暫存區(qū)的文件,保存工作區(qū)的文件,則可以執(zhí)行 :
git rm --cached file_name
復(fù)制代碼
git mv old_name new_name
復(fù)制代碼
九、分支與分支管
git branch branch_name
復(fù)制代碼
創(chuàng)建 branch_name 分支
git checkout -b branch_name
復(fù)制代碼
?創(chuàng)建 branch_name 分支,并切換到此分支
git checkout branch_name
復(fù)制代碼
查看本地分支
git branch -v
復(fù)制代碼
查看遠(yuǎn)程分支
git branch -r
復(fù)制代碼
查看本地分支和遠(yuǎn)程分支
git branch -a
復(fù)制代碼
git merge branch_name
復(fù)制代碼
將 branch_name 分支合并到當(dāng)前分支。
如果 merge 時提示 conflict,則需要手動解決沖突。Git 會在沖突的文件中加入一些提示。
git branch -d branch_name
復(fù)制代碼
刪除分支后再查看 log,會發(fā)現(xiàn)雖然這些分支沒有了,但在這些分支上提交的Commit ID依然存在。
git checkout commit_ID
復(fù)制代碼
此時是分離頭指針狀態(tài)。由于我們使用了 checkout 命令,但并未創(chuàng)建新的分支,所以 Git 創(chuàng)建了一個匿名分支。既然是匿名分支,如果我們切換到其他分支,匿名分支中的所有操作都會被丟棄。所以我們可以用匿名分支來做些實驗,反正沒有什么影響。如果想保留匿名分支的操作,可以根據(jù) Git 提示來操作,為其新建一個正式的分支。
8.本地分支與遠(yuǎn)程分支關(guān)聯(lián)
git branch --set-upstream-to=origin/
復(fù)制代碼
使用git在本地新建一個分支后,需要做遠(yuǎn)程分支關(guān)聯(lián)。如果沒有關(guān)聯(lián),git會在下面的操作中提示你顯示的添加關(guān)聯(lián)。
關(guān)聯(lián)目的是在執(zhí)行g(shù)it pull git push操作時就不需要指定對應(yīng)的遠(yuǎn)程分支,你只要沒有顯示指定,git pull的時候,就會提示你。
十、將本地修改推到服務(wù)器端
前面說過,Git 是分布式的 VCS 工具。我們本地有自己的倉庫,服務(wù)器端有服務(wù)器端的倉庫。為了確保其他人 clone 的代碼中能包含我們的修改,就要把我們本地的修改推到服務(wù)器端。
我們通過 git push 命令,將本地修改推送到服務(wù)器端:
git push <遠(yuǎn)程主機名> <本地分支名>:<遠(yuǎn)程分支名>
復(fù)制代碼
通常用 origin 來表示遠(yuǎn)程主機名。
表示將本地分支推送到與之存在追蹤關(guān)系的遠(yuǎn)程分支(通常同名)。如果該遠(yuǎn)程分支不存在,則會新建。
origin: 遠(yuǎn)程主機名
master: 本地分支名
git push origin master
復(fù)制代碼
表示刪除遠(yuǎn)程分支。這一操作等同于推送一個空的本地分支到遠(yuǎn)程分支。
?origin : 遠(yuǎn)程主機名
?refs/for/master: 遠(yuǎn)程分支名
git push origin :dev
復(fù)制代碼
如果當(dāng)前分支與遠(yuǎn)程分支存在追蹤關(guān)系,則本地分支和遠(yuǎn)程分支都可以省略,將當(dāng)前分支推送到origin主機的對應(yīng)分支。
git push origin
復(fù)制代碼
如果當(dāng)前分支只有一個遠(yuǎn)程分支,那么主機名都可以省略:
git push
復(fù)制代碼
如果我們本地的代碼不是服務(wù)器上最新版本,push 代碼時會被拒絕。此時我們要先更新本地代碼,再push到服務(wù)器。
git reset --hard
復(fù)制代碼
將本地代碼恢復(fù)到最新commit狀態(tài)
git pull --reba
復(fù)制代碼
?將服務(wù)器更新合并到本地
十一、更新本地代碼
前文說到,Git 是分布式的 VCS,很多人都會向服務(wù)器端 push 修改。接下來看看,我們?nèi)绾螌?a href="http://systransis.cn/site/product/uhost.html?ytag=uclub" target="_blank">服務(wù)器上的更新同步到本地。
此時的本地代碼處于 clean 狀態(tài),所以可以直接使用 git pull 來更新。
修改需要保留
此時要先將修改 push 到服務(wù)器端,然后再使用 git pull 來更新。
修改無需保留
由于修改無需保留,我們可以使用 git reset --hard 將代碼恢復(fù)到 clean 狀態(tài),然后再使用
?git pull 來更新。
由于我們在自己的分支(假定分支名為 mybranch)上修改,master 處于 clean 狀態(tài)。此時要分四步處理:
切換到 master 分支:
git checkout master
復(fù)制代碼
?更新 master 分支:
git pull
復(fù)制代碼
?切換到 mybranch 分支:
git checkout mybranch
復(fù)制代碼
?把 master 分支合并到 mybranch 分支:
git merge master
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/126147.html
本文代碼均來正點原子標(biāo)準(zhǔn)例程 聲明:本文不是教學(xué)文章,可能也不適合初學(xué)者閱讀 不知為什么,最近總蹦出有很多想法(可能是工作太閑了)一會想學(xué)這,一會想學(xué)那,這不,突然想復(fù)習(xí)一下STM32了。 我好久以前就學(xué)過正點原子的課程,還買過一些開發(fā)板,但現(xiàn)在手上只有一個核心板了,就暫且湊合著用吧。 我是個喜歡制定計劃的人,既然有了想法,那就得制定一個學(xué)習(xí)計劃,估摸了一下,明天要上班,現(xiàn)在已經(jīng)中午了,所以我只...
摘要:多個頁簽的顯示,其實不難,有現(xiàn)成的組件,于是老夫?qū)懘a就是一把梭,擼起袖子就是干,噼里啪啦一頓寫,寫完一測,沒有任何問題,實在是不要太簡單,丟給產(chǎn)品預(yù)覽復(fù)制瀏覽器地址到別的地方粘貼,不能正確回顯內(nèi)需要實現(xiàn)跳轉(zhuǎn),而且要能返回。 前言 最近收到一個這樣的需求,要求做一個基于 vue 和 element-ui 的通用后臺框架頁,具體要求如下: 要求通用性高,需要在后期四十多個子項目中使用,...
摘要:然后類似一樣我的命名是可以在頁面的任何地方使用,如果你對具體的實現(xiàn)方法有興趣,歡迎點擊本文結(jié)尾的鏈接,去我的倉庫上查看。 前言 最近收到一個這樣的需求,要求做一個基于 vue 和 element-ui 的通用后臺框架頁,具體要求如下: 要求通用性高,需要在后期四十多個子項目中使用,所以大部分地方都做成可配置的. 要求做成腳手架的形式.可以 npm 安裝 要求實現(xiàn)多頁簽,并且可以通過瀏...
閱讀 3546·2023-04-25 20:09
閱讀 3745·2022-06-28 19:00
閱讀 3066·2022-06-28 19:00
閱讀 3092·2022-06-28 19:00
閱讀 3185·2022-06-28 19:00
閱讀 2886·2022-06-28 19:00
閱讀 3057·2022-06-28 19:00
閱讀 2643·2022-06-28 19:00