如何将文件修改限制在Git中的单个分支

时间:2012-02-03 21:59:34

标签: git

我开始学习Git,不时阅读ProGit书。我听说Git最强大的功能是分支,所以我试着用它们。我正在攻击KDE项目,因此有一个远程服务器和一个本地副本。

所以这是我的情况。我编写了一个错误修正程序,但负责该代码区域的开发人员已经脱机而没有给我一个发货,所以我决定在此期间做一个不同的修复。我听说分支可以(更重要的是,应该)用于这种情况。好的,我创建了一个本地分支

git branch bugfix

然后切换到那个分支

git checkout bugfix

广告然后发现我修改了原始修复程序的文件仍然被修改。 (当然,我需要一个干净的目录才能在没有第一个错误的情况下推送第二个错误修复。)好吧,没问题,我想,如果这是git status告诉我要做的那就让我重置一下。我做了重置,确实得到了一个干净的目录。但是,嘿,我换回主人后

git checkout master

修改过的文件不再修改了!这是一个干净的目录。

现在分支有什么意义?不能有两个版本的文件,在一个分支中修改而在另一个分支中不修改?我知道git stash,但如果我这样做,那么取消更改将会破坏第二个错误修复,因为IIRC存储只是将一个文件替换为另一个文件,不进行合并。

我在这里做错了什么?为什么不能在一个分支中修改文件而在另一个分支中不修改?

3 个答案:

答案 0 :(得分:5)

所以,这就是发生的事情。您从最初的开发人员开始提交A.你修复了一些错误,现在你已经在B.有一个远程分支指向一个名为origin/original-branch的A,并且有一个指向B的本地分支叫my-changes。我不知道它们实际上被称为什么(使用git branch -a列出它们)。

....->  A  ->  B
        ^      ^
        |      +-- my-changes
        |
        +-- origin/original-branch

如果你在B上并且你做了一个分支并开始做出改变,你就会得到这个:

....->  A  ->  B  ->  C
        ^      ^      ^
        |      |      +-- bugfix
        |      |
        |      +-- my-changes
        |
        +-- origin/original-branch

这不是你想要的。你想要这个:

               +-- my-changes
               v
....->  A  ->  B
         \
           ->  C
        ^      ^
        |      +-- bugfix
        |
        +-- origin/original-branch

所以你必须让你的新分支从其他开发人员的分支开始。

git branch bugfix origin/original-branch
git checkout bugfix

指定新分支从其他开发人员的工作开始。如果你这样做:

git branch bugfix # not what you want

这将导致bugfix分支从您现在的任何地方开始。

答案 1 :(得分:0)

您必须将文件提交到分支上,以便它们位于该分支上。

在您的情况下,您对某些文件进行了一些修改,但没有将它们提交到任何分支。

你可以做的是:

  1. git checkout -b bugfix
  2. git commit -am "Fixed some bugs"
  3. git checkout master
  4. git checkout -b bugfixtwo
  5. 此时,您的原创作品将在主人身上,您的第一个更改将是错误修正,您将准备好在bugfixtwo上做新工作
  6. git checkout -b bugFix一步创建并检出分支。

答案 2 :(得分:0)

为了“记住”分支上的已更改文件,您需要提交更改(添加,删除或修改的文件):git commit -a(-a参数代表“所有更改”)但是您肯定需要了解git分支。 This book非常有用。