【发布时间】:2010-11-10 12:51:02
【问题描述】:
我创建了一个 GitHub 存储库。然后我将一些更改推送到我的 fork。然后原始存储库合并了我的更改和其他一些更改。现在,我想合并我缺少的那些更改。我尝试了一个简单的拉,然后是推,但这会产生我的重复提交。最好的方法是什么?
【问题讨论】:
我创建了一个 GitHub 存储库。然后我将一些更改推送到我的 fork。然后原始存储库合并了我的更改和其他一些更改。现在,我想合并我缺少的那些更改。我尝试了一个简单的拉,然后是推,但这会产生我的重复提交。最好的方法是什么?
【问题讨论】:
您可能对每个存储库都有一个“远程”。您需要从一个遥控器拉出并推送到另一个。
如果您最初是从 fork 克隆的,则该远程将被称为“origin”。如果您尚未添加它,则需要将另一个存储库添加为另一个远程:
git remote add <shortname> git://github.com/<ownerName>/repo.git
所有设置完成后,你应该确实可以(github将默认分支从master更改为main,根据需要进行更改)
git pull <shortname> master
git push origin
请记住,git pull 只不过是一个按顺序执行git fetch 和git merge 的宏。您只需要从另一个存储库中获取提交列表,然后将他的分支合并到您的树中。合并应该对您在两个分支上的提交做正确的事情。
GitHub,当然,以其永恒的魅力,为您提供了一条捷径。如果您完全合并到另一侧,则您的存储库分支上有一个“快进”按钮,您可以使用它来赶上您的分支。
【讨论】:
git remote add snaury git@github.com:snaury/script-runner
所以上面接受的答案对我来说并不完美。即,它似乎在工作时失去了与原始 github 作者的链接,然后似乎不再工作了。我认为问题在于答案遗漏了远程名称和分支之间的 / 。所以它会从远程获取一个名为 master 的分支,但不能用它做任何事情。不太清楚为什么。
这是github recommends from their site的方式。
一旦你克隆了你的分叉存储库,你确实需要添加一个指向原始存储库的远程,就像前面的答案所说的那样。他们喜欢称它为上游,但这并不重要。
git remote add upstream git://github.com/octocat/Spoon-Knife.git
然后你获取
git fetch upstream
您会看到可用于合并的版本
From git://github.com/octocat/Spoon-Knife.git
* [new branch] gh-pages -> upstream/gh-pages
* [new branch] master -> upstream/main
然后您只需要选择要合并的分支。请注意,这些不是本地分支,它们存储在远程分支下。但如果您没有名为 upstream/master 的本地分支(这是允许的),您应该可以与以下行合并:
git merge upstream/main
或者,您可以使用以下行来缩短提取/合并(至少在初始提取之后):
git pull upstream/main
【讨论】:
git rebase 会更好,并且省去那些丑陋的空合并提交