【发布时间】:2011-07-22 00:52:38
【问题描述】:
我对在 git 中分支的好处有点困惑。
如果我创建了一个分支,比如 b1 并切换到这个分支,那么如果我切换回 master 分支,我所做的任何更改都是可见的。
在 master 分支中执行 git status 会显示来自 b1 分支的更改。
我知道需要先在 b1 中提交更改,但是如何管理多个分支而不意外地从另一个分支提交更改?
【问题讨论】:
标签: git
我对在 git 中分支的好处有点困惑。
如果我创建了一个分支,比如 b1 并切换到这个分支,那么如果我切换回 master 分支,我所做的任何更改都是可见的。
在 master 分支中执行 git status 会显示来自 b1 分支的更改。
我知道需要先在 b1 中提交更改,但是如何管理多个分支而不意外地从另一个分支提交更改?
【问题讨论】:
标签: git
如果你在命令行中使用 git,最好将当前分支写入 bash 提示符,例如
http://railstips.org/blog/archives/2009/02/02/bedazzle-your-bash-prompt-with-git-info/
这样你就不必一直输入“git branch”来知道你现在正在提交哪个分支。
【讨论】:
如果您在切换到 master 后立即注意到您忘记暂存或提交一些更改,您当然可以立即使用 git checkout b1 切换回来,然后提交它们。
但是,您是对的,在错误的分支上提交更改非常容易。幸运的是,git 的分支非常轻量级——它们只是指向提交图中分支尖端的指针——而且 git 有很好的工具来重写历史,使其看起来像你想要的那样。您需要做什么取决于您所做的事情的顺序,但是 Stack Overflow 上有 很多 的问题可以解决这个问题。 (或者如果不清楚,你可以问一个新的。)这是一个简单的例子:
...或者如果您在 master 上做了很多提交,但您突然意识到这太有争议了,并且应该在一个新的主题分支上,您可以执行以下操作:
# Check that git status is clean and you really are on the master branch:
git status
# Create a branch based on your current position:
git branch controversial
# Move master back to the last non-controversial commit, making
# sure that the working tree and index match:
git reset --hard <NON-CONTROVERSIAL-COMMIT>
如果您现有的分支 b1 上已经有很多提交,那么您可以从 master 中挑选:
# Switch back to `b1`:
git checkout b1
# Cherry-pick the commits that you'd rather were on b1:
git cherry-pick <CONTROVERSIAL-COMMIT-A>
git cherry-pick <CONTROVERSIAL-COMMIT-B>
# Switch back to `master`:
git checkout master
# Reset master back to the last non-controversial commit, making
# sure that the working tree and index match:
git reset --hard <NON-CONTROVERSIAL-COMMIT>
...如果您在 master 上有 lots 的提交应该在 b1 上,您可以使用 git rebase。
简而言之,从这种情况中恢复过来很容易 - 您只需了解提交图在您所在的位置是什么样的,以及您希望它是什么样的。
【讨论】: