如何最好地使用“分叉”git repo,并将一些新功能推回原点

时间:2010-04-06 16:28:11

标签: git

我在GibHub上有一个博客项目,我的一个朋友希望将他的代码建立在其上。 他会对一些他不希望回复给我的文件(可能是样式表和图片)进行一些更改,但他可能会实现一个他希望推回到我的项目的新功能。

他也应该能够从我那里获得新代码,他希望得到所有新内容。

我环顾四周,看到Rebase是他的最佳选择,从我那里得到更新,但他怎么能最轻松地将一个功能推回给我? (他只是在学习Git,以及我)

3 个答案:

答案 0 :(得分:5)

git clone git://yourrepo.com/project.git

创建跟踪的远程分支。这意味着使用主分支自动完成拉动和推动操作。轨道分支可能是origin / dev或origin / master。取其。

git checkout --track -b mylocalbranch origin/trackedbranch

之后,通过本地提交等方式完成正常的git工作流程。偶尔他应该,

git pull --rebase

这将执行一个rebase操作,它回滚他的更改,拉入对远程分支所做的更改,然后在其上重放他的本地更改(解决所有冲突;执行任何合并)。

当他完成并希望实现这些改变时,他应该把事情当前放在:

git pull --rebase # get most recent changes

然后,对于一个裸存储库:

git push # push his changes to the main repo

如果它是非裸存储库(例如您的主文件夹中的存储库或某些存储库),那么他最好通知您他已准备就绪,然后执行

git pull /path/to/his/repo

通常建议不要推送到非裸存储库。原因是你可以在你的本地进行未提交的更改,当他推动它时,可能会发生混乱details。讨论此pit fall

的内核陷阱线程

答案 1 :(得分:2)

他应该创建一个分支,它将镜像你的“上游”分支,提交/合并/樱桃选择它想要向上游推送的提交,有时候对你的仓库中的分支进行git-push。然后,您应该检查该分支中的提交并将它们合并到您的主分支。

答案 2 :(得分:0)

您好像在描述一个与主分支同时开发功能的工作流程。上面的答案是好的,但应该注意的是,“rebase”并不总是必要的。特别是对于git初学者,由于rebase相当于历史修改,因此是一个中间概念,如果你想保留有关在提交历史中分支的位置和时间的信息,并不总是你想要的。

当你的朋友想要从你的主分支中提取更改时,他总是可以使用普通的,vanilla合并而不是rebase:

git fetch origin
git merge origin/master  # or any branch he wants to merge other than "master"

当您想要提取朋友的更改时,您可以执行类似的操作:

git fetch friend
git merge friend/feature  # choose any of your friend's branches to merge with your current

如果您的存储库中有URL(本地或其他),则上述工作流程可以正常工作。如上所述,推送到非裸存储库(您的存储库)是危险的。如果您需要您的朋友能够推送,请使用公共的裸存储库。

如果您只想从朋友的分支中选择特定修订版,请使用cherry-pick命令:

git fetch friend
git log friend/feature  # or `git log friend`
# find the commit you want to cherry pick, then
git cherry-pick <commit>