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

iks*_*nov 1 git

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

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

git branch bugfix
Run Code Online (Sandbox Code Playgroud)

然后切换到那个分支

git checkout bugfix
Run Code Online (Sandbox Code Playgroud)

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

git checkout master
Run Code Online (Sandbox Code Playgroud)

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

现在分支有什么意义?不能有两个版本的文件,在一个分支中修改而在另一个分支中不修改?我知道git stash,但如果我这样做,解开更改将杀死第二个错误修复,因为IIRC存储只是将一个文件替换为另一个文件,没有合并完成.

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

Die*_*Epp 5

所以,这就是发生的事情.您从最初的开发人员开始提交A. 你修复了一些bug,现在你已经在B.有一个指向A的远程分支被调用origin/original-branch,并且有一个指向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
Run Code Online (Sandbox Code Playgroud)

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

git branch bugfix # not what you want
Run Code Online (Sandbox Code Playgroud)

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