我有一个远程分支,我从本地推送更改,然后意识到有更改为master所以我签入掌握运行git pull然后回到我的本地分支并运行git rebase master,但是我不能推送到我的远程分支现在是因为我的本地领先于它。
我刚刚从本地分支检出了一个新分支,并在github上创建了一个新分支并发出了拉取请求。
这是否合适/可接受?我可以做些什么来重新关闭我的远程分支吗?
答案 0 :(得分:2)
您无法从已推送到远程的分支(不修改历史记录)中重新定义更改。这是因为每次提交都是自父提交以来更改的日志,这意味着如果父提交发生更改,则提交本身也会更改。如果您从feature
分支创建master
分支,然后将更多更改添加到master
分支,它将如下所示:
master
- a --- feature
- 1
- 2
- b
- c
现在,如果我们尝试git pull --rebase origin master
到feature
,则两个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。