我分叉了一个项目,进行了更改,并创建了一个被接受的拉取请求。新的提交后来被添加到存储库中。我怎样才能把这些承诺交给我?
当前回答
有三种方法可以做到这一点:从web UI(选项1)、从GitHub CLI(选项2)或从命令行(选项3)。
选项1-Web UI
在GitHub上,导航到要与上游存储库同步的分叉存储库的主页面。选择“获取上游”下拉列表。
查看上游存储库中有关提交的详细信息,然后单击“获取并合并”。
选项2-GitHub CLI
要从父级更新远程分叉,请使用gh repo sync子命令并提供分叉名称作为参数。
$ gh repo sync owner/cli-fork
如果来自上游存储库的更改导致冲突,则GitHub CLI无法同步。您可以设置-force标志来覆盖目标分支。
如何安装GitHub CLIGitHub CLI手册
选项3-命令行
在将分叉与上游存储库同步之前,必须在Git中配置指向上游存储库的远程。
1打开Git Bash。
2将当前工作目录更改为本地项目。
3从上游存储库获取分支及其各自的提交。对BRANCHNAME的提交将存储在本地分支上游/BRANCHNAME中。
$ git fetch upstream
> 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/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
> * [new branch] main -> upstream/main
4查看fork的本地默认分支-在本例中,我们使用main。
$ git checkout main
> Switched to branch 'main'
5将来自上游默认分支(在本例中为upstream/main)的更改合并到本地默认分支中。这将使fork的默认分支与上游存储库同步,而不会丢失本地更改。
$ git merge upstream/main
> 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/main
> Updating 34e91da..16c56ad
> Fast-forward
> README.md | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
注意:同步一个人的分叉只会更新回购的本地副本。要更新GitHub.com上的分叉,必须推送更改。
来源:GitHub Docs-同步分叉
其他回答
保持分叉存储库始终保持永久更新有两个主要方面。
1.从fork master创建分支并在那里进行更改。
因此,当您的PullRequest被接受时,您可以安全地删除分支,因为当您使用上游更新它时,您贡献的代码将保存在分叉存储库的主库中。这样,您的主机将始终处于干净状态,以便创建新的分支以进行另一个更改。
2.为fork master创建一个计划作业,以便自动进行更新。
这可以用cron完成。下面是一个示例代码,如果您在linux中执行此操作。
$ crontab -e
将此代码放在crontab文件中,以每小时执行一次作业。
0 * * * * sh ~/cron.sh
然后创建cron.sh脚本文件,并与ssh代理和/或预期的git交互,如下所示
#!/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相等。
从2014年5月开始,可以直接从GitHub更新fork。截至2017年9月,这仍然有效,但这将导致肮脏的犯罪历史。
在GitHub上打开你的分叉。单击拉取请求。单击New Pull Request。默认情况下,GitHub会将原始文件与您的fork进行比较,如果您没有进行任何更改,则不应该有任何可比较的内容。如果看到该链接,请单击切换基础。否则,手动将底叉向下设置到叉上,将头叉设置到上游。现在GitHub将您的分叉与原始分叉进行比较,您应该可以看到所有最新的更改。创建拉取请求并为拉取请求分配一个可预测的名称(例如,从原始请求更新)。向下滚动到Merge pull请求,但不要单击任何内容。
现在您有三个选项,但每个选项都会导致提交历史记录不那么清晰。
默认值将创建难看的合并提交。如果您单击下拉菜单并选择“压缩并合并”,所有中间提交都将被压缩为一个。这通常是你不想要的。如果您单击Rebase并合并,所有提交都将“与”您一起进行,原始PR将链接到您的PR,GitHub将显示This branch is X commits before,Y commits behind<original fork>。
因此,是的,您可以使用GitHub web UI保持回购的上游更新,但这样做会玷污您的提交历史。而是坚持使用命令行-这很简单。
rm -rf oldrepository
git clone ...
可能有更微妙的选项,但这是我唯一有信心的方法,我的本地存储库与上游存储库相同。
许多答案最终会将fork移到父存储库之前一次提交。这个答案总结了这里找到的步骤,这些步骤会将您的fork移动到与父级相同的提交。
将目录更改为本地存储库。如果您不是git结账主管,请切换到master分支将父级添加为远程存储库,git remote Add upstream<repo location>向上游发出git fetch发布git上游/主数据库在这个阶段,您可以通过键入gitstatus来检查提交将要合并的内容发布git推送源主机
有关这些命令的更多信息,请参阅步骤3。
这取决于存储库的大小以及如何分叉。
如果它是一个很大的存储库,您可能希望以一种特殊的方式管理它(例如删除历史记录)。基本上,您可以获取当前版本和上游版本之间的差异,提交它们,然后将它们重新提交给master。
试试看这个。它描述了如何处理大型Git存储库,以及如何使用最新的更改对其进行上游处理。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- 在GitHub上有一个公共回购的私人分支?
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- 只用GitHub动作在特定分支上运行作业
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 是否有一个链接到GitHub下载文件的最新版本的存储库?