国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統 > 正文

一些常用的Git 知識點整頓

2024-06-09 16:59:47
字體:
來源:轉載
供稿:網友
Git基本概念
 repository
 config
 init
 clone
 fetch
 pull
 commit
 push
 branch
 head
 tag
 merge
 conflict
 diff
 log
 show
 status
2. Git工作空間和文件狀態
(1).工作空間
 
 
 
左側為工作區,右側為版本庫。
 
 工作區(Working Directory) 就是在電腦里能看到的目錄,比如learngit文件夾就是一個工作區。
 版本庫(Repository)工作區有一個隱藏目錄.git,是Git的版本庫。
在版本庫中標記為index的區域為暫存區,標記為master的是Git為我們自動創建的第一個分支,代表的是目錄樹。此時HEAD實際是指向master分支的一個“游標”,所以圖示的命令中出現HEAD的地方可以用master來替換。圖中的objects標識的區域為git的對象庫,實際位于.git/objects目錄下。
 
 當對工作區修改(或新增)的文件執行git add命令時,暫存區的目錄樹會被更新,同時工作區修改(或新增)的文件內容會被寫入到對象庫中的一個新的對象中,而該對象的id被記錄在暫存區的文件索引中。
 當執行提交操作git commit時,暫存區的目錄樹會寫到版本庫(對象庫)中,master分支會做相應的更新,即master最新指向的目錄樹就是提交時原暫存區的目錄樹。
 當執行git reset HEAD命令時,暫存區的目錄樹會被重寫,會被master分支指向的目錄樹所替換,但是工作區不受影響。
 當執行git rm --cached命令時,會直接從暫存區刪除文件,工作區則不做出改變。
 當執行git checkout .或git checkout --命令時,會用暫存區全部的文件或指定的文件替換工作區的文件。這個操作很危險,會清楚工作區中未添加到暫存區的改動。
 當執行git checkout HEAD .或git checkout HEAD命令時,會用HEAD指向的master分支中的全部或部分文件替換暫存區和工作區中的文件。這個命令也是極度危險的。因為不但會清楚工作區中未提交的改動,也會清楚暫存區中未提交的改動。
(1).文件狀態
 
Git 有三種狀態,你的文件可能處于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。
 
3. Git配置系統級、全局、當前倉庫用戶名、郵箱的命令
系統級、全局、當前倉庫選項分別是:倉庫-system、-global、-local(或默認不填)
 
git config --global user.name "Jerry Mouse"  
git config --global user.email "jerry@yiibai.com"
列出Git設置
 
git config --list  
git config -l
4. Git fetch和pull的區別
 git fetch:相當于是從遠程獲取最新版本到本地,不會自動merge.
 git pull:相當于是從遠程獲取最新版本并merge到本地.
(1). git fetch示例:
 
Git fetch origin master  
git log -p master..origin/master  
git merge origin/master
以上命令的含義:
 
 首先從遠程的origin的master主分支下載最新的版本到origin/master分支上
 然后比較本地的master分支和origin/master分支的差別
 最后進行合并
 上述過程其實可以用以下更清晰的方式來進行:
(1). git pull示例:
 
git pull origin master
上述命令其實相當于git fetch和git merge。在實際使用中,git fetch更安全一些,因為在merge前,我們可以查看更新情況,然后再決定是否合并。
 
5. Git reset和revert的卻別
 git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。
 在回滾這一操作上看,效果差不多。但是在日后繼續merge以前的老版本時有區別。因為git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時,導致這部分改變不會再次出現,但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入。
 git reset是把HEAD向后移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。
 git revert與git reset最大的不同是,git revert 僅僅是撤銷某次提交。
另外,說一下git revert, git reset –hard和 –soft的區別
 
 git reset –mixed id: 是將git的HEAD變了(也就是提交記錄變了),但文件并沒有改變,(也就是working tree并沒有改變)。
 git reset –soft id: 實際上,是git reset –mixed id后,又做了一次git add。
 git reset –herd id: 是將git的HEAD變了,文件也變了。
6. Git merge和reabse的相同點和不同點
merge是合并的意思,rebase是復位基底的意思,相同點都是用來合并分支的。
 
 
 
不同點:
 
 merge操作會生成一個新的節點,之前的提交分開顯示。而rebase操作不會生成新的節點,是將兩個分支融合成一個線性的提交。
 解決沖突時。merge操作遇到沖突的時候,當前merge不能繼續進行下去。手動修改沖突內容后,add 修改,commit就可以了。而rebase操作的話,會中斷rebase,同時會提示去解決沖突。解決沖突后,將修改add后執行git rebase –continue繼續操作,或者git rebase –skip忽略沖突。
 git pull和git pull --rebase區別:git pull做了兩個操作分別是”獲取”和”合并”。所以加了rebase就是以rebase的方式進行合并分支,默認為merge。
總結:選擇 merge 還是 rebase?
 
 merge 是一個合并操作,會將兩個分支的修改合并在一起,默認操作的情況下會提交合并中修改的內容
 merge 的提交歷史忠實地記錄了實際發生過什么,關注點在真實的提交歷史上面
 rebase 并沒有進行合并操作,只是提取了當前分支的修改,將其復制在了目標分支的最新提交后面
 rebase 的提交歷史反映了項目過程中發生了什么,關注點在開發過程上面
 merge 與 rebase 都是非常強大的分支整合命令,沒有優劣之分,使用哪一個應由項目和團隊的開發需求決定
 merge 和 rebase 還有很多強大的選項,可以使用 git help 查看
7. Git stash是什么?它的相關使用方式命令
 git stash: 備份當前的工作區的內容,從最近的一次提交中讀取相關內容,讓工作區保證和上次提交的內容一致。同時,將當前的工作區內容保存到Git棧中。
 git stash pop: 從Git棧中讀取最近一次保存的內容,恢復工作區的相關內容。由于可能存在多個Stash的內容,所以用棧來管理,pop會從最近的一個stash中讀取內容并恢復。
 git stash pop –index stash@{0}: 恢復編號為0的進度的工作區和暫存區。
 git stash apply stash@{1} 以將你指定版本號為stash@{1}的工作取出來
 git stash drop[] 刪除某一個進度,默認刪除最新進度
 git stash list: 顯示Git棧內的所有備份,可以利用這個列表來決定從那個地方恢復。
 git stash clear: 清空Git棧。此時使用gitg等圖形化工具會發現,原來stash的哪些節點都消失了
# 恢復工作進度  
git stash pop [--index] [<stash>]  
--index 參數:不僅恢復工作區,還恢復暫存區  
<stash> 指定恢復某一個具體進度。如果沒有這個參數,默認恢復最新進度  
# 這是git stash保存進度的完整命令形式  
git stash [save message] [-k|--no-keep-index] [--patch]  
-k和--no-keep-index指定保存進度后,是否重置暫存區  
--patch 會顯示工作區和HEAD的差異,通過編輯差異文件,排除不需要保存的內容。和git add -p命令類似  
使用save可以對進度添加備注  
# git stash save "這是保存的進度"
8. Git只從暫存區刪除,從工作空間刪除的命令分別是什么?
git rm --cached  
git rm  
git commit
9. Git標簽的使用
# 列出現有的標簽  
git tag  
# 打標簽  
git tag -a v1.01 -m "Relase version 1.01"  
# 查看相應標簽的版本信息  
git show v1.4
 -a 選項,創建一個含附注類型的標簽
 -m 選項,指定了對應的標簽說明
9. Git分支的使用
# 查看本地分支  
git branch  
# 查看遠程分支  
git branch -r  
# 創建本地分支(注意新分支創建后不會自動切換為當前分支)  
git branch [name]  
# 切換分支  
git checkout [name]  
# 創建新分支并立即切換到新分支  
git checkout -b [name]  
# 強制刪除一個分支  
git branch -D [name]  
# 合并分支(將名稱為[name]的分支與當前分支合并)
git merge [name]  
# 查看各個分支最后提交信息  
git br -v  
# 查看已經被合并到當前分支的分支  
git br --merged  
# 查看尚未被合并到當前分支的分支  
git br --no-merged
10. 介紹Git沖突處理經驗,以及merge和rebase中的ours和theirs的差別。
merge和rebase對于ours和theirs的定義是完全相反的。在merge時,ours指代的是當前分支,theirs代表需要被合并的分支。而在rebase過程中,ours指向了修改參考分支,theirs卻是當前分支。因為rebase 隱含了一個git checkout upstream的過程,將HEAD從local分支變成了upstream分支。git會在rebase結束后撤銷這個改變,但它已經不可避免地影響了沖突的狀態,使rebase中ours和theirs的定義與merge 截然相反。因此,在使用ours與theirs時請格外小心。
 
11. Git遠程操作相關
(1). clone
 
git clone <版本庫的網址>
 
git clone <版本庫的網址> <本地目錄名>
 
# 克隆jQuery的版本庫  
 git clone https://github.com/jquery/jquery.git  
 git clone -o jQuery https://github.com/jquery/jquery.git
(2). remote
 
# 列出所有遠程主機  
git remote  
# 使用-v選項,可以參看遠程主機的網址  
git remote -v  
# 可以查看該主機的詳細信息  
git remote show <主機名>  
# 添加遠程主機  
git remote add <主機名> <網址>  
# 刪除遠程主機  
git remote rm <主機名>  
# 修改遠程主機名稱  
git remote rename <原主機名> <新主機名>
(3). fetch
 
# 取回所有分支(branch)的更新到本地  
git fetch <遠程主機名>  
# 取回某的特定分支的更新  
git fetch <遠程主機名> <分支名>  
# 取回origin主機的master分支的更新  
git fetch origin master  
# 所取回的更新,在本地主機上要用”遠程主機名/分支名”的形式讀取。比如origin主機的master,就要用origin/master讀取。可以使用git merge命令或者git rebase命令,在本地分支上合并遠程分支  
git merge origin/master  
git rebase origin/master
(4). pull
 
git pull <遠程主機名> <遠程分支名>:<本地分支名>
 
# 取回origin主機的next分支,與本地的master分支合并  
git pull origin next:master  
# 如果遠程分支是與當前分支合并,則冒號后面的部分可以省略。  
git pull origin next  
# 上面的命令實質上等同于先做git fetch,再做git merge。  
git fetch origin  
git merge origin/next  
# 合并需要采用rebase模式  
git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>
(5). push
 
git push <遠程主機名> <本地分支名>:<遠程分支名>
 
注意:分支推送順序的寫法是”<來源地>:<目的地>”,所以git pull是”<遠程分支>:<本地分支>”,而git push是”<本地分支>:<遠程分支>”。
  
三種工作流程,有一個共同點:都采用”功能驅動式開發”(Feature-driven development,簡稱FDD)。它指的是,需求是開發的起點,先有需求再有功能分支(feature branch)或者補丁分支(hotfix branch)。完成開發后,該分支就合并到主分支,然后被刪除。最早誕生、并得到廣泛采用的一種工作流程,就是Git flow。
 
它最主要的特點有兩個。首先,項目存在兩個長期分支,分別是:主分支master、開發分支develop。其次,項目存在三種短期分支,分別是:功能分支(feature branch)、補丁分支(hotfix branch)、預發分支(release branch),一旦完成開發,它們就會被合并進develop或master,然后被刪除。
 
(1). Git Flow流程圖
 
 
 
(2). Git Flow常用的分支
 
 Production分支。也就是我們經常使用的Master分支,這個分支最近發布到生產環境的代碼,最近發布的Release, 這個分支只能從其他分支合并,不能在這個分支直接修改。
 Develop分支。這個分支是我們是我們的主開發分支,包含所有要發布到下一個Release的代碼,這個主要合并與其他分支,比如Feature分支。
 Feature分支。這個分支主要是用來開發一個新的功能,一旦開發完成,我們合并回Develop分支進入下一個Release。
 Release分支。當你需要一個發布一個新Release的時候,我們基于Develop分支創建一個Release分支,完成Release后,我們合并到Master和Develop分支。
 Hotfix分支。當我們在Production發現新的Bug時候,我們需要創建一個Hotfix, 完成Hotfix后,我們合并回Master和Develop分支,所以Hotfix的改動會進入下一個Release。
(3). Git Flow代碼示例
 
a. 創建develop分支
 
git branch develop  
git push -u origin develop
b. 開始新Feature開發
 
git checkout -b some-feature develop  
# Optionally, push branch to origin:  
git push -u origin some-feature  
# 做一些改動  
git status  
git add some-file  
git commit
c. 完成Feature
 
git pull origin develop  
git checkout develop  
git merge --no-ff some-feature  
git push origin develop  
git branch -d some-feature  
# If you pushed branch to origin:
git push origin --delete some-feature
d. 開始Relase
 
git checkout -b release-0.1.0 develop  
# Optional: Bump version number, commit  
# Prepare release, commit
e. 完成Release
 
git checkout -b hotfix-0.1.1 master
g. 完成Hotfix
 
git checkout master  
git merge --no-ff hotfix-0.1.1  
git push  
git checkout develop  
git merge --no-ff hotfix-0.1.1  
git push  
git branch -d hotfix-0.1.1  
git tag -a v0.1.1 master  
git push --tags  

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武功县| 科尔| 阿拉善盟| 无锡市| 陕西省| 南靖县| 拉孜县| 尚义县| 车险| 新田县| 冀州市| 崇左市| 海门市| 韶关市| 紫阳县| 张家川| 黎川县| 宾阳县| 工布江达县| 青铜峡市| 赣州市| 曲水县| 克山县| 兖州市| 北海市| 池州市| 乐都县| 诏安县| 莱州市| 喀喇沁旗| 普安县| 陆川县| 昌黎县| 涞源县| 会同县| 翁牛特旗| 黄大仙区| 平武县| 抚宁县| 嘉黎县| 高青县|