从一个 git 分支拉出,推入另一个

pull from one git branch, push into another

我有一个本地 BitBucket 服务器,我将我的更改从 Web UI 合并到 master 中。 我想与一个永久的个人分支机构合作,我会定期从中创建合并请求。

我希望 git pullorigin/master 合并到我的本地 master 中,并且 git push 将我的本地 master 推送到 origin/itsadok 中。然后我将在服务器上创建一个合并请求,并将我的更改从 origin/itsadok 合并到 origin/master.

BitBucket server:   origin/itsadok --- via PR --> origin/master
                       ↑                              |
Local machine:          \---------- master <---------/

看起来很简单。

我知道我可以手动执行 git push origin master:itsadok,但我希望它是默认设置。似乎设置默认推送目标的唯一方法是配置 branch.master.mergerefs/heads/itsadok (和配置 push.defaultupstream),但是然后 pull 将从我个人的合并分支也是。

有没有办法配置 git 以便默认的推送和拉取能够像上面描述的那样工作?

编辑:我想到我可以通过将push.default设置为current,将本地分支命名为与远程个人分支,并将 branch.itsadok.merge 设置为 refs/heads/master。换句话说:

BitBucket server:   origin/itsadok --- via PR --> origin/master
                       ↑                              |
Local machine:          \---------- itsadok <--------/

这几乎可以工作,但是因为我有假定我的本地分支名为 master 的脚本,所以这个解决方案对我来说相当不方便。不过,如果没有其他想法,我会接受这个。

您可以通过正确映射推送参考规范来实现所描述的行为。如 push manual 中所述,git 按以下顺序查看要推送的内容:

  • 在命令行中明确列出参数或选项(如果存在)
  • remote.<remote_name>.push配置如果不为空
  • push.default配置否则

因此您可以 master 跟踪 origin\master,因此拉取工作正常,然后配置 remote.origin.push,因此不带参数的推送适合您的工作流程:

git config remote.origin.push refs/heads/master:refs/heads/itsadok

您可以通过使用 git rev-parse --symbolic-full-name @{upstream} 打印上游分支并使用 git rev-parse --symbolic-full-name @{push}

推送分支来检查您的配置

但是,有几点需要注意:

  • git status 会将 master 与其上游进行比较,因此即使在实际推送提交之后,您也会看到“1 commit ahead”通知。
  • 不带参数调用git push,而在非主分支上仍会将数据从主分支推送到 itsadok。如果你想尝试解决这个问题,最好的开始方式可能是 refspec configuration examples