git:更新当前分支

时间:2011-03-22 15:44:13

标签: git version-control workflow dvcs

有2个git存储库,A和B

两者都只有一个主分支,并且都在本地检出并正在处理。

我从A推进B的主分支,我收到了这条消息:

warning: updating the current branch
warning: Updating the currently checked out branch may cause confusion,
warning: as the index and work tree do not reflect changes that are in HEAD.
warning: As a result, you may see the changes you just pushed into it
warning: reverted when you run 'git diff' over there, and you may want
warning: to run 'git reset --hard' before starting to work to recover.
warning: 
warning: You can set 'receive.denyCurrentBranch' configuration variable to
warning: 'refuse' in the remote repository to forbid pushing into its
warning: current branch.
warning: To allow pushing into the current branch, you can set it to 'ignore';
warning: but this is not recommended unless you arranged to update its work
warning: tree to match what you pushed in some other way.
warning: 
warning: To squelch this message, you can set it to 'warn'.
warning: 
warning: Note that the default will change in a future version of git
warning: to refuse updating the current branch unless you have the
warning: configuration variable set to either 'ignore' or 'warn'.

如果我在B的​​签出主分支上工作,我该如何更新它,所以我看到A的变化?

如果B上的主人本地结账也有未更改的内容,那该怎么办?

注意:我真的不明白上面的git消息。 “引起混淆”是否意味着,它是坏的并且可能导致数据丢失?或者它只是意味着它是一种不容易处理的情况,但我通常可以相信所有的变化都以某种方式保存,如果有必要我将能够解决冲突。 “看到变化后的变化”代表什么?是否会失去某些变化?

对于我作为外国人来说,这种语言不是很清楚。

编辑:我刚刚在A上添加了一个文件并将其推送到B.在B上我收到了文件被删除的状态。

处理这种情况的简单工作流程是什么?

4 个答案:

答案 0 :(得分:5)

可能造成的混淆是这样的:假设您在A master的提交中添加了大量文件,并将其推送到B的master。然后,如果您更改到存储库B的工作树并运行git status,则会说您刚刚添加的所有文件都已删除。当然,它们还没有删除 - 你刚刚更新了当前分支和工作树,而没有触及索引。我觉得这对很多人来说都很混乱! (这也是消息通过“查看已还原的更改”的含义 - 从git状态看起来好像您已经恢复了刚刚推送的提交,只是因为工作树和索引现在位于分支后面。)< / p>

在这种情况下,如果您在推入主分支之前确定 B中的git status是干净的,则可以重置工作树和索引以匹配新的git reset --hard分支的位置。

然而,如果您在B中有未提交或未分阶段的更改,则会突然变得更加混乱,因为这些真正的更改很难从推动的“更改”中分辨出来 - 这可能非常困难。

所以,如果你了解发生了什么,并且你很乐意处理这种情况,那就没关系。就个人而言,我几乎总是试图通过以下方式之一来避免它:

  • 改为从A拉到B
  • 从A推送到裸仓库,然后从B
  • 拉出
  • 直接从A推送到B中的另一个参考,作为explained in this git FAQ entry,并从该参考中合并

我猜你前两个中的一个是你想要的。

答案 1 :(得分:2)

您收到错误消息是因为您进入了非裸存储库;有关详细信息,请参阅the Git FAQ。简短的解决方案是:不要推入带有工作目录的git存储库;但是使用裸存储库作为中介。

当你进入分支时,git会更新分支以反映分支的新状态。它没有更新的是索引和工作目录(因为你可能在那里进行了更改,无论如何都无法从远程解决冲突)。

在您的示例中,这意味着以下内容:

  • 最初,A和B具有相同的主分支
  • 您在A的主分支中添加文件F,提交此更改并将其推送到B的主分支
  • 现在,B的主分支(目前已检出)包含F.但由于git没有触及B的工作目录,因此不存在F
  • 因此,在B中,git将文件F报告为已删除:它存在于HEAD提交中,但不存在于工作目录中。

关于数据丢失的问题:通过此推送,您不会丢失任何数据。但是,如果您的工作目录中有任何更改,则可能很难识别它们,因为git diff现在显示针对分支的 new 状态的差异。因此,一些更改是真正的更改,仅显示一些更改,因为结帐从未更新到当前版本

答案 2 :(得分:1)

我认为问题是您的远程存储库'A'也在主分支中工作。如果你在同一个分支中推送新的更改,git会感到困惑。 您有两个选择:

  • 将A存储库重新创建为'bare':git init --bare

  • 结帐A中的另一个分支(git checkout another_branch),然后尝试再次从B

答案 3 :(得分:1)

machineBsomebranch已签出,您正在将somebranch的更改从machineA推送到machineB而不更新{{1}工作副本或索引。在machineB上签出的树在您推送的所有更改之前仍将处于点。

现在,如果你转到machineB并进行更改并提交而不首先执行machineB,那么这些更改将形成一个新的提交,其中不包括您所做的所有更改在git reset --hard machineA上会有所不同。如果您没有提交somebranch,那么差异应显示您在git diff somebranchmachineA 撤消所做的所有更改,因为您的结帐不在分公司的负责人。