使用gitk log
,我无法发现两者之间的差异。如何观察差异(使用git命令或某些工具)?
答案 0 :(得分:890)
如果--no-ff
检测到您当前的git merge
是您尝试合并的提交的祖先,则HEAD
标志会阻止git pull
执行“快进”。快进是指git只是将您的分支指针移动到指向传入提交的位置,而不是构建合并提交。这种情况通常在执行--no-ff
而没有任何本地更改时发生。
但是,有时您希望阻止此行为发生,通常是因为您希望维护特定的分支拓扑(例如,您正在合并主题分支,并且您希望确保在阅读历史记录时看起来如此)。为此,您可以传递git merge
标记,git pull
将始终构建合并而不是快进。
同样,如果您想执行git merge
或使用--ff-only
以明确快进,并且您想要在无法快进的情况下挽救,那么您可以使用git pull --ff-only
标志。通过这种方式,您可以不经思考地定期执行{{1}}之类的操作,然后如果错误输出,您可以返回并决定是否要合并或变基。
答案 1 :(得分:859)
Here is a site使用 git merge --no-ff 的清晰解释和图解说明:
在我看到这个之前,我完全迷失了git。使用 - no-ff 可以让某些人清楚地查看历史记录see the branch you checked out。 (该链接指向github的“网络”可视化工具)这里有another great reference插图。这个参考文章很好地补充了第一个,更多地关注那些不熟悉git的人。
如果你像我一样,而不是Git-guru,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
文件夹中)。我不会将这些文件删除与ecc
混淆,而是稍后会创建一个不同的cleanup
分支来反映这些文件的删除。
3)我没有按照我的工作流程!当我试图让ecc再次工作时,我忘记了git。
下面:我通常只想在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">
脚本来执行上述步骤。该脚本Here is the Gist source。
而不是git commit -am
我选择通过git status
生成的“已修改”列表中的文件,然后粘贴此脚本中的文件。这是因为我进行了数十次编辑,但希望使用不同的分支名称来帮助对变更进行分组。
答案 2 :(得分:184)
--no-ff
选项确保不会发生快进合并,并且将始终创建新的提交对象。如果您希望git维护功能分支的历史记录,这可能是理想的。
在上图中,左侧是使用git merge --no-ff
后的git历史记录的示例,右侧是使用git merge
的示例,其中ff合并是可能的。
编辑:此图片的先前版本仅显示合并提交的单个父级。 合并提交有多个父提交,git用它来维护“功能分支”和原始分支的历史记录。多个父链接以绿色突出显示。
答案 3 :(得分:90)
显式合并:创建一个新的合并提交。(如果您使用 int attempt =3;
while(attempt!= 0){
try {
Reconnect();
text1.append("Successfully connected \n");
textField1.setText("Connected");
textField1.setBackground(Color.GREEN);
return;
} catch (IOException e1) {
attempt--;
text1.append("you have left "+attempt+" attempt \n Try again\n");
}
if(attempt == 0) {
text1.append("attempt completed \n");
System.exit(0);
}}
}
private void Reconnect() throws UnknownHostException, IOException {
String hostName = "127.0.0.1";
int portNumber = Integer.parseInt("5058");
Socket socket = new Socket(hostName,portNumber);
}
,则会得到此结果。)
快速转发合并:,无需创建新的提交即可快速转发:
重新设置:建立新的基本级别:
挤压:用力挤压或挤压(某物)使其变平:
答案 4 :(得分:34)
这是一个老问题,这在其他帖子中有点巧妙地提到,但是对我来说这个点击的解释是非快进合并将需要单独提交。
答案 5 :(得分:4)
-no-ff标志使合并始终创建一个新的提交对象,即使合并可以通过快进来执行。这样可以避免丢失有关功能分支历史存在的信息,并将所有添加了功能的提交分组在一起
答案 6 :(得分:0)
其他答案非常清楚地表明--no-ff
会导致合并提交。这样可以保留有关要素分支的历史信息,这很有用,因为定期清除和删除要素分支。
此答案可以提供何时使用或不使用--no-ff
的上下文。
--no-ff
工作示例:
$ git checkout -b NewFeature
[work...work...work]
$ git commit -am "New feature complete!"
$ git checkout master
$ git merge --no-ff NewFeature
$ git push origin master
$ git branch -d NewFeature
--no-ff
工作示例:
$ git checkout -b NewFeature
[work...work...work]
[New changes made for HotFix in the master branch! Lets get them...]
$ git commit -am "New feature in progress"
$ git pull origin master
[shotcut for "git fetch origin master", "git merge origin master"]