有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上我收到了文件被删除的状态。
处理这种情况的简单工作流程是什么?
答案 0 :(得分:5)
可能造成的混淆是这样的:假设您在A master
的提交中添加了大量文件,并将其推送到B的master
。然后,如果您更改到存储库B
的工作树并运行git status
,则会说您刚刚添加的所有文件都已删除。当然,它们还没有删除 - 你刚刚更新了当前分支和工作树,而没有触及索引。我觉得这对很多人来说都很混乱! (这也是消息通过“查看已还原的更改”的含义 - 从git状态看起来好像您已经恢复了刚刚推送的提交,只是因为工作树和索引现在位于分支后面。)< / p>
在这种情况下,如果您在推入主分支之前确定 B中的git status
是干净的,则可以重置工作树和索引以匹配新的git reset --hard
分支的位置。
然而,如果您在B中有未提交或未分阶段的更改,则会突然变得更加混乱,因为这些真正的更改很难从推动的“更改”中分辨出来 - 这可能非常困难。
所以,如果你了解发生了什么,并且你很乐意处理这种情况,那就没关系。就个人而言,我几乎总是试图通过以下方式之一来避免它:
我猜你前两个中的一个是你想要的。
答案 1 :(得分:2)
您收到错误消息是因为您进入了非裸存储库;有关详细信息,请参阅the Git FAQ。简短的解决方案是:不要推入带有工作目录的git存储库;但是使用裸存储库作为中介。
当你进入分支时,git会更新分支以反映分支的新状态。它没有更新的是索引和工作目录(因为你可能在那里进行了更改,无论如何都无法从远程解决冲突)。
在您的示例中,这意味着以下内容:
关于数据丢失的问题:通过此推送,您不会丢失任何数据。但是,如果您的工作目录中有任何更改,则可能很难识别它们,因为git diff
现在显示针对分支的 new 状态的差异。因此,一些更改是真正的更改,仅显示一些更改,因为结帐从未更新到当前版本
答案 2 :(得分:1)
我认为问题是您的远程存储库'A'也在主分支中工作。如果你在同一个分支中推送新的更改,git会感到困惑。 您有两个选择:
将A存储库重新创建为'bare':git init --bare
结帐A中的另一个分支(git checkout another_branch),然后尝试再次从B
答案 3 :(得分:1)
machineB
已somebranch
已签出,您正在将somebranch
的更改从machineA
推送到machineB
,而不更新{{1}工作副本或索引。在machineB
上签出的树在您推送的所有更改之前仍将处于点。
现在,如果你转到machineB
并进行更改并提交而不首先执行machineB
,那么这些更改将形成一个新的提交,其中不包括您所做的所有更改在git reset --hard
和machineA
上会有所不同。如果您没有提交somebranch
,那么差异应显示您在git diff somebranch
上machineA
撤消所做的所有更改,因为您的结帐不在分公司的负责人。