8

我只是想澄清在特定分支上的提交是如何工作的。

假设我正在一个名为“Metro”的分支上工作。我对一些文件进行了一些更改,但我还没有准备好将它们推送到远程存储库。

有一个修补程序,我需要尽快修复。我需要切换到一个名为“Master”的干净分支,但我不能,因为我会覆盖我已更改的文件。我需要先提交这些,然后才能切换。

我的问题是,如果我在“Metro”分支上提交这些更改,然后切换到干净的“Master”分支,在“Metro”中所做的更改是否会被推送到远程“Master”存储库,因为我已经提交了它们,甚至虽然我推到另一个分支?

为了简洁起见,提交是否与分支隔离,或者在推送到远程仓库时是否添加了所有提交?

4

3 回答 3

3

在您将分支切换到 master 之前git checkout master,您必须先git commit -m 'some message',否则,git 会尝试将您当前分支的更改与您一起带到 master 分支。

“Metro”中所做的更改是否会因为我已经提交而被推送到远程“Master”仓库,即使我正在推送到另一个分支?

绝对不。Metro如果你告诉它这样做,git 只会将提交的更改从合并到 master。这是设计使然(注意:请阅读 git 遥控器,因为使用遥控器,您实际上可以将推送设置为“默认”执行此操作,在这种情况下您需要小心。)。

于 2013-02-27T17:20:23.787 回答
2

为了简洁起见,提交是否与分支隔离,或者在推送到远程仓库时是否添加了所有提交?

为了简洁起见:第一部分是的:-)。

从技术上讲,git 中的分支是一个提交链,以及一个名称。如果你推送一个分支,你将推送属于它的所有提交(除非远程仓库已经有它们),但没有别的。所以不,git 不会以某种方式推送所有提交。

但是请注意,您必须注意只推送您想要推送的分支 -git push可以配置为推送您的所有分支。为避免这种情况,请设置配置变量 push.default:

git config push.default current

这确保git push只会推送当前分支(而不是所有分支,这曾经是默认的)。

于 2013-02-27T17:23:30.933 回答
1

要了解分支在 Git 中是如何工作的,我认为改变思维方式以始终牢记提交树是很重要的。您有一个提交的非循环树,其中每个提交都有许多父提交,没有别的。分支现在只是指向该树中特定提交的简单指针。如果您对分支进行新提交,那么真正发生的事情就是您创建一个新的提交对象,其中包含以前版本作为其父版本的更改,并且您的分支指针移动到现在添加到整个树中的新提交.

所以,分支是完全相互独立的,同样地,它们并没有多大意义。它们只是指针。

在您的情况下,当您从 切换metro到 时master,您(可能)在树的另一侧进行操作。您现在创建的所有提交只会移动当前分支指针——master——但不会影响任何其他分支。

如果你推送一个分支,所有发生的事情就是你告诉远程分支指向的提交,然后你给远程它完成树所需的所有对象。

于 2013-02-27T17:23:20.067 回答