我最近分叉了一个项目并应用了几个修复程序。然后我创建了一个拉取请求,然后被接受。
几天后,另一位撰稿人又做出了另一项改变。所以我的fork不包含那个改变。
如何将更改转换为我的分支?当我进行进一步的更改时,是否需要删除并重新创建我的分支?或者是否有更新按钮?
答案 0 :(得分:3486)
在forked存储库的本地克隆中,您可以将原始GitHub存储库添加为“远程”。 (“遥控器”就像存储库的URL的昵称 - 例如origin
就是一个。)然后,您可以从该上游存储库中获取所有分支,并重新定义您的工作以继续处理上游版本。就可能看起来像的命令而言:
# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
如果您不想重写主分支的历史记录(例如因为其他人可能克隆了它),那么您应该用git merge upstream/master
替换最后一个命令。但是,为了进一步提供尽可能干净的拉取请求,最好重新定位。
如果您已将分支重新定位到upstream/master
,则可能需要强制推送才能将其推送到GitHub上自己的分叉存储库。你可以这样做:
git push -f origin master
您只需在重新定位后第一次使用-f
。
答案 1 :(得分:688)
从2014年5月开始,可以直接从GitHub更新分支。这仍然适用于2017年9月,但它将导致脏的提交历史。
Update from original
)。现在您有三个选项,但每个选项都会导致一个不太干净的提交历史记录。
This branch is X commits ahead, Y commits behind <original fork>
。所以,是的,您可以使用GitHub Web UI保持您的repo更新其上游,但这样做会玷污您的提交历史记录。坚持the command line代替 - 这很容易。
答案 2 :(得分:409)
这是GitHub关于Syncing a fork的官方文件:
同步分支
设置
在同步之前,您需要添加指向上游存储库的远程数据库。你最初分叉的时候可能已经这样做了。
提示:同步fork只会更新存储库的本地副本;它不会在GitHub上更新您的存储库。
$ git remote -v # List the current remotes origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) $ git remote add upstream https://github.com/otheruser/repo.git # Set a new remote $ git remote -v # Verify new remote origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) upstream https://github.com/otheruser/repo.git (fetch) upstream https://github.com/otheruser/repo.git (push)
同步处理
将存储库与上游同步需要两个步骤:首先必须从远程获取,然后必须将所需的分支合并到本地分支。
撷取
从远程存储库中获取将引入其分支及其各自的提交。它们存储在特殊分支下的本地存储库中。
$ git fetch upstream # Grab the upstream remote's branches remote: Counting objects: 75, done. remote: Compressing objects: 100% (53/53), done. remote: Total 62 (delta 27), reused 44 (delta 9) Unpacking objects: 100% (62/62), done. From https://github.com/otheruser/repo * [new branch] master -> upstream/master
我们现在将上游的主分支存储在本地分支,上游/主站
中$ git branch -va # List all local and remote-tracking branches * master a422352 My local commit remotes/origin/HEAD -> origin/master remotes/origin/master a422352 My local commit remotes/upstream/master 5fdff0f Some upstream commit
合并
现在我们已经获取了上游存储库,我们希望将其更改合并到我们的本地分支中。这将使该分支与上游同步,而不会丢失我们的本地更改。
$ git checkout master # Check out our local master branch Switched to branch 'master' $ git merge upstream/master # Merge upstream's master into our own Updating a422352..5fdff0f Fast-forward README | 9 ------- README.md | 7 ++++++ 2 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 README create mode 100644 README.md
如果您的本地分支没有任何唯一提交,git将执行“快进”:
$ git merge upstream/master Updating 34e91da..16c56ad Fast-forward README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
提示:如果您想在GitHub上更新您的存储库,请按照here
中的说明进行操作
答案 3 :(得分:89)
很多答案最终会移动父存储库的提前提交。这个答案总结了here找到的步骤,这些步骤将您的分支移动到与父代相同的提交。
将目录更改为本地存储库。
git checkout master
将父级添加为远程存储库git remote add upstream <repo-location>
git fetch upstream
问题git rebase upstream/master
git status
问题git push origin master
有关这些命令的更多信息,请参阅step 3。
答案 4 :(得分:43)
自2013年11月以来,GitHub开启了一个非官方的功能请求,要求他们添加一个非常简单直观的方法来保持本地分支与上游同步:
https://github.com/isaacs/github/issues/121
注意:由于功能请求是非官方的,因此建议您与support@github.com
联系,以添加对此类功能的支持。上面的非官方特征请求可以用作对此实施的兴趣量的证据。
答案 5 :(得分:39)
前言:您的前叉是“起源”,您分叉的存储库是“上游”。
让我们假设您已经使用以下命令将您的fork克隆到您的计算机:
git clone git@github.com:your_name/project_name.git
cd project_name
如果有,那么您需要按此顺序继续:
将“upstream”添加到克隆的存储库(“origin”):
git remote add upstream git@github.com:original_author/project_name.git
从“上游”获取提交(和分支):
git fetch upstream
切换到前叉的“主”分支(“起源”):
git checkout master
存储“主”分支的更改:
git stash
将“上游”的“主”分支的更改合并到“原点”的“主”分支中:
git merge upstream/master
解决合并冲突(如果有)并提交合并
git commit -am "Merged from upstream"
将更改推送到您的前叉
git push
取回您隐藏的更改(如果有)
git stash pop
你已经完成了!恭喜!
GitHub还提供了有关此主题的说明:Syncing a fork
答案 6 :(得分:37)
如果像我一样,永远不会直接提交任何东西,你应该这样做,你可以做到以下几点。
从fork的本地克隆中,创建上游远程。你只需要这样做一次:
git remote add upstream https://github.com/whoever/whatever.git
然后,只要您想要了解上游存储库主分支,您需要:
git checkout master
git pull upstream master
假设你自己从未对主人做过任何事情,你应该已经完成了。现在,您可以将本地主服务器推送到原始远程GitHub fork。您还可以在现在最新的本地主数据库中重新设置开发分支。
通过初始上游设置和主检出,您需要做的就是运行以下命令将您的主人与上游同步: git pull upstream master 。
答案 7 :(得分:22)
截至本回答日期,GitHub在网络界面中没有(or shall I say no longer?)此功能。但是,您可以要求support@github.com
添加您的投票。
与此同时,GitHub用户bardiharborow创建了一个工具来实现这一目标: https://upriver.github.io/
答案 8 :(得分:16)
有一种方法可以从 GitHub 的 web 应用程序中做到这一点。
让我们来看看下面的例子。
首先,打开您要更新的存储库。
可以看到警告
<块引用>此分支在 GoogleCloudPlatform:master 后面有 157 次提交。
右侧有两个按钮 Pull request
和 Compare
。按 Compare
。
由于可能没有什么可比较的,请按 switching the base
将显示所有更改的列表,您可以通过按下按钮 Create pull request
给它一个标题,比如说“更新仓库”
并创建拉取请求。
创建请求后,滚动到底部并按 Merge pull request
。
确认合并,就是这样!
答案 9 :(得分:15)
如果您正在使用GitHub for Windows,那么现在他们只需一键功能即可更新分支:
&#xA;&#xA;答案 10 :(得分:9)
实际上,可以通过浏览器中上游的任何提交在fork中创建一个分支:
city_list
,其中 repo 是您的分支,哈希是提交的完整哈希,您可以在上游Web界面中找到它。例如,我可以打开https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990,在写作时指向https://github.com/<repo>/commits/<hash>
linux
。然后,您可以将该分支提取到本地克隆,并且当您在该提交之上进行编辑时,您不必将所有数据推送回GitHub。或者使用Web界面更改该分支中的某些内容。
它是如何工作的(这是猜测,我不知道GitHub是如何做到的):forks共享对象存储并使用namespaces来分隔用户的引用。因此,您可以通过fork访问所有提交,即使它们在分叉时不存在。
答案 11 :(得分:8)
GitHub 现在推出了一项功能,只需单击按钮即可同步分叉。
转到您的分叉,点击Fetch upstream
,然后点击Fetch and merge
,直接将您的分叉与其父存储库同步。 >
您也可以点击Compare
按钮在合并之前比较更改。
参考:GitHub 的 tweet
答案 12 :(得分:8)
按照以下步骤操作。我尝试了它们,它帮助了我。
结帐到您的分行
语法: git branch yourDevelopmentBranch
示例: git checkout master
拉取源存储库分支以获取最新代码
语法: git pull https://github.com/tastejs/awesome-app-ideas master
示例: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME
答案 13 :(得分:5)
作为对此答案的补充,我一直在寻找一种方法来一次性更新来自上游分支的克隆存储库( origin )的所有远程分支。这就是我做到的。
这假设您已经配置了指向源存储库的上游远程(其中 origin 已分叉)并已与git fetch upstream
同步。< / p>
然后运行:
for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done
此命令的第一部分列出上游远程仓库中的所有磁头,并删除SHA-1,后跟refs/heads/
分支名称前缀。
然后,对于这些分支中的每一个,它将上游远程跟踪分支(本地端的refs/remotes/upstream/<branch>
)的本地副本直接推送到 origin上的远程分支(远程一侧refs/heads/<branch>
)。
任何这些分支同步命令都可能由于以下两个原因之一而失败:上游分支已被重写,或者您已将该分支上的提交推送到您的分支。在第一种情况下,您还没有向分支上的分支提交任何内容,可以安全地强行推送(在上面的命令中添加 -f 开关;即git push -f
) 。在另一种情况下,这是正常的,因为你的fork分支已经分歧,你不能期望sync命令工作,直到你的提交被合并回上游。
答案 14 :(得分:5)
我用这一行更新我的分叉回购:
git pull https://github.com/forkuser/forkedrepo.git branch
如果您不想将另一个远程端点添加到项目中,请使用此方法,因为此处发布了其他解决方案。
答案 15 :(得分:5)
"Pull" app是一种自动设置并忘记的解决方案。它将把fork的默认分支与上游存储库同步。
访问URL,单击绿色的“安装”按钮,然后选择要启用自动同步的存储库。
该分支每小时直接在GitHub上更新一次,在您的本地计算机上,您需要拉主分支以确保本地副本是同步的。
答案 16 :(得分:3)
当您克隆了分叉存储库时,请转到克隆所在的目录路径以及Git Bash Terminal中的几行。
$ cd project-name
$ git remote add upstream https://github.com/user-name/project-name.git
# Adding the upstream -> the main repo with which you wanna sync
$ git remote -v # you will see the upstream here
$ git checkout master # see if you are already on master branch
$ git fetch upstream
你很高兴去。主存储库中的所有更新更改都将推送到您的fork存储库中。
&#34; fetch&#34;命令对于在项目中保持最新是必不可少的:只有在执行&#34; git fetch&#34;您是否会被告知同事推送到远程服务器的更改。
您仍然可以访问here进一步查询
答案 17 :(得分:3)
Android Studio现已学会使用GitHub fork存储库(您甚至不必通过console命令添加“上游”远程存储库)。
打开菜单 VCS → Git
并注意最后两个弹出菜单项:
重新启动我的GitHub前叉
创建拉取请求
试试吧。我使用第一个来同步我的本地存储库。无论如何,在您单击“Rebase my GitHub fork”后,可以在Android Studio中访问父远程存储库(“上游”)的分支,您将能够轻松地使用它们。
(我使用带有“Git集成”和“GitHub”插件的Android Studio 3.0。)
答案 18 :(得分:2)
假设您的 fork 是 https://github.com/me/foobar 并且原始存储库是 https://github.com/someone/foobar
访问https://github.com/me/foobar/compare/master...someone:master
如果您看到绿色文本 Able to merge
,请按创建拉取请求
在下一页上,滚动到页面底部并点击合并拉取请求和确认合并。
答案 19 :(得分:1)
最初,分叉的存储库具有一个分支:master
。如果您要开发新功能或修复程序,通常会创建一个新分支feature
并进行更改。
如果您希望分支的存储库与父存储库同步,则可以为Pull app(功能分支中的 )设置配置文件(pull.yml
) >),就像这样:
version: "1"
rules:
- base: feature
upstream: master
mergeMethod: merge
- base: master
upstream: parent_repo:master
mergeMethod: hardreset
这将使分叉存储库的master
分支与父存储库保持最新。通过合并叉化仓库的feature
分支,可以通过叉化仓库的master
分支来更新分支。假设feature
分支是包含配置文件的默认分支。
这里有两个mergemethods
在起作用,一个是hardreset
,这有助于强制派生回购的master
分支中的更改与父回购同步,另一种方法是{{1 }}。此方法用于合并您在merge
分支中所做的更改和在feature
分支中由于强制同步而完成的更改。如果发生合并冲突,则拉应用程序将允许您在拉请求期间选择下一步操作。
您可以阅读有关基本和高级配置以及各种master
here的信息。
答案 20 :(得分:1)
rm -rf oldrepository
git clone ...
可能会有更好的选择,但这是我确信本地存储库与上游存储库相同的唯一方法。
答案 21 :(得分:1)
这取决于您的存储库的大小以及您如何分叉它。
如果它是一个非常大的存储库,您可能希望以特殊方式管理它(例如丢弃历史记录)。基本上,你可以获得当前版本和上游版本之间的差异,提交它们,然后樱桃回归掌握。
尝试阅读this one。它描述了如何处理大型Git存储库以及如何使用最新更改来上游它们。
答案 22 :(得分:1)
答案 23 :(得分:0)
如果您设置上游。选中git remote -v
,就足够了。
git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push
答案 24 :(得分:0)
保持叉状存储库始终不断更新有两件事。
1。从派生母版创建分支,然后在其中进行更改。
因此,当您的 Pull Request 被接受时,您可以安全地删除该分支,因为当您使用上游更新它时,您贡献的代码将保存在您的分支存储库的主目录中。这样,您的母带将始终处于干净状态,以创建新分支来进行其他更改。
2。创建一个计划的作业,供fork主控器自动更新。
这可以通过 cron 完成。这是一个示例代码,如果您在linux中执行的话。
$ crontab -e
将此代码放在crontab file
上以每小时执行一次作业。
0 * * * * sh ~/cron.sh
然后使用 git interaction 和/或 ssh-agent创建cron.sh
脚本文件和 expect } 如下
#!/bin/sh
WORKDIR=/path/to/your/dir
REPOSITORY=<name of your repo>
MASTER="git@github.com:<username>/$REPOSITORY.git"
UPSTREAM=git@github.com:<upstream>/<name of the repo>.git
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
echo "all the same, do nothing"
else
echo "update exist, do rebase!"
git reset --hard upstream/master
git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`
检查分叉的存储库。它会不时地始终显示此通知:
该分支甚至与
<upstream>
:master 。
答案 25 :(得分:0)
使用这些命令(在幸运的情况下)
git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v
答案 26 :(得分:0)
如果您使用GitHub Desktop,则只需6个步骤(实际上只有5个步骤)即可轻松实现。
一旦打开Github Desktop并选择您的存储库,
master
/ branch-name
中的合并。以以下示例为例查看GIF:
答案 27 :(得分:0)
从github页面删除远程开发人员
然后应用以下命令:
1) git branch -D dev
2) git fetch upstream
3) git checkout master
4) git fetch upstream && git fetch upstream --prune && git rebase upstream/master && git push -f origin master
5) git checkout -b dev
6) git push origin dev
7) git fetch upstream && git fetch upstream --prune && git rebase upstream/dev && 8) git push -f origin dev
答案 28 :(得分:0)
如果你想让你的 GitHub 分支与各自的上游保持同步,GitHub 也有专门的 probot 程序:https://probot.github.io/apps/pull/ 可以完成这项工作。 您需要允许在您的帐户中进行安装,这将使您的分叉保持最新。
答案 29 :(得分:0)
如何在本地机器上更新你的分叉仓库?
首先,检查您的遥控器/主控
git remote -v
你应该有起源和上游。例如:
origin https://github.com/your___name/kredis.git (fetch)
origin https://github.com/your___name/kredis.git (push)
upstream https://github.com/rails/kredis.git (fetch)
upstream https://github.com/rails/kredis.git (push)
然后转到主:
git checkout main
并从上游合并到主:
git merge upstream/main
答案 30 :(得分:0)
$ git remote add upstream https://github.com/....
$ git pull upstream main
$ git push