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