将git commit移动到新分支

时间:2017-02-13 16:08:06

标签: git github version-control

使用git我提交了一些更改,现在希望将它们放在新的分支中。如何解决这个问题在几个地方有所解释,例如here

我的困惑与此任务的本地/远程方面更相关。

我首先将github上的存储库分配给myForkOnGitHubRepo。 然后我将该存储库克隆到我的本地PC:

local: git clone myForkOnGitHubRepo

然后我更改了源代码,提交并推送:

local: git add .
local: git commit
local: git push # (actually I used the minGW Gui for that one since the command line push issued a warning)

现在我的本地更改在myForkOnGitHubRepo中可见。精细。而且现在我注意到我会更喜欢使用新的分支(并且在myForkOnGitHubRepo中对新分支进行更改)。

我是否可以按照我在开头张贴的链接中的说明正确,即

local: git branch newbranch
local: git reset --hard HEAD~1 # only one commit was done

然后 - 好吧,现在怎样?我只需再推一次吗?或者我是否需要明确推送新分支? (对不起,如果这是非常基本的,我以前从未使用过这个)。

在创建newbranch之前还有什么需要做的吗?我的理解是,在推送后,本地和远程处于同一状态,这是正确的吗?

4 个答案:

答案 0 :(得分:3)

  

local:git branch newbranch
  local:git reset --hard HEAD~1#只做了一次提交

现在,强制(-f)推送到remote/master,因为git历史记录已更改。

$ git push -f origin master

结帐至newbranch并同时推送newbranch

$ git checkout newbranch
$ git push origin newbranch
  • 常见情况是master分支应继续工作或不破坏。因此,当需要处理新功能时,请从feature创建一个新分支(例如,master)。

    $ git checkout master
    $ git checkout -b feature 
    
  • feature分支上工作。完成feature分支addcommitpush到远程。

    $ git add.
    $ git commit -m 'message'
    $ git push origin feature
    
  • 现在,如果feature分支的所有测试都正常,则创建Pull请求或与master合并

    $ git checkout master
    $ git pull origin feature   # pull = fetch + merge 
    $ git push origin master    # update remote/master
    
  

我的理解是,在推送后,本地和远程处于同一状态,这是正确的吗?

是的,当你推到遥控器时,你的本地&远程同步(相同的数据)

现在,如果您需要feature分支的更改/提交(假设feature尚未与master合并)在另一个分支中(例如,dev),那么,只需从dev创建一个分支(master),然后将feature分支拉入dev

$ git checkout master
$ git checkout -b dev

$ git pull origin feature     # pull 'feature' into 'dev'

# do changes here

$ git commit -am 'Added new feature'     # add & commit
$ git push origin dev

答案 1 :(得分:1)

如果您已经通过提交将分支推送到远程,那么只需从中创建一个新分支并将其推送到远程,如下所示:

$ git checkout -b newbranch
$ git push origin newbranch

但是,如果您直接从分支分支创建了一个分支,或者从没有提交的分支创建了一个分支,那么使用commit id将cherry pick提交到新分支并将其推送到远程。

$ git checkout branch
$ git log // look for commit id you want to move to another branch
$ git checkout newbranch
$ git cherry-pick <commit-d>
$ git push origin newbranch
  

我的理解是,在推动之后,本地和远程都在   同样的状态,这是正确的吗?

,只要您不修改这些文件:.gitignore.git/info/excludes~/.gitexclude,以避免将内容推送到远程。

答案 2 :(得分:1)

  

我是否可以按照我在开头张贴的链接中的说明正确,即

local: git branch newbranch
local: git reset --hard HEAD~1 # only one commit was done

  

然后 - 好吧,现在怎样?我只需要再推一次吗?

是。此外,您必须推送两个分支名称,其中一个需要&#34;强制推送&#34;。

  

或者我是否需要明确推送新分支? (对不起,如果那是非常基本的,我之前从未使用过它。)

虽然它是基本的,但这里有一堆历史问题。 Git默认情况下表现不同,大多数用户的行为都是错误的。 Git有覆盖默认值的选项,但默认是错误的。因此,在Git 2.0版中,默认行为发生了变化。为了实现这一目标,Git添加了一大堆配置项,以便您可以设置默认行为,如果您喜欢旧行为,现在我们必须讨论&#34;默认默认值行为&#34;:即如果你没有设置你自己的默认值,Git会做什么。

我假设您没有设置很多精巧的Git配置旋钮,因此您将获得默认默认值。 (我认为这是因为您提到的细节:使用minGW GUI。)

假设您的Git版本至少为2.0 ,您通常会分两步完成。 (因为Git就是这样,你可以在一个任何版本的Git中完成所有这些,但是让我们分两个。)

你没有提到旧分支的名称(master?)所以我在下面使用了oldbranch,但是你需要使用任何实际的名字是。

git push -u origin newbranch
git push -f origin oldbranch

您实际上可以按任何顺序执行这些操作。

第一个命令git push -u origin newbranch让你的Git在origin调用另一个Git并向他们传递新的分支名称,以及任何与它一起使用的新提交(如果他们需要它们) 。 -u标志意味着:&#34;我很确定这是一个新的分支给你;请创建或更新您的newbranch,让我的分支与我的分支匹配,然后我将让我的上游。&#34; (有关&#34;上游和#34;的更多信息,请参阅其他问题。)由于此分支对他们来说是新的,因此他们将遵守您的礼貌请求,使用特定于该分支的一个提交创建新分支。

(那个提交指向旧分支上的所有旧提交,因此这些提交现在位于两个分支,在您的Git存储库和远程分支上。)< / p>

第二次推送,-f--force,告诉你的Git再次调用另一个Git,告诉它(而不是礼貌地要求)移动 oldbranch带回到您搬回的地方。

我们必须强迫这种推动,因为他们通常会说&#34; no&#34;更礼貌的请求,因为失去了新的提交。但是你希望从旧分支中抛出提交。

(如果其他人在远程共享你的分支,这一步有点危险,因为你告诉他们的Git要抛出所有新提交,包括其他分享者可能提交的任何提交推了推。)

答案 3 :(得分:1)

对于你的问题:

  1. 您提到的两个命令(git branch newbranchgit reset --hard HEAD~1)非常有效地满足您的要求(将最新提交从master分支移动到newbranch)。
  2. 由于您对master(重置)和newbranch都进行了更改,因此您应该同时推送它们:
  3. git push -f origin master git push origin newbranch

    1. 在创建newbranch之前,如果本地有多个分支,则应切换到master分支(git checkout master)。是的,推送后,本地和远程状态相同。