我的意思是,我的问题与Ignore *all* whitespace changes with git-diff between commits完全相反
(Ubuntu,git 2.17.1)
$ git checkout development
$ git diff development master
...
-// some text
+ // some text
...
好的,没有关键的差异列表,自动合并应该成功运行。但是wtf是这样的:
$ git merge master
up to date.
我要合并到完全一样!我在Windows上进行的早期项目,git发现并合并了所有这些琐碎的差异。即使“ git diff”发现了差异,为什么Git没有合并这种差异的原因是什么?
这是我的
$ git config --list
diff.tool=meld
difftool.prompt=false
difftool.meld.cmd=meld $LOCAL $REMOTE
merge.tool=meld
mergetool.meld.cmd=meld $LOCAL $MERGED $REMOTE --output $MERGED
credential.https://....git.beanstalkapp.com.username=gitusername
color.ui=auto
user.email=gitusername@server.de
user.name=gitusername
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=https://....git.beanstalkapp.com/liebesschloss.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.development.remote=origin
branch.development.merge=refs/heads/development
任何人都可以支持我配置和/或使用git来处理所有空白吗?
也许我看不到所有的阿甘树?
答案 0 :(得分:0)
我要合并为完全相同!
这不是git merge
所做的。
退后一会,并考虑git merge
的目标是结合工作。假设您和其他一些人(我们称他为Fred)从所有相同的文件开始。其中之一是一些使用//
注释的文件。
Fred在第55行更改了一些代码。同时,您注意到注释中的拼写错误:
// some tuxt
应为:
// some text
,也许应该以不同的方式缩进。因此,您修复第12行。
现在,在将来的某个时候,您将获得Fred的提交。您运行:
git diff <mine> <fred>
或:
git diff <fred> <mine>
其中之一是您所做的注释修复 。 如果git merge <fred>
仅使文件与Fred的文件相同 ,那将撤消您的拼写修复程序。因此,git merge
不使用两次分支提示提交的git diff
的结果。
git merge
使用什么?Git的合并操作取决于找到合并基础。本质上,合并基础是您和Fred都开始的共同提交。 查找合并基础是检查提交图的问题。
提交图的出现是因为每个提交都有一个 parent 提交。 1 您当前提交的父级就是您之前的那个父级,或做出您当前提交的任何人。该提交的父级是该提交的父级,依此类推。 Git通过遵循这些向后指向的父链来工作。有关(更多)信息,请参见我对类似合并问题的许多其他答案。
但是,您特别跑了:
git merge master
并得到:
Already up to date.
当您的分支位于主服务器之前 时,会出现此特殊消息。也就是说,假设提交图如下所示:
... <-F <-G <-H <-- master
\
I <-J <-- development (HEAD)
您的当前提交是提交J
(J
代表丑陋的哈希ID),其父为提交I
,其父为提交H
。因此,如果在我们的小“组合工作”设置中,master
代表弗雷德的最新作品,而development
代表您的作品,那么命令:将弗雷德与我的作品组合起来就很容易了:你们俩都是从Fred的最新文章开始的,提交H
。从那时起,您进行了一些更改。 Git完全保留了您的开始。
1 有些提交有两个父母。这些提交有些特殊,因为它们是 merge 提交。存储库中至少有一个提交具有 no 个父级,因为这是第一次提交,并且不能有父级。
查看提交图的方法有很多,包括使用各种GUI或Git附带的基于tcl / tk的查看器gitk
。在某些方面,这些方法比直接内置于Git的文本图形查看器更好,但是该查看器始终存在,并且不像这些图形查看器那样依赖于外部软件。
运行git log --graph
,Git将生成一个图形。由于git log
的输出很长,因此您在页面上看不到太多东西,因此您可能希望指示git log
每次提交使用一行:
git log --oneline --graph
这将向您显示从当前提交开始并向后工作的图形。为了确保Git告诉您第一次提交是当前的提交,您可能需要添加--decorate
选项,或在配置中打开log.decorate
:>
git log --decorate --oneline --graph
(或git config log.decorate auto
,在命令行上使用--decorate
时会自动暗示git log
)。并且,要告诉Git从 all 分支和 all 标记开始向后工作,您可能需要添加--all
: 2 < / p>
git log --all --decorate --oneline --graph
或者在这种情况下,您可以使用:
git log --decorate --oneline --graph master develop
告诉Git:从master
和develop
开始,向我展示提交以及它们的父级关系。这样您就可以查看图形并通知您(至少在某种程度上)有关Git在master
和develop
之间的合并基础。
2 “所有装饰单线图”是一个非常有用的组合,可以通过get help from A DOG中的助记符Pretty git branch graphs来记住。