參考:
git 的使用(4)-git暫緩區(qū)工作區(qū)原理和修改刪除等命令
Git 菜鳥變大神 (三) 工作區(qū)、暫存區(qū)、版本庫之間的關(guān)系案例
需求:
使用需要
在初始化git版本庫之后會生成一個隱藏的文件 .git 慷吊,可以將該文件理解為git的版本庫 repository,而我們自己建立的項(xiàng)目文件夾即工作區(qū) working directory ,在.git 文件夾里面還有很多文件动遭,其中有一個index 文件 就是暫存區(qū)也可以叫做 stage ,git還為我們自動生成了一個分支master以及指向該分支的指針head.
從圖中可以看出來respository包括分支master和stage, working diretory 可以理解為我們打開開發(fā)環(huán)境如eclipse善茎,里面的內(nèi)容即工作區(qū)的內(nèi)容,在工作區(qū)里面有的代碼以及配置文件等我們需要提交到版本庫里面蚣常,最終是到了分支master上面市咽,暫存區(qū)只是一個臨時(shí)保存修改文件的地方。
一抵蚊、工作區(qū)施绎、暫存區(qū)和版本庫的關(guān)系及區(qū)別
1. 工作區(qū)
工作區(qū)(working Directory),就是我們項(xiàng)目的目錄贞绳,也就是我們例子中的learngit 目錄谷醉,這就是我們所說的工作區(qū),比較簡單冈闭。
2. 版本庫
版本庫(Repository) 俱尼,工作區(qū)有一個隱藏目錄“.git”,如上圖所示萎攒,這個目錄不算工作區(qū)遇八,而是Git的版本庫。我們打開這個.git文件夾耍休,里面有很多文件:
其中最重要的就是稱為stage(或者叫index)的暫存區(qū)刃永,還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD羊精。
3. 暫緩區(qū)
我們先來看一張圖斯够,用來區(qū)分工作區(qū)和暫緩區(qū)以及分支的概念:
- 上圖中,工作區(qū)就是我們的本地目錄,也就是learngit目錄雳刺,stage就是暫緩區(qū)劫灶,master分支就是主分支。
- 我們先把這三個關(guān)系說一下掖桦,然后我們再具體的例子來說明:
前面講了我們把文件往git版本庫里添加的時(shí)候本昏,是分兩步執(zhí)行的:
第一步是用“git add”把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū)枪汪;
第二步是用“git commit”提交更改涌穆,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
因?yàn)槲覀儎?chuàng)建git版本庫時(shí)雀久,git自動為我們創(chuàng)建了唯一一個master分支宿稀,所以,現(xiàn)在赖捌,commit就是往master分支上提交更改祝沸。
你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū)越庇,然后罩锐,一次性提交暫存區(qū)的所有修改。
4.舉個例子
見git 的使用(4)-git暫緩區(qū)工作區(qū)原理和修改刪除等命令
5. git跟蹤的是修改
上面很詳細(xì)的說了暫存區(qū)的一些基本的東西卤唉,下面我們通過管理修改的例子涩惑,說學(xué)習(xí)一下為毛git這么快,比其他的版本工具來優(yōu)秀桑驱,因?yàn)間it跟蹤并管理的是修改竭恬,并不是文件。
git 中如何定義修改呢:你新增了一行熬的,這就是一個修改痊硕,刪除了一行,也是一個修改押框,更改了某些字符岔绸,也是一個修改,刪了一些又加了一些强戴,也是一個修改,甚至創(chuàng)建一個新文件挡鞍,也算一個修改骑歹。
SVN中是跟蹤的是這個文件,只要這個文件發(fā)生變化墨微,我們就認(rèn)為是有diff的道媚。但是GIT跟蹤的是修改,一個修改只要沒被add到緩存區(qū),都不算diff最域。
二谴分、撤銷修改
1. 還在工作區(qū)
2. 已經(jīng)add加到暫存區(qū)
三、刪除文件
四镀脂、其它
-
撤銷merge
$ git reset --hard HEAD
-
沒有共同祖先的兩個分支如何合并牺蹄?合并后會有什么問題?
"git merge" used to allow merging two branches that have no common base by default, which led to a brand new history of an existing project created and then get pulled by an unsuspecting maintainer, which allowed an unnecessary parallel history merged into the existing project. The command has been taught not to allow this by default, with an escape hatch "--allow-unrelated-histories" option to be used in a rare event that merges histories of two projects that started their lives independently.
使用 git merge 合并兩個沒有共同祖先的分支薄翅,這導(dǎo)致了一個創(chuàng)建的現(xiàn)有項(xiàng)目的全新歷史沙兰,然后被一個不知情的維護(hù)者拉出,這使得不必要的并行歷史合并到現(xiàn)有項(xiàng)目中翘魄。 --allow-unrelated-histories 參數(shù)用于將兩個獨(dú)立的分支(即 沒有共同祖先)合并
如果非得將兩個沒有共同祖先的分支合并鼎天,這樣的后果是項(xiàng)目的全部文件都當(dāng)作這次提交的內(nèi)容,而實(shí)際上這次提交的內(nèi)容應(yīng)該就是幾個不同的文件而已暑竟,也就是所有文件都會被認(rèn)為有沖突斋射。
-
merge遠(yuǎn)程分支。
A merge B是把A中的改動放到B分支上但荤,B merge A是把B中的改動merge到A中罗岖,例如把master分支上的改動移到分支fb_xhf上,可以這樣merge纱兑。
1呀闻、轉(zhuǎn)到master分支上,然后更新master最新更新潜慎。
2捡多、再轉(zhuǎn)到fb_xhf上,然后在Local Branches中選擇master分支铐炫,選擇merge垒手,這樣就把本地的master merge到 本地倉庫的fb_xhf上,然后再選擇git push 倒信,這樣就把遠(yuǎn)程master merge到 fb_xhf上, 并會提示: Merged master to fb_xhf科贬。