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