我有一个存储库(origin
),它是从另一个存储库(upstream
) fork (用 GitHub 术语来说)的。我在主题分支中进行所有开发,并且从不触及上游存储库中存在的分支(master
、development
、1.x
等。 )。
这是我的存储库中的分支示例
$ git branch -a # plus hand annotations
development [upstream-maintained: should always be == upstream/development]
feature-1 [mine: should track origin/feature-1]
feature-2 [mine: should track origin/feature-2]
* master [upstream-maintained: should always be == upstream/master]
remotes/origin/HEAD -> origin/master
remotes/origin/development
remotes/origin/feature-1
remotes/origin/feature-2
remotes/origin/master
remotes/upstream/development
remotes/upstream/gh-pages [I do not care about this..]
remotes/upstream/master
remotes/upstream/stable-1.x [...nor I care about these two..]
remotes/upstream/stable-2.x [...stable-* branches]
从上游存储库获取数据后,我必须完成更新所有上游维护分支的繁琐任务:我切换到master
,我merge --ff-only upper/master
并推送到原点。必须对我关心的每个上游维护的分支重复此操作。请注意,merge --ff-only
始终有效,因为我从不接触这些分支。
我希望 git pull
为我完成所有这些繁琐的更新。
有没有办法告诉 git 上游维护的分支应该被推送到origin
,但从上游
pull 和跟踪?
最佳答案
正如“How can I pull from one remote and push to another with git?”中提到的,您可以:
确保推送到原点:
git config remote.pushdefault origin git config push.default matching
设置上游分支:
git fetch upstream git branch -u upstream/master foo
请注意,您应该在 upstream/master
之上重新调整您的 topic
分支(而不是 merge ),以免 pull 请求中出现 merge 提交。
这意味着 git push -f 用于更新您的 fork 远程分支(这将自动更新 pull 请求)
您可以通过以下方式强制 rebase :
git config autosetuprebase remote
# or
git branch.foo.rebase true
例如:
C:\Users\vonc\prog\git\so>git clone https://github.com/gioele/offlineimap.git
Cloning into 'offlineimap'...
remote: Counting objects: 9445, done.
remote: Compressing objects: 100% (3701/3701), done.
remote: Total 9445 (delta 4962), reused 9445 (delta 4962)
Receiving objects: 100% (9445/9445), 5.75 MiB | 2.18 MiB/s, done.
Resolving deltas: 100% (4962/4962), done.
Checking connectivity... done.
C:\Users\vonc\prog\git\so>cd offlineimap
C:\Users\vonc\prog\git\so\offlineimap>git remote add upstream https://github.com/offlineimap/offlineimap.git
让我们看看现在master指的是什么:
C:\Users\vonc\prog\git\so\offlineimap>git branch -avvv
* master 1746676 [origin/master] Make IDLE mode to work again
remotes/origin/HEAD -> origin/master
C:\Users\vonc\prog\git\so\offlineimap>git config --local -l
remote.origin.url=https://github.com/gioele/offlineimap.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.upstream.url=https://github.com/offlineimap/offlineimap.git
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*
让我们将原点作为推送的目的地:
C:\Users\vonc\prog\git\so\offlineimap>git config push.default matching
C:\Users\vonc\prog\git\so\offlineimap>git config remote.pushdefault origin
让我们更改上游分支:
C:\Users\vonc\prog\git\so\offlineimap>git fetch upstream
remote: Counting objects: 55, done.
remote: Compressing objects: 100% (55/55), done.
remote: Total 55 (delta 25), reused 1 (delta 0)
Unpacking objects: 100% (55/55), done.
From https://github.com/offlineimap/offlineimap
* [new branch] master -> upstream/master
C:\Users\vonc\prog\git\so\offlineimap>git branch -u upstream/master master
Branch master set up to track remote branch master from upstream.
将master
分支设置为监控upstream/master
:
C:\Users\vonc\prog\git\so\offlineimap>git br -avvv
* master 1746676 [upstream/master: behind 10] Make IDLE mode to work again
现在,git pull
(或者更好,git pull --rebase
)将从上游
pull :
C:\Users\vonc\prog\git\so\offlineimap>git pull --rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to 6bd76fed5a7e1e24310517b3510c465929870c08.
(并且 6bd76fed5a7e1e24310517b3510c465929870c08
是 upstream/master
提交)
git Push
仍会推送到原点:
C:\Users\vonc\prog\git\so\offlineimap>git push
remote: Permission to gioele/offlineimap.git denied to VonC.
fatal: unable to access 'https://github.com/gioele/offlineimap.git/': The requested URL returned error: 403
(正常,因为我不是 gioele
,所以我没有对该存储库的写入权限)
关于git - 自动更新上游分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361139/