如果給了文件名(或者 -p選項(xiàng)), 那么工作效果和帶文件名的 checkout 差不多,除了索引被更新。
Merge
merge 命令把不同分支合并起來(lái)。合并前,索引必須和當(dāng)前提交相同。如果另一個(gè)分支是當(dāng)前提交的祖父節(jié)點(diǎn),那么合并命令將什么也不做。 另一中情況是如果當(dāng)前提交是另一個(gè)分支的祖父節(jié)點(diǎn),導(dǎo)致 fast-forward 合并。指向只是簡(jiǎn)單的移動(dòng),并生成一個(gè)新的提交。
否則是一次真正的合并。默認(rèn)把當(dāng)前提交(ed489 如下所示)和另一個(gè)提交(33104)以及他們的共同祖父節(jié)點(diǎn)(b325c)進(jìn)行一次三方合并。結(jié)果是先保存當(dāng)前目錄和索引,然后和父節(jié)點(diǎn)33104一起做一次新提交。
Cherry Pick
cherry-pick 命令”復(fù)制”一個(gè)提交節(jié)點(diǎn)并在當(dāng)前復(fù)制做一次完全一樣的新提交。
Rebase
衍合是合并命令的另一種選擇。合并把兩個(gè)父分支合并進(jìn)行一次提交,提交歷史不是線性的。衍合在當(dāng)前分支上重演另一個(gè)分支的歷史,提交歷史是線性的。 本質(zhì)上,這是線性化的自動(dòng)的 cherry-pick
上面的命令都在topic分支中進(jìn)行,而不是master分支,在master分支上重演,并且把分支指向新的節(jié)點(diǎn)。注意舊提交沒(méi)有被引用,將被回收。
要限制回滾范圍,使用--onto選項(xiàng)。下面的命令在master分支上重演當(dāng)前分支從169a6以來(lái)的近幾個(gè)提交,即2c33a。
同樣有g(shù)it rebase --interactive讓你更方便的完成一些復(fù)雜操組,比如丟棄、重排、修改、合并提交。沒(méi)有圖片體現(xiàn)著下,細(xì)節(jié)看這里:git-rebase (1)
技術(shù)說(shuō)明
文件內(nèi)容并沒(méi)有真正存儲(chǔ)在索引(.git/index)或者提交對(duì)象中,而是以 blob 的形式分別存儲(chǔ)在數(shù)據(jù)庫(kù)中(.git/objects),并用 SHA-1值來(lái)校驗(yàn)。 索引文件用識(shí)別碼列出相關(guān)的 blob 文件以及別的數(shù)據(jù)。對(duì)于提交來(lái)說(shuō),以樹(shù)(tree)的形式存儲(chǔ),同樣用對(duì)于的哈希值識(shí)別。樹(shù)對(duì)應(yīng)著工作目錄中的文件夾,樹(shù)中包含的樹(shù)或者 blob 對(duì)象對(duì)應(yīng)著相應(yīng)的子目錄和文件。每次提交都存儲(chǔ)下它的上一級(jí)樹(shù)的識(shí)別碼。
如果用 detached HEAD 提交,那么后一次提交會(huì)被 the reflog for HEAD 引用。但是過(guò)一段時(shí)間失效,終被回收,與git commit --amend或者git rebase很像。