将git提交移动到新分支

4

使用git我提交了一些更改,现在想将它们放到一个新的分支中。如何实现已经在多个地方解释过了,例如这里

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

我首先在github上fork了一个仓库到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)

现在,我在我的GitHub分支上看到了本地的更改。很好。但是现在我注意到我更喜欢使用一个新分支(并且也希望在我的GitHub分支上有该新分支中的更改)。
我是否可以按照我在开头发布的链接中的说明进行操作?
local: git branch newbranch
local: git reset --hard HEAD~1 # only one commit was done

然后呢 -- 现在该怎么办?我只需再次推送吗?或者我需要明确地推送新的分支?(如果这很基础,我以前从未使用过)。

在创建新分支之前还有什么其他事情需要做吗?我的理解是,在推送之后,本地和远程处于相同状态,是这样吗?


抱歉,我可以为每个回复投票,但只能标记一个作为答案。我已经掷骰子了。 - Thomas
4个回答

5

本地:git branch newbranch
本地:git reset --hard HEAD~1 # 只有一次提交

现在,强制推送到 remote/master,因为 git 历史已经改变。

$ git push -f origin master

切换到newbranch分支并将newbranch分支也推送。

$ git checkout newbranch
$ git push origin newbranch

  • Common scenario is master branch should keep working or not broken. So, when need to work on a new feature, create a new branch(say, feature) from master.

    $ git checkout master
    $ git checkout -b feature 
    
  • Work on feature branch. When done with feature branch add, commit and push to remote.

    $ git add.
    $ git commit -m 'message'
    $ git push origin feature
    
  • Now, if all test is ok with feature branch then create Pull request or merge with master

    $ git checkout master
    $ git pull origin feature   # pull = fetch + merge 
    $ git push origin master    # update remote/master
    
我的理解是,在推送后,本地和远程状态相同,这正确吗?
是的,当您向远程推送时,您的本地和远程处于同步状态(相同数据)
现在,如果您需要将“feature”分支(假设“feature”尚未与“master”合并)的更改/提交应用到另一个分支(例如,“dev”),则只需从“master”创建一个分支(“dev”)并将“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

2
如果您已经将分支与提交推送到远程,则只需从中创建一个新分支并将其推送到远程即可,例如:
$ git checkout -b newbranch
$ git push origin newbranch

但是,如果你直接从分叉的分支或者没有你想要推送的提交的分支创建了一个分支,那么可以使用提交 ID 将该提交 挑选 到你的新分支中,然后将其推送到远程。
$ 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

我的理解是,在push之后,本地和远程处于相同的状态,这正确吗?
是的,只要您没有修改这些文件:.gitignore.git/info/excludes~/.gitexclude以避免将内容推送到远程。

1

针对您的问题:

  1. 您提到的两个命令(git branch newbranchgit reset --hard HEAD~1)非常高效,可以满足您的要求(将最新的提交从主分支移动到新分支)。
  2. 由于您对主分支(reset)和新分支都进行了更改,因此您应该推送它们两个:

git push -f origin master git push origin newbranch

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

1

Is it correct that I can just follow the instructions in the link I posted in the beginning, i.e.

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

是的。

然后,现在怎么办?我只需要再次推送吗?

是的。此外,您必须推送两个分支名称,其中一个需要“强制推送”。

还是我需要显式推送新分支?(如果这很基础,对不起,我以前从未使用过)。

虽然它很基础,但这里有一堆历史问题。Git默认情况下的行为以前是错误的,而且对于大多数用户来说都是错误的。Git有覆盖默认值的选项,但默认值是错误的。因此,在Git 2.0版本中,默认行为发生了更改。为了到达那里,Git添加了整个配置项,以便您可以设置默认行为,如果您喜欢旧行为,现在我们必须谈论“默认默认行为”:即,如果您不设置自己的默认值,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标志的含义是:“我很确定这是你的一个新分支;请创建或更新你的newbranch,使你的分支与我的匹配,然后我将把你的作为我的上游。”(有关“上游”的更多信息,请参见其他问题。)由于这个分支对他们来说确实是新的,因此他们会遵守你的礼貌请求,使用特定于该分支的一个提交创建新分支。
(那个提交指向旧分支上的所有旧提交,所以这些提交现在都在两个分支上,在你的Git存储库和远程存储库中都有。)
第二次推送,使用-f--force,告诉你的Git再次调用另一个Git,并且告诉它(而不是礼貌地请求),将它的oldbranch移回到你移动回去的位置。
我们必须强制进行此推送,因为他们通常会拒绝更礼貌的请求,因为那样会丢失新的提交。但是你想要丢弃旧分支中的提交。
(如果其他人在远程上共享您的分支,则此步骤略有危险,因为您正在告诉他们的Git丢弃所有新提交,包括其他共享者可能推送的任何提交。)

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