我在forked存储库上做了一些更改,我希望从上游覆盖一个文件。上游存储库作为远程存储库添加。当我执行合并时,git告诉我我是最新的:
$ git merge upstream/master master
Already up-to-date.
但是当我运行diff时,git会显示我的分叉存储库中缺少的文件
$ git diff upstream/master origin
diff --git a/Library/Formula/exim.rb b/Library/Formula/exim.rb
deleted file mode 100644
index 48d52cf..0000000
--- a/Library/Formula/exim.rb
有没有让git将丢失的文件添加到我的分叉存储库?
答案 0 :(得分:2)
Upstream有文件。你从上游获得它并删除它。没有更改与删除的3向合并是删除,因此合并后文件仍然不存在。一旦upstream/master
完全合并(在给出第一个列出的输出的情况下),再次合并是一个无操作,因为merge只考虑更改,因为分支是最后一次合并而另一边没有。
你想要:
还原您删除文件的更改:
git log -- Library/Formula/exim.rb
将告诉您删除文件的修订版本,而不是
git revert <revision-id>
将其还原。
从上游获取文件内容并再次添加:
git cat-file blob upstream/master:Library/Formula/exim.rb > Library/Formula/exim.rb
git add Library/Formula/exim.rb
git commit
答案 1 :(得分:1)
我认为你应该像你这样合并到你当地的主人:
git checkout master
git pull origin/master # in case there are changes posted remotely
git pull upstream/master
之后,您可以使用以下命令将本地主人推送到远程origin
git push origin master
此时upstream/master
应合并到master
,该origin/master
应该等于git diff upstream/master origin
。
如果您希望它们相同,那么您的diff命令没有多大意义:
origin/master
这会将upstream/master
与master
进行比较,但是如果您在分叉后对upstream
进行了更改,并且您无法控制{{1}}这些更改不相同,那么好像你期待它们。
答案 2 :(得分:1)
您将upstream/master
与origin/master
进行了比较,但将upstream/master
合并为master
。看起来你在upstream
repo(GitHub上的原始回购)和origin
(你在GitHub上的分叉回购)之间感到困惑。
合并后的更改仍然是本地的,如果您想让它们显示在origin
中,则需要推送它们:git push origin master
。
从图形上看,你在开始就有这种情况:
A----B
\ ^master and origin/master
\---C
^upstream/master
合并后:
A----B-----------------D
\ ^origin/master /^master
\---C---------------/
^upstream/master
回到origin
后:
A----B-----------------D
\ ^ /^master and origin/master
\---C---------------/
^upstream/master
答案 3 :(得分:0)
git merge
命令未更新上游仓库。你告诉git将上游的更改合并到你的本地,因为你已经拥有了本地上游的所有提交,所以没有什么可以提交的。
您希望“推送”您的更改。运行git push upstream master
http://www.lornajane.net/posts/2012/pushing-to-different-git-remotes
对于您的分叉回购,您只需要git push origin master
来推送主分支或只是一个简单的git push