正如标题所说,我并不清楚a git merge --squash和a 之间的区别git merge --no-commit.
据我所知的帮助页面git merge,这两个命令都会让我进入一个更新的工作树,在那里它仍然可以编辑然后进行最后的提交(或多次提交).
有人可以澄清这两个选项的差异吗?我什么时候使用一个而不是另一个?
在过去的几天里,我一直在考虑与Git进行变革.反驳的大多数论据都说它清理历史并使其更加线性.如果您进行简单合并(例如),您将获得一个历史记录,显示历史记录何时分歧以及何时将其重新组合在一起.据我所知,rebasing删除了所有历史记录.问题是:为什么你不希望回购历史反映代码开发的所有方式,包括它在哪里以及如何分歧?
我见过的大多数git工作流建议branch在合并到master之后删除它.例如,这个gitflow建议如下:
# Incorporating a finished feature on develop
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
Run Code Online (Sandbox Code Playgroud)
我为什么要删除分支?我也好奇当以后发现一个由该功能引入的错误时该怎么做 - 我是否应该再创建一个具有相同名称的分支,修复那里的bug,合并到master并再次删除分支?
我们有项目(PHP应用程序),但每个客户端的安装程序各不相同,有时很少,有时甚至更多.不过,源代码的很大一部分很常见.我们将特定安装作为并行分支管理到主分支,我们需要将更改从主分支传输到其他分支.在Git中解决了相同的情况:如何维护(大部分)并行分支只有一些区别?投票最多的解决方案是以这种方式在分支之间转移变更:
git pull
git checkout local
git rebase master
Run Code Online (Sandbox Code Playgroud)
如解决方案中所提到的,它在变基后创建非快进推送,我发现非常令人不快的并发症.我的问题是 - 为什么不这样做:
git pull
git checkout local
git merge master
Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目(单独),对于我开发的每个功能,我创建了一个新的分支,处理这个功能,然后将它合并到master.所以通常我一次不会在两个不同的分支上工作,而在分支机构工作时从不接触主人.
当我合并一个分支时,我看到(使用gitx和gitk)master分支的历史记录获得了我对合并分支所做的所有提交.我的意思是,如果我有类似的东西:
master a-b-c-d
\z-x-y--
|branch name
Run Code Online (Sandbox Code Playgroud)
合并后我得到:
a-b-c-d-z-x-y
|branch name
Run Code Online (Sandbox Code Playgroud)
是的,我看到合并的分支名称突出显示(使用gitx和gitk),但我期待的是显示提交完成的位置(到哪个分支),如:
master a-b-c-d--------M--
\-z-x-y-/
|branch name
Run Code Online (Sandbox Code Playgroud)
所以我期待看到提交"M"代表我已经完成的合并,而不是看起来我已经完成了对新分支所做的所有提交.
我的期望是否正确?或者这是正常git行为?
两种方法似乎都有相同的目的,以保持清晰的历史:
没有快进(--no-ff)
那么,如果我在功能分支上进行了--no-ff重新定位,那么在合并回主分支时是否还需要?
更新:
在我看来,在这个链接中基本上是图表(图3.28)之间存在混淆,快速前进和非快速合并之间的混乱http://git-scm.com/book/en/Git-Branching-Rebasing 显示正常合并结果与此链接的顶部答案中的merge --no-ff相同为什么默认情况下git快进合并?
经过多次试验,我得到了这个简单的测试案例场景:
a --> b --> c -- (master)
\ \
--> d --> b' --> e (branch)
Run Code Online (Sandbox Code Playgroud)
哪里:
b' 是一个樱桃挑选 be是一个合并来自master.b'之后完成c并c修改了相同的文件b(d可能无关紧要).
e 很容易看起来非常意外.
假设所有'他们正在处理相同的文件" foobar.txt".这是文件在每次提交中的外观:
// ----------- a
foo
delme
bar
// ----------- b
foo
delme
new
bar
// ----------- c
foo
new
bar
// ----------- b'
foo
delme
new
bar
// ------------ e
foo
new
new
bar
Run Code Online (Sandbox Code Playgroud)
现在,这是我刚才的简短测试,具有这种确切的设置.
如果你删除那里的所有空格 …
我的工作流程中有许多短命分支,我希望它们能够分开.所以,我打算用git config --add merge.ff false.但是,当我正在进行拉(我理解为fetch + merge)时 - 然后我想要一个快进行为,以避免不必要的额外提交.
这是一件好事吗?这可能吗?
我通过一次提交许多文件来保存我的工作.我想知道为每个文件提交是否会更好,但这看起来好多了.
我对现在的方式没有任何问题,但我打算将我的代码放在GitHub上,我希望它易于理解.
我想知道你们其他人使用git是做什么的.如果你能为我拼出来的话.我是Git的新手,我一直在Windows中使用TortoiseGit和gitk.
请注意:我不是要重新启动Mercurial或Git更好的论点,我只是有一个技术问题,我作为Mercurial用户,不明白.我也不确定SO是否是提出这样一个问题的正确位置,但它与编程相关.
关于两个版本控制系统Git和Mercurial如何从用户的角度来看彼此不同(例如Mercurial和Git之间有什么区别?和http://felipec.wordpress.com/2011/01)/16/mercurial-vs-git-its-all-in-the-branches /),主要区别在于分支机构的处理.我已经阅读了很多这些讨论,但我一直在问自己这个问题:
为什么Git不将分支名称存储为提交的一部分?
我真的没有理由不这样做; 这意味着数据不能简单地消失,因为没有参考(标记,分支,等等).
我认为在提交中存储分支是Mercurial的一大优点,因为这会使丢失数据变得更加困难.
Git人群的主要观点是支持Git的分支模型,你可以简单地删除分支,并不会阻止Git在每次提交时存储分支的名称:如果删除了分支的提交,那么对该分支的引用.它也不会干扰"廉价分支"的论点:分支管理起来不会更昂贵.我不认为所需的额外存储应该是值得关注的:每次提交只需几个字节.
git ×10
merge ×4
branch ×3
git-merge ×2
git-rebase ×2
git-branch ×1
git-commit ×1
git-flow ×1
mercurial ×1
rebase ×1
squash ×1