分支和合并
有DEVELOP
分支。 新分支FEATURE
已创建。 有很多开发者提交。
我将FEATURE
分支合并到DEVELOP
分支中,使用:
git checkout develop
git merge --no-ff --no-commit feature
git add .
git commit -m 'message'
git push
git log
我可以看到FEATURE
分支的所有提交。
我做错了什么?
在合并之前,你并没有压缩你的提交,所以你仍然会看到所有的提交。 而且你用--no-ff
合并,我认为它会使它总是为合并创建一个新的提交,而手册页似乎支持这一点。
你似乎对--no-ff
和--ff
标志的--ff
有误解。 阅读上述手册页可能会有所帮助,但我承认这一点。
假设在主分支上没有进行任何更改,您从当初分支开始创建新的提交后将当前分支从当前分支中提取出来,那么当您将更改合并回主分支时,则不需要执行合并在所有。 你可以假装你一直在主分支上进行更改(因为没有任何改变,需要合并)。
这是--ff
开关给你的,并且是默认选项。 它不会删除任何提交,它只是在主分支上“重播”它们。
--no-ff
开关强制git创建一个新的提交,尽管这在技术上并不需要。
--ff-only
开关强制git放弃合并,如果它不能只重放提交(即,如果自从您拿走当前分支后在主分支上进行了任何其他提交)。 再次,这不会删除任何提交,它只是强制历史是线性的,因为不能合并。
如果你想让你的功能分支提交看起来像更少的提交,你可以改变你的更改(虽然有其他选项,我相信在你的提交中使用--squash
选项可能会起作用,但我没有使用它,所以检查它在你的生产代码上做这件事之前,确保你了解它)。
我做了什么,并且git有很多不同的可能性,在我进行合并之前,将我的特性分支重新分配到主分支上。
git checkout feature
git rebase master -i
这一行将启动一个窗口,允许您选择要保留的提交内容以及要“挤压”在一起的内容。 我在这里选择我想合并在一起的提交(为了摆脱多余的'忘记这个文件'或'试过这个并且它不工作'提交,将提交分组到逻辑结构中,这些逻辑结构定义了大量的工作。是每个功能的单独提交,但并非总是如此,您也可以选择重命名任何提交组。
git checkout develop
git merge feature --ff-only
我将特征分支合并到--ff-only
的主文件中,以便历史保持线性。 如果失败,则您再次checkout feature
并重复此过程。
正如我所说的,在git中有很多方法可以让猫变成皮肤,这对我来说很有用,你的里程可能会有所不同。
Git默认显示分支的整个历史记录
原始的海报说
我可以看到FEATURE分支的所有提交。
我做错了什么?
这是Git中的预期行为。 当你将一个分支B合并到另一个分支A时,B的历史成为A的历史的一部分,所以当然B的提交也会出现在A的历史中。
默认情况下,Git显示分支的全部历史记录,包括已经合并到其中的提交。
无论您是否进行快速合并,情况都是如此 。 快速合并和使用--no-ff
完成的合并之间的区别在于--no-ff
将强制创建合并提交 ,即使简单的快进(没有合并提交)也会已成为可能。
但是,无论哪种方式, 您仍然通常会看到已合并到当前分支中的所有分支的提交 。
隐藏合并提交的历史
如果您不想查看合并提交的历史记录,可以通过传入--first-parent
选项将它们从日志输出中隐藏起来
$ git log --oneline --graph --first-parent
* e156455 Git 2.0 (HEAD, tag: v2.0.0, https/master)
* 4a28f16 Update draft release notes to 2.0
* 8ced8e4 Git 2.0-rc4 (tag: v2.0.0-rc4)
* 3054c66 RelNotes/2.0.0.txt: Fix several grammar issu
* b2c851a Revert "Merge branch 'jc/graduate-remote-hg-
* 00a5b79 Merge branch 'jc/graduate-remote-hg-bzr' (ea
* df43b41 Merge branch 'rh/prompt-pcmode-avoid-eval-on
* 7dde48e Merge branch 'lt/request-pull'
* 5714722 Merge branch 'jl/use-vsatisfy-correctly-for-
* c29bf4a Merge git://github.com/git-l10n/git-po
* 3fc2aea Merge branch 'kb/fast-hashmap'
* 6308767 Merge branch 'fc/prompt-zsh-read-from-file'
将其与查看分支的整个历史记录的输出进行比较
$ git log --oneline --graph
* e156455 Git 2.0 (HEAD, tag: v2.0.0, https/master)
* 4a28f16 Update draft release notes to 2.0
* 8ced8e4 Git 2.0-rc4 (tag: v2.0.0-rc4)
* 3054c66 RelNotes/2.0.0.txt: Fix several grammar issues, notably a lack
* b2c851a Revert "Merge branch 'jc/graduate-remote-hg-bzr' (early part)"
* 00a5b79 Merge branch 'jc/graduate-remote-hg-bzr' (early part)
|
| * 896ba14 remote-helpers: point at their upstream repositories
| * 0311086 contrib: remote-helpers: add move warnings (v2.0)
| * 10e1fee Revert "Merge branch 'fc/transport-helper-sync-error-fix'"
* | df43b41 Merge branch 'rh/prompt-pcmode-avoid-eval-on-refname'
|
| * | 1e4119c git-prompt.sh: don't assume the shell expands the value of
* | | 7dde48e Merge branch 'lt/request-pull'
|
| * | | d952cbb request-pull: resurrect for-linus -> tags/for-linus DWIM
* | | | 5714722 Merge branch 'jl/use-vsatisfy-correctly-for-2.0'
|
| * | | | b3f0c5c git-gui: tolerate major version changes when comparing
* | | | | c29bf4a Merge git://github.com/git-l10n/git-po
|
| * | | | | a6e8883 fr: a lot of good fixups
* | | | | | 3fc2aea Merge branch 'kb/fast-hashmap'
|
| |/ / / / /
|/| | | | |
| * | | | | c2538fd Documentation/technical/api-hashmap: remove source hi
* | | | | | 6308767 Merge branch 'fc/prompt-zsh-read-from-file'
通过避免合并提交来保持简单的历史记录
当Git用户谈论维护“清洁历史”时,他们通常指的是避免创建合并提交。 频繁更新主分支中的新更改的功能分支时,通常会出现这种情况。 在这些情况下,人们希望避免合并提交,因为当您查看特性分支的日志时,它们不会添加更多的附加信息值,并最终导致“混乱”,“垃圾”和“噪音”很难看到已经做出的更重要的改变。
为了避免这种情况,Git用户通常会在master之类的上游分支之上重新绑定功能分支,这会更新功能分支(就像合并一样),但不会创建合并提交。 通过这种方式,Git用户将“保持清晰的历史”,避免创建不必要的合并提交,从而保持更简单,更容易理解的提交历史记录。
也可以看看
有关快速合并与非快速合并的更多信息,请参阅
为什么git默认快速合并?
Git快进VS没有快进合并