我在GibHub上有一个博客项目,我的一个朋友希望将他的代码建立在其上。 他会对一些他不希望回复给我的文件(可能是样式表和图片)进行一些更改,但他可能会实现一个他希望推回到我的项目的新功能。
他也应该能够从我那里获得新代码,他希望得到所有新内容。
我环顾四周,看到Rebase是他的最佳选择,从我那里得到更新,但他怎么能最轻松地将一个功能推回给我? (他只是在学习Git,以及我)
答案 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>