代码之家  ›  专栏  ›  技术社区  ›  Jesper Blad Jensen

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

git
  •  1
  • Jesper Blad Jensen  · 技术社区  · 14 年前

    我在gibhub上有一个博客项目,我的一个朋友想把他的代码建立在这个项目上。 他将对一些他不想提交给我的文件(可能是样式表和图像)进行一些更改,但他可能会实现一个新功能,他想推回到我的项目。

    他也应该能够从我那里得到新的代码,在那里他想得到所有的新东西。

    我环顾四周,发现Rebase是他获取最新信息的途径,但他怎么能最轻松地将某个功能推还给我呢?(他和我一样,也在学吉特)

    3 回复  |  直到 14 年前
        1
  •  5
  •   jkyle    14 年前
    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

        2
  •  2
  •   wRAR    14 年前

    他应该创建一个分支,它将镜像您的“上游”分支,提交/合并/选择要向上游推送的提交,有时对回购中的分支执行git推送。然后,您应该检查该分支中的提交并将其合并到您的主分支。

        3
  •  0
  •   Santa    14 年前

    似乎您正在描述一个工作流,其中一个功能与主分支同时开发。上面的答案是好的,但应该注意的是,并非总是需要“回扣”。特别是对于git初学者来说,因为回扣相当于历史修改,是一个中间概念,如果您想在提交历史记录中保留有关分支的位置和时间的信息,那么它并不总是您想要的。

    当你的朋友想从你的主分支中获取更改时,他总是可以使用普通的、普通的merge而不是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>