重新定位远程分支的git / github工作流程

时间:2014-04-25 17:04:33

标签: git github

我有一个远程分支,我从本地推送更改,然后意识到有更改为master所以我签入掌握运行git pull然后回到我的本地分支并运行git rebase master,但是我不能推送到我的远程分支现在是因为我的本地领先于它。

我刚刚从本地分支检出了一个新分支,并在github上创建了一个新分支并发出了拉取请求。

这是否合适/可接受?我可以做些什么来重新关闭我的远程分支吗?

1 个答案:

答案 0 :(得分:2)

您无法从已推送到远程的分支(不修改历史记录)中重新定义更改。这是因为每次提交都是自父提交以来更改的日志,这意味着如果父提交发生更改,则提交本身也会更改。如果您从feature分支创建master分支,然后将更多更改添加到master分支,它将如下所示:

master
 - a --- feature
           - 1
           - 2
 - b
 - c

现在,如果我们尝试git pull --rebase origin masterfeature,则两个feature提交将拥有不同的父级和不同的签名。

master
 - a
 - b
 - c --- feature
          - 1a
          - 2a

这非常好,是保持本地分支清洁和最新(避免“合并提交”)的好方法。但是,如果您已将feature分支推送到远程仓库,则必须强制并覆盖feature上的这两个提交(因为它们的历史记录已更改)。如果有人做过git fetch origin并且在feature:2之上工作,那么他们将无法推送他们的更改(因为feature:2已被feature:2a替换,而现在是历史记录是不同的。


现在,对于个人意见,辩论和您的特定环境,适当的工作流程是什么。例如,如果您是唯一的开发人员,则处理遥控器或没有人其他人已经离开master分支,因为您......您可以执行此操作git push origin master -f会强制用您的本地副本覆盖遥控器的master

我建议您将来如何进行此操作,正在使用master创建基于--squash的“功能”分支,并使用git rebase保持此历史记录尽可能干净。如果你有一大堆干净的提交,你很满意,将它们推送到原点(你推送到远程仓库的任何提交,想要重新设置)。

如果您对分支感到满意,可以提交拉取请求。当你进行合并时,我建议你用master手动完成它,这样你就可以在git fetch origin git checkout master git merge --squash origin/feature/branch git commit 分支上有一个很好的干净历史记录(它应该像故事一样)。这就是关闭拉取请求的方法:

{{1}}

我知道我有点迂回回答那里,如果你有任何具体的事情需要我解决,请在评论中提问。以下是您可能感兴趣的额外reading