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