我在github.com上有一门课程,并将这些步骤分成几个分支。今天我尝试更改主文件中的文件,并尝试将此文件更新到所有其他分支。
我设法通过以下方式在本地完成:
git checkout master
git commit -a -m "my file is updated"
git checkout step1
git rebase master
git checkout step2
git rebase master
... (on all my branches)
然后当试图像这样推动时:
git push origin
我收到错误...
有没有人有想法?我相信它非常基本。
答案 0 :(得分:1)
Git rebase不会将提交从一个分支复制到另一个分支。它移动整个分支,使其从新位置分支,而不是原来的分支。与此同时,它根本不会改变您正在将重新定位到的分支。您得到的错误可能是因为您正在尝试推送已更改其历史记录的主分支。换句话说,git rebase
基本上不适用于您似乎想要做的事情。
相反,请使用git cherry-pick
。 Git cherry-pick将一个或多个提交从提交历史中的一个地方复制到另一个地方。在这种情况下,您希望将主分支的提示复制到其他几个分支中,所以这就是您要做的:
git checkout master
git commit -a -m "my file is updated"
git checkout step1
git cherry-pick -x master
git checkout step2
git cherry-pick -x master
... (etc.)
-x
在自动生成的提交消息中包含一个注释,表示它是通过挑选创建的,并且是从樱桃挑选的位置创建的记录。我认为这是一个好习惯,但如果你不在乎,你可以省略旗帜。请注意,挑选“master”只捕获master分支上的最新提交,这听起来像你想要的。如果你想要来自master的多次提交,你必须将它们指定为范围。
如果你想要将所有分支都复制到遥控器上,那么一旦你完成了所有的挑选,你就必须推动所有分支。
答案 1 :(得分:0)
我收到错误...
有没有人有想法?我相信它非常基本
对于没有向我们展示的错误请求帮助,您是否觉得奇怪!?! 我们应该找到错误来告诉你我们是天才吗?
无论如何......我认为你的错误告诉你,你不能用以下信息推送:
为防止您丢失历史记录,拒绝非快进更新在再次推送之前合并远程更改。有关详细信息,请参阅git push --help的“关于快进的注意事项”部分。
这是因为每次使用git rebase
时,您都会创建新的历史记录并放弃旧的历史记录。
当您尝试在服务器上推送新历史记录时,您将丢弃相同的历史记录并松散提交。默认情况下,git会阻止你访问它。
在这种特殊情况下,您要做的是git push --force-with-lease
。
如果这是真的:
(在我所有的分支上)
你甚至可以做git push origin --force-with-lease --all
。
这是“危险”的命令,所以我给你的最好建议是在开始之前阅读并理解git是如何工作的(了解什么是DAG)...
答案 2 :(得分:-1)
最后我使用git rebase,但是我必须添加-f来强制推送
git push -f origin master
git push -f origin step1
...