only - git rebase no ff




`git merge`和`git merge--no-ff`有什麼區別? (3)

使用gitk log ,我無法發現兩者之間的差異。 我如何觀察其差異(使用git命令或某種工具)?


圖形回答這個問題

這裡有一個使用git merge --no-ff的清晰解釋和圖解說明的網站

直到我看到這個,我完全被git迷失了。 使用--no-ff可以讓查看歷史記錄的人清楚地看到您檢查出來的分支 。 (該鏈接指向github的“網絡”可視化工具)這裡還有另一個帶插圖的偉大參考 。 這個參考對第一個補充了很好的補充,更多地關注了那些不熟悉git的人。

像我這樣的新人的基本信息

如果你和我一樣,而不是一個Git-guru, 我的答案在這裡描述處理從git的跟踪中刪除文件,而不從本地文件系統中刪除它們,這似乎記錄很差,但經常發生。 另一個新的情況是獲取當前的代碼 ,但仍然避開我。

示例工作流程

我將一個軟件包更新到了​​我的網站,並且必須回到我的筆記才能看到我的工作流程; 我認為為這個答案增加一個例子很有用。

我的git命令工作流程:

git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am  "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master

下面:實際使用情況,包括解釋。
注意:下面的輸出被剪切; git非常冗長。

$ git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   ecc/Desktop.php
#       modified:   ecc/Mobile.php
#       deleted:    ecc/ecc-config.php
#       modified:   ecc/readme.txt
#       modified:   ecc/test.php
#       deleted:    passthru-adapter.igs
#       deleted:    shop/mickey/index.php
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       ecc/upgrade.php
#       ecc/webgility-config.php
#       ecc/webgility-config.php.bak
#       ecc/webgility-magento.php

注意上面的三件事:
1)在輸出中,您可以看到ECC軟件包升級的更改,包括添加新文件。
2)還要注意,有兩個文件(不在/ecc文件夾中),我獨立於此更改而被刪除。 與其將這些文件刪除與ecc混淆,我稍後將創建一個不同的cleanup分支以反映這些文件的刪除。
3)我沒有按照我的工作流程! 當我試圖讓ecc再次工作時,我忘記了git。

下面:而不是做全包式的git commit -am "updated ecc package"我通常git commit -am "updated ecc package" ,我只想把這些文件添加到/ecc文件夾中。 這些被刪除的文件並不是我的git add一部分,但是因為他們已經在git中被跟踪了,所以我需要從這個分支的提交中刪除它們:

$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M       passthru-adapter.igs
M       shop/mickey/index.php

$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"

$ git checkout master
D       passthru-adapter.igs
D       shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To [email protected]:me/mywebsite.git
   8a0d9ec..333eff5  master -> master


使上述自動化的腳本

在一天內使用這個過程10次以上,我已經開始編寫批處理腳本來執行這些命令,所以我做了一個幾乎合適的git_update.sh <branch> <"commit message">腳本來完成上述步驟。 這是劇本的主要來源

而不是git commit -am我從通過git status生成的“modified”列表中選擇文件,然後粘貼這些腳本中的文件。 這是因為我做了許多編輯,但想要各種各樣的分支名稱來幫助將變化分組。


--no-ff選項確保不會發生快速轉發合併,並且始終創建新的提交對象 。 如果你想讓git維護一個功能分支的歷史記錄,這可能是可取的。 在上圖中,左側是使用git merge --no-ff後的git歷史示例,右側是使用git merge進行ff合併的示例。

編輯 :此圖像的以前版本表示合併提交只有一個父代。 合併提交有多個父提交 ,git用來維護“特性分支”和原始分支的歷史記錄。 多個父鏈接以綠色突出顯示。


這是一個古老的問題,這在其他文章中有些微妙的提及,但是對於我來說這個點擊的解釋是非快進合併需要單獨提交





fast-forward