35

基本问题,但这一直发生在我身上:

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

然后我回来想别的东西并开始做一些改变......虽然还在主人身上。

有什么简单的方法:

  1. 防止对 master 进行直接编辑(可能是警告)
  2. 将所有编辑移至working-branch并清除master,以便我可以继续编辑working-branch
  3. 将编辑旋转到一个全新的分支new-working-branch然后丢弃working-branch

冒险尝试在本页“分支”部分的后半部分进行推荐,但这只是抹去了我所有的编辑!?!也许是因为两个分支上的 aftergit branch dubious-experimentgit checkout masterthe是相同的(在 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>
4

6 回答 6

37

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

如果是,这是您的答案:

如何防止直接编辑母版

您需要在编辑器中进行设置,但这可能会很困难。在提示符和编辑器中显示当前分支有很大帮助。

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

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

由于您尚未向 master 提交任何内容,因此您无需更改 master 上的任何内容。如果您愿意,现在可以丢弃您的工作分支。

如何将更改移至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
于 2013-01-24T23:03:58.963 回答
11

如果您已经将更改提交到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.
于 2013-01-24T18:07:55.147 回答
0

我用于类似的情况:

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

或者

git checkout -B <branch-name>

.

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

于 2013-01-24T17:16:43.493 回答
0

我一般推荐以下 Git 设置:

git config push.default nothing

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

于 2013-01-24T17:20:06.820 回答
-1

养成$ git status在实际执行会修改某些内容的 git 命令之前输入的习惯。

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

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

 $ git checkout --patch master <somefile>

如果您只是要将同一个文件与它合并,您实际上不必重置 master ,但由于大概您还没有推送任何内容,您应该重置到您的远程跟踪分支......

$ git reset master origin/master
$ git reset stage origin/stage # whatever
于 2013-01-24T17:18:12.427 回答
-1

1.防止直接编辑master(可能警告)

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

[user@host directory:git_branch]

我还为 git_branch 条目着色,所以很明显我一直在做什么。 Stack Overflow 上的这 两个链接应该有助于您的提示。

2. 将所有编辑移至工作分支并清除母版,以便我可以继续在工作分支上进行编辑

或者

3. 将编辑旋转到一个全新的分支 new-working-branch 然后丢弃 working-branch?

这些实际上是同一个问题 - 如何将更改从 master 移到分支上,无论是旧分支还是新分支。而你自己的答案是正确的。尽管乍一看,假设您在 master 上,您可以更简单地运行:

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,蓝色的分支,白色的提交消息,绿色的作者和日期。当然,这可以根据自己的喜好进行修改。

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

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

回应以下评论:

从...开始

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 master这与git branch new_branch您已经在 master 上一样。我编辑了上面的答案以反映这一点。

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

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

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

于 2013-01-24T18:07:09.003 回答