2011-05-27 97 views
3

從Git的書:爲什麼不合並快速轉發?

「如果當前分支未從其他分歧 - 所以每一個承諾已經包含在其他存在於當前分支 - 那麼git就會執行一個‘快進’

我試圖重現這種情況下,但是這不會產生任何快進:

$ git init 
Initialized empty Git repository in /work/fun/git_experiments/.git/ 
$ echo initial > readme && git add readme && git commit -a -m Created 
[master (root-commit) 74495b9] Created 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 readme 
$ git branch b1 
$ echo modified > readme && git commit -a -m "Modified" 
[master d40d5fb] Modified 
1 files changed, 1 insertions(+), 1 deletions(-) 
$ git checkout b1 
Switched to branch 'b1' 
$ echo modified > readme && git commit -a -m "Modified" 
[ b1 46fd337] Modified 
1 files changed, 1 insertions(+), 1 deletions(-) 
$ git merge master 
Merge made by recursive. 
$ 

回答

4

因爲雖然兩次提交的內容是相同的,它們實際上不是同一個commit(NB :一個是提交ID d40d5fb,另一個是46fd337)。因此,分支b1包含不在master中的提交,因此並非b1中的所有提交都是master的後代。

+0

謝謝。我會添加我的答案,在那裏我合併回到主,並得到了一個快速的前進 - 這一次 - http://stackoverflow.com/questions/6155462/why-isnt-this-merge-fast-forwarded/6155521#6155521 – ripper234 2011-05-27 17:49:23

0

內容的提交是相同的,但提交本身不是。在這種特殊情況下,您將d40d5fb併入46fd337,因此需要將這兩個提交與單個頭進行適當的合併。兩個人獨立編寫完全相同的提交的唯一方法是,名稱,電子郵件和時間戳是否相同。

嘗試重新綁定代替,這將壓縮引入相同差異的提交。

0

我想我明白:

$ git checkout master 
Switched to branch 'master' 
$ git merge b1 
Updating d40d5fb..fd337c3 
Fast-forward 
$ 

當我重新合併的變化掌握,那麼就快進,因爲完全相同的承諾只是發生在B1 ......而我的例子是不是真的相同的提交。

+1

嘗試在每次提交或合併之後運行'git log --oneline --graph --decorate --all'來獲取你的分支所在的圖片。 – 2011-05-27 17:11:56

相關問題