【问题标题】:Understanding git branching and staging files了解 git 分支和暂存文件
【发布时间】:2011-07-22 00:52:38
【问题描述】:

我对在 git 中分支的好处有点困惑。

如果我创建了一个分支,比如 b1 并切换到这个分支,那么如果我切换回 master 分支,我所做的任何更改都是可见的。

在 master 分支中执行 git status 会显示来自 b1 分支的更改。

我知道需要先在 b1 中提交更改,但是如何管理多个分支而不意外地从另一个分支提交更改?

【问题讨论】:

标签: git


【解决方案1】:

如果你在命令行中使用 git,最好将当前分支写入 bash 提示符,例如

http://railstips.org/blog/archives/2009/02/02/bedazzle-your-bash-prompt-with-git-info/

这样你就不必一直输入“git branch”来知道你现在正在提交哪个分支。

【讨论】:

    【解决方案2】:

    如果您在切换到 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

    简而言之,从这种情况中恢复过来很容易 - 您只需了解提交图在您所在的位置是什么样的,以及您希望它是什么样的。

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 2016-07-23
      • 2019-05-06
      • 1970-01-01
      • 2017-09-05
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多