`git merge`和`git merge有什么区别?
使用gitk log
,我无法发现两者之间的差异。 我如何观察其差异(使用git命令或某种工具)?
如果它检测到你当前的HEAD
是你正在尝试合并的提交的祖先,那么--no-ff
标志将阻止git merge
执行“快进”。 快进是指,git不是构建合并提交,而是将分支指针移动到指向传入提交的位置。 这通常发生在没有任何本地更改的情况下执行git pull
时。
然而,有时候你想要防止这种行为发生,通常是因为你想维护一个特定的分支拓扑结构(例如,你正在合并一个主题分支,并且你希望在阅读历史时确保它看起来像这样)。 为了做到这一点,你可以传递--no-ff
标志,而git merge
将始终构造一个合并而不是快进。
同样,如果你想执行一个git pull
或者使用git merge
来显式快速转发,并且你希望如果它不能快速转发,那么你可以使用--ff-only
标志。 通过这种方式,你可以不经过思考就定期做一些类似git pull --ff-only
事情,然后如果出错,你可以回去决定是否要合并或重新绑定。
图形回答这个问题
这里有一个使用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 git@github.com: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用来维护“特性分支”和原始分支的历史记录。 多个父链接以绿色突出显示。
链接地址: http://www.djcxy.com/p/1201.html上一篇: What is the difference between `git merge` and `git merge
下一篇: Resolve Git merge conflicts in favor of their changes during a pull