使用gitk log时,我看不出这两者之间的区别。如何观察差异(使用git命令或其他工具)?
发布于 2012-01-31 02:51:30
如果--no-ff标志检测到您当前的HEAD是您试图合并的提交的祖先,它将阻止git merge执行“快进”。快进是指git只是移动分支指针指向传入的提交,而不是构造合并提交。在不做任何本地更改的情况下执行git pull时,通常会出现这种情况。
然而,有时你想阻止这种行为的发生,通常是因为你想维护一个特定的分支拓扑(例如,你正在合并一个主题分支,并且你想要确保它在读取历史时看起来是这样的)。为此,您可以传递--no-ff标志,git merge将始终构造合并而不是快进。
类似地,如果您想要执行一个git pull或使用git merge来显式快进,并且想要在不能快进的情况下摆脱困境,那么您可以使用--ff-only标志。这样,你就可以不假思索地定期做一些像git pull --ff-only这样的事情,然后如果它出错了,你可以回去决定是合并还是重新建立基础。
发布于 2013-02-14 08:08:22
此问题的图解答案
包含使用git merge --no-ff的清晰解释和图形说明的Here is a site

在我看到这个之前,我完全被git迷住了。使用--no-ff可以让查看历史的人清楚地使用see the branch you checked out进行操作。(该链接指向github的“网络”可视化工具),这里是带有插图的another great reference。这个参考很好地补充了第一个参考,更多地关注那些不太熟悉git的人。
对像我这样的新手的基本信息
如果你像我一样,而不是git大师,my answer here描述了在不从本地文件系统中删除文件的情况下处理git跟踪中的文件删除,这种情况看起来很少,但却经常发生。另一个新的情况是getting current code,它仍然设法避开我。
工作流示例
我更新了一个包到我的网站,必须返回到我的笔记来查看我的工作流程;我认为在这个答案中添加一个示例是很有用的。
我的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注意上面的3件事:
1)在输出中,您可以看到ECC包升级的更改,包括添加新文件。
2)还要注意,我删除了两个独立于此更改的文件(不在/ecc文件夹中)。稍后,我将创建一个不同的cleanup分支来反映这些文件的删除,而不是将这些文件删除与ecc混淆。
3)我没有遵循我的工作流程!当我试图让ecc再次工作时,我忘记了git。
下图:我只想添加/ecc文件夹中的文件,而不是像往常一样执行包罗万象的git commit -am "updated ecc package"。那些被删除的文件并不是我的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">脚本来执行上述步骤。该脚本的Here is the Gist source。
我从通过git status生成的“已修改”列表中选择文件,然后将这些文件粘贴到此脚本中,而不是git commit -am。这是因为我做了几十次编辑,但想要不同的分支名称来帮助对更改进行分组。
发布于 2018-09-04 10:21:15
显式合并(也称为非快进):创建一个新的合并提交。(这是您使用--no-ff时会得到的结果。)

快速前进合并:快速前进,无需创建新的提交:

Rebase:建立一个新的基本级别:

挤压:用力压碎或挤压(某物)使其变平::

https://stackoverflow.com/questions/9069061
复制相似问题