为什么我没有修改却有冲突?

Why are there conflicts when I have no changes?

我正在尝试了解 Git,我对它还很陌生。我在 Github 上有一个分支,是我从其他人的存储库中派生出来的,我正在尝试为他的存储库做贡献。

我做了我的更改,我很高兴所以我想做一个拉取请求。但是我不能执行拉取请求,因为 Github for Windows 说它不能在没有冲突的情况下合并。所以我这样做:

git fetch upstream 
git merge upstream/master

然后我从另一个人所做的一些事情中得到了一些冲突,我使用 Beyond Compare 解决了这些冲突。

然后我通过在 Github 中为 Windows 单击创建拉取请求来创建拉取请求。然后他查看了我的更改,但他对这些更改从来都不满意,因此他只做了很少的修改,然后提交给了他的分支。他的叉子上的变化只显示了 1 次提交,我的头像和他的头像在角落里。

所以我想我应该得到他的新版本所以我做了:

git fetch upstream 
git merge upstream/master

再次。

这样做又给我带来了一大堆我必须解决的冲突。我不明白为什么会发生冲突,自上次合并以来我什么也没做。我不应该得到他的叉子的精确副本吗?

而且我的 pull requests 似乎列出了自从我开始为项目做贡献以来我所做的所有提交,它不应该只显示自上次 pull request 以来的提交吗?

编辑:

根据 bg17aw 的要求,这是我的 git 配置 --list 设置

alias.c=commit
alias.co=checkout
alias.dt=difftool
alias.mt=mergetool
alias.praise=blame
alias.ff=merge --ff-only
alias.st=status
alias.sync=!git pull && git push
apply.whitespace=nowarn
core.symlinks=false
core.autocrlf=true
core.editor=gitpad
core.preloadindex=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
color.ui=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=/bin/curl-ca-bundle-ghfw.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
credential.helper=!github --credentials
filter.ghcleansmudge.clean=cat
filter.ghcleansmudge.smudge=cat
push.default=upstream
diff.tool=vs2013
diff.algorithm=histogram
difftool.prompt=false
difftool.bc4.cmd="c:/program files (x86)/beyond compare 3/bcomp.exe" "$LOCAL" "$REMOTE"
difftool.p4.cmd="c:/program files/Perforce/p4merge.exe" "$LOCAL" "$REMOTE"
difftool.vs2012.cmd="c:/program files (x86)/microsoft visual studio 11.0/common7/ide/devenv.exe" '//diff' "$LOCAL" "$REM
OTE"
difftool.vs2013.cmd="c:/program files (x86)/microsoft visual studio 12.0/common7/ide/devenv.exe" '//diff' "$LOCAL" "$REM
OTE"
merge.tool=bc3
mergetool.prompt=false
mergetool.keepbackup=false
mergetool.bc3.cmd="c:/program files (x86)/beyond compare 3/bcomp.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
mergetool.bc3.trustexitcode=true
mergetool.p4.cmd="c:/program files/Perforce/p4merge.exe" "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
mergetool.p4.trustexitcode=false
user.name=dallasm15
filter.hawser.clean=git hawser clean %f
filter.hawser.smudge=git hawser smudge %f
filter.hawser.required=true
diff.tool=bc4
difftool.bc3.path=c:/Program Files (x86)/Beyond Compare 4/bcomp.exe
difftool.bc4.path=c:/Program Files (x86)/Beyond Compare 4/bcomp.exe
push.default=simple
filter.lfs.clean=git lfs clean %f
filter.lfs.smudge=git lfs smudge %f
filter.lfs.required=true
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
remote.origin.url=https://github.com/dallasm15/Khazad.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.ImpalerWrG.url=https://github.com/ImpalerWrG/Khazad.git
remote.ImpalerWrG.fetch=+refs/heads/*:refs/remotes/ImpalerWrG/*
remote.upstream.url=https://github.com/ImpalerWrG/Khazad
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*
branch.digging_creates_rocks.remote=origin
branch.digging_creates_rocks.merge=refs/heads/digging_creates_rocks

差异主要显示他用制表符替换了我的空格。

尝试做: git 拉 --rebase

它存储您的更改,首先拉取上游的更改,然后存储 pop 并在其上应用您的更改。

I don't understand why I'm getting conflicts, I haven't done anything since my last merge

由于您没有任何更改,因此没有什么可隐藏的。我会在这种情况下使用:

git fetch origin
git reset --hard origin/master

(您的遥控器可能命名不同)。

I don't understand why I'm getting conflicts, I haven't done anything since my last merge. Shouldn't I just be getting an exact copy of his fork?

如果您每次都遇到问题,则可能是 git 设置有问题。您可以使用以下命令查看您的设置:

git config –list

现在,如果可能,您还应该检查回购所有者的设置。 查找 core.autocrlf=true 以检查行结尾是否不是问题(如果他使用的是 Mac/Linux 而你使用的是 Windows 机器,则有可能发生这种情况)。

同时查找 core.filemode=false。这将防止文件权限被跟踪(如果您的权限设置为 true,请将其更改为 false)。 Git 只知道 755 和 644。

您的问题的另一个可能原因是空格(制表符 v 空格)。 建议:始终使用设置来设置 TAB = 4spaces。同样,您应该与回购所有者保持同步。根据您使用的 IDE,您可以将其设置为与存储库所有者的设置相匹配。

您可能会尝试深入了解的其他有用信息:

  • 运行 git diff filename 在一个文件上并将输出添加到您的问题

  • 使用 Sourcetree 作为免费的 GUI 来帮助您处理长长的冲突文件列表(您仍然可以使用命令行来进一步理解 git)