Git:从主分支移动更改

时间:2013-01-24 17:12:38

标签: git git-branch master

基本问题但这种情况一直发生在我身上:

  • working-branch
  • 中进行更改
  • 切换到master
  • git merge working-branch
  • git push
  • cap deploy(进行分期)
  • 制作一杯新茶

然后我回过头来想想别的东西,然后开始做一些改变......同时还在掌握。

这是一个简单的方法:

  1. 阻止对主人的直接编辑(可能是警告)
  2. 将所有修改移至working-branch并清除master,以便继续编辑working-branch
  3. 将编辑内容转换为全新的分支new-working-branch,然后丢弃working-branch
  4. this page的“分支”部分的后半部分冒了一个风险并尝试了推荐,但这只是消除了我的所有编辑!?!也许是因为在git branch dubious-experimentgit checkout master之后,两个分支上的git status是相同的(主人不是'干净')。所以git reset --hard <SHA1sum>消除了两者的所有变化!?!

      git branch dubious-experiment
    
      M---N-----O----P---Q ("master" and "dubious-experiment")
    
      git checkout master
    
      # Be careful with this next command: make sure "git status" is
      # clean, you're definitely on "master" and the
      # "dubious-experiment" branch has the commits you were working
      # on first...
    
      git reset --hard <SHA1sum of commit N>
    

6 个答案:

答案 0 :(得分:28)

根据您的描述,我假设您尚未提交任何更改 - 这是正确的吗?

如果是,请回答:

如何防止直接编辑到主人

您需要在编辑器中设置它,但这可能很难。在您的提示和编辑器中显示当前分支有很多帮助。

如何将更改移动到新分支new-working-branch,然后放弃working-branch

git checkout -b new-working-branch
git add …
git commit -m "mycommit" 

由于你还没有提交任何东西,你不需要改变主人的任何东西。如果您愿意,现在可以丢弃您的工作分支。

如何将更改移至working-branch

git checkout -b temp-branch
git add …
git commit -m "mycommit" 
git rebase --onto working-branch master
git checkout working-branch
git reset --hard temp-branch
git branch -d temp-branch

如果您的更改不与master上的任何更改冲突,但不会与工作分支中的更改冲突,则可以更简单地完成此操作:

git stash
git checkout working-branch
git stash pop

答案 1 :(得分:6)

如果您已将更改提交至master,但未将其推送到任何地方......

为最后的更改创建一个新分支

git checkout -b newfeat master

重播working-branch分支

之上的所有更改(移动提交)
git rebase --onto working-branch origin/master newfeat

更改为master分支并将其重置为上次推送的状态

git checkout master
git reset --hard origin/master

此时你有:

  • master指向上次推送的提交(origin/master
  • working-branch从未改变
  • 包含所有新提交的新newfeat分支,位于working-branch之前。

答案 2 :(得分:0)

我用于类似的情况:

git branch -f <branch-name>
git checkout <branch-name>

git checkout -B <branch-name>

两个变体都将分支branch-name移动到您当前的提交中,而不需要重新设置树。

答案 3 :(得分:0)

我通常建议使用以下Git设置:

git config push.default nothing

有了这个,你至少必须在推动时命名分支。它不会阻止你在本地提交master,但是当你意识到你拥有时,你可以将这些提交移动到一个分支而不会影响其他任何人。

答案 4 :(得分:-1)

养成在实际执行git命令之前键入$ git status的习惯。

鉴于此,您可能已经编辑了文件但未将其签入,因为您将在提交之前运行git status。在这种情况下,如果你只是切换分支然后提交,那么git会做正确的事。

如果你已经向master发起了一次提交,那么只需在分支之间移动文件,如下所示:

 $ git checkout --patch master <somefile>

如果您只是要将相同的文件与它合并,那么你真的不需要重置master,但是因为你可能还没有推动任何东西,所以你应该重置为你的远程跟踪分支......

$ git reset master origin/master
$ git reset stage origin/stage # whatever

答案 5 :(得分:-1)

<强> 1。阻止对主人的直接编辑(可能是警告)

你不是唯一想要这个的人。我遇到的最好的想法是将git分支直接放在shell提示符中。我的提示符如下:

[user@host directory:git_branch]

我也为git_branch条目着色,所以我在任何时候都在努力。 Stack Overflow上的These two链接可以帮助您提示。

<强> 2。将所有编辑内容移动到工作分支并清除主页,以便我可以继续编辑工作分支

第3。将编辑旋转到一个全新的分支新工作分支,然后丢弃工作分支?

这些都是同样的问题 - 如何将主变更移到分支上,无论是旧分支还是新分支。而你自己的答案是正确的。虽然乍一看,假设你是主人,你可以更简单地运行:

git branch new_branch
git reset --hard origin/master

我更喜欢将master重置为origin / master而不是担心特定的提交SHA。但你的步骤基本上是正确的。至于为什么你丢失了更改,我必须认为在重置master时错误地没有指向Q的分支指针。没有其他解释是有道理的。再次,拥有分支shell提示符将有助于避免这些错误。此外,我很喜欢使用gitk或git log --graph来验证我的分支在我移动它们之前的位置。由于我无法在工作中轻松使用gitk,因此我的.gitconfig中有一个名为“graph”的别名,它本质上是它的命令行版本:

[alias]
    graph = log --graph --all --date=short --pretty=format':%C(yellow)%h%Cblue%d%Creset %s %Cgreen %aN, %ad%Creset'

这将显示最左侧的图形,黄色的提交SHA,蓝色的分支,白色的提交消息,以及作者&amp;绿色的日期。当然,这可以根据自己的喜好进行修改。

[编辑使上述命令更简单]

==============================

回应以下评论:

开始
A-B < origin/master
   \
    C-D < master

现在执行git checkout -b new_branch

A-B < origin/master
   \
    C-D < master, new_branch

现在结帐主人,git checkout master。请注意,如果您已经在主人身上,git checkout -b new_branch && git checkout mastergit branch new_branch相同。我编辑了上面的答案以反映这一点。

现在将master重置为origin / master,git reset --hard origin/master

A-B < master, origin/master
   \
    C-D < new_branch

因为您有一个指向D的分支(new_branch),所以不会丢失任何更改。如果我犯了错误,请详细说明。