将提交推送到另一个分支

630
可以从一个分支提交和推送更改到另一个分支吗?
假设我在`BRANCH1`中提交了更改,并希望将它们推送到`BRANCH2`。
从`BRANCH1`,可以这样做吗:
git push origin BRANCH2

然后重置BRANCH1吗?
11个回答

1117

那几乎可以工作。

当推送到非默认分支时,您需要指定源参考和目标参考:

git push origin branch1:branch2

或者

git push <remote> <branch with new changes>:<branch you are pushing to> 

40
需要将branch1branch2都放到远程吗?如果想要将本地的branch1推送到远程的origin branch2,该怎么办? - orad
20
不需要。第一部分实际上只是本地提交的标识符,甚至不需要是一个分支。 - SLaks
7
请使用相同的语法。要引用源分支,请使用 <remote>/<branch> - SLaks
4
请按照我刚才说的做。当前分支完全无关紧要。 - SLaks
75
请注意,任何有诱惑(包括我自己)运行 git push origin :branch2 的人认为这只是将当前本地分支推送到远程 branch2,实际上会删除远程的 branch2!正确的方法是 git push origin HEAD:branch2 - Helder Pereira
显示剩余13条评论

104

当然,只有在BRANCH2进行快速转发或者你强制执行时才能起作用。执行此操作的正确语法为

git push <remote> <source branch>:<dest branch> 

请参考git push手册页中的“refspec”描述,了解其更详细的工作方式。同时请注意,强制推送和重置都是“重写历史记录”的操作,除非您非常确定您对任何远程存储库以及拥有相同项目分支/克隆的其他人所做的所有更改都完全了解,否则不建议脆弱胆怯的人尝试这两个操作。


8
谢谢!我只想补充一下,你可以使用 git push --force remote local-branch:remote-branch 命令来强制推送。请注意保持意思不变,使语言易于理解,但请勿添加任何额外的解释或内容。 - Ferran Maylinch

44

非常简单。假设您已经对所在的分支A进行了更改,该分支同时存在于本地和远程,但您希望将这些更改推送到不存在任何地方的分支B

步骤1:创建并切换到新分支B

git checkout -b B

步骤2:将更改添加到新的本地分支

git add . //或特定文件

步骤3:提交更改

git commit -m "commit_message"

步骤4:将更改推送到新分支B。下面的命令还会在远程创建一个新的分支B

git push origin B

现在,您可以从Bitbucket验证,分支B将比分支A多一个提交。当您切换到分支A时,这些更改将不会存在,因为它们已被推送到B分支。

注意:如果您已将更改提交到分支A,并且之后您想将这些更改移动到新分支B,则必须首先重置这些更改。#快乐学习


1
如果分支B已经存在,这个方法就不起作用。 - Mário Henrique
5
@MárioHenrique 是的,很明显,'-b' 用于创建新的分支,而如果该分支已经存在,您可以跳过此选项。 - Bilal Ahmed Yaseen

15
  1. 在BRANCH1上提交您的更改。
  2. 打开终端并输入命令-> "git push <远程名称> <branch1_name>:<branch2_name>"

完成。

对于这个问题:

该命令为

git push origin BRANCH1:BRANCH2

编辑:现在我意识到,GitHub Desktop具有很好的用户界面,可以将您的更改从一个分支带到另一个分支。 当然,与手动在终端中输入命令相比,这不是一个好选项。


10

我使用 git push origin branch1:branch2 命令时遇到了问题:

在我的情况下,branch2 被删除且 branch1 已经被更新了一些新的更改。

因此,如果你只想将 branch1 上对 branch2 的更改推送到远程 branch2 中,请尝试以下步骤:

  • branch1 上执行:git add .
  • branch1 上执行:git commit -m 'comments'
  • branch1 上执行:git push origin branch1

  • branch2 上执行:git pull origin branch1

  • branch1 上:回滚到以前的提交。


你忘记添加一些命令来“恢复到上一个提交”。 - Vladimir Ch
1
@VladimirCh 只需通过 git checkout <先前的SHA代码> 即可。 - Benyamin Jafari

9

感谢@SLaks的答案,对我来说基本适用。但在分支具有不同的头时,一个方便的方法是使用cherry-pick。

  1. git log - 查看你修改过的Branch1的提交记录
  2. 复制你所做更改的提交SHA
  3. git checkout branch2 - 切换到要应用更改的分支
  4. git cherry-pick SHA_OF_COMMIT_FROM_STEP_2

5
在我的情况下,我有一个本地提交,它没有推送到origin\master,但是提交到了我的本地master分支。现在应该将此本地提交推送到另一个分支。
使用Git Extensions,您可以执行以下操作:
  • (如果不存在)创建并切换到新分支,您想要将提交推送到该分支。
  • 从历史记录中选择应该被提交和推送到此分支的提交。
  • 右键单击并选择Cherry pick commit
  • 然后按Cherry pick按钮。
  • 所选提交将应用于您检出的分支。现在进行提交并推送它。
  • 检出具有错误提交的旧分支。
  • 将此分支硬重置为第二个最后一个提交,其中一切都正常(请注意您正在做什么!)。您可以通过右键单击第二个最后一个提交并选择Reset current branch to here来执行此操作。如果您知道自己在做什么,请确认此操作。
你也可以在GIT命令行上执行此操作。 示例来自David Christensen
我认为你会发现使用git cherry-pick+git reset能够更快地完成工作流程:
在你的场景中,如果“feature”是具有顶部提交不正确的分支,则执行以下操作将更加容易: git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^ 这样可以节省很多工作量,并且正是git cherry-pick设计的情况。
我还要注意的是,即使它不是最顶部的提交,也可以使用相同的方法;只需要一个提交参数作为cherry-pick的参数即可,例如: git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... #从历史记录中删除特定的提交

3

如果你想把代码推送到另一个分支,请按照下面的git命令操作。记住,demo是我创建的另一个分支名称,你可以替换为你自己的分支名称。

git push origin master:demo

2
您可以轻松完成这个任务。
git status
git add .
git commit -m "any commit"
git pull origin master 
git push origin master:development # assuming 'development' is the target branch name.

-1

git init 
#git remote remove origin
git remote add origin  <http://...git>
echo "This is for demo" >> README.md 
git add README.md
git commit -m "Initail Commit" 
git checkout -b branch1 
git branch --list
****add files***
git add -A
git status
git commit -m "Initial - branch1"
git push --set-upstream origin branch1
#git push origin --delete  branch1
#git branch --unset-upstream  


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接