我分叉了一个项目,进行了更改,并创建了一个被接受的拉取请求。新的提交后来被添加到存储库中。我怎样才能把这些承诺交给我?


当前回答

保持分叉存储库始终保持永久更新有两个主要方面。

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相等。

其他回答

如果您使用的是Windows或Mac的GitHub,那么现在他们有一个一键更新fork的功能:

在UI中选择存储库。单击顶部的“从用户/分支更新”按钮。

从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保持回购的上游更新,但这样做会玷污您的提交历史。而是坚持使用命令行-这很简单。

前言:您的分叉是“源”,您分叉的存储库是“上游”。

假设您已经使用如下命令将分叉克隆到计算机:

git clone git@github.com:your_name/project_name.git
cd project_name

如果已给出,则需要按以下顺序继续:

将“上游”添加到克隆的存储库(“源”):git远程添加上游git@github.com:original_author/project_name.git从“上游”获取提交(和分支):git获取上游切换到分叉的“master”分支(“origin”):切换到主分支停止“主”分支的更改:暂存将“上游”的“主”分支中的更改合并到“源”的“母”分支中:git合并上游/主解决合并冲突(如果有)并提交合并gitcommit-am“从上游合并”将更改推到叉上数字推送找回你藏起来的零钱(如果有的话)吉特藏弹你完了!祝贺

GitHub还提供了有关此主题的说明:同步分叉

从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

要查看配置,请使用以下命令:

git remote -v

保持分叉存储库始终保持永久更新有两个主要方面。

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相等。