"would be overwritten by merge" 是什么意思?
What does "would be overwritten by merge" mean?
从基于团队的 Git 远程存储库中提取时,我收到此消息:
"C:\Program Files (x86)\Git\bin\git.exe" pull --progress "origin" +refs/heads/master:refs/remotes/origin/master
Updating 71089d7..4c66e71
error: Your local changes to the following files would be overwritten by merge:
Source/Reporting/Common/Common.Dal.csproj
Please, commit your changes or stash them before you can merge.
Aborting
Done
Git 中的什么规则(或功能)确保我在工作目录中修改的文件 不会 被拉取覆盖?
也就是说,在什么情况下会被pull覆盖?或者...我需要做什么来强制拉取覆盖我刚刚修改的文件?
该消息表示您对文件进行了本地修改,但尚未提交。当 运行 pull
时,工作树中的文件从远程存储库更新。如果 git 发现文件被您修改并提交并在远程存储库中,它将简单地尝试合并更改并更新索引和工作树。但是对于只有本地修改的文件还没有提交,它会停止。
因此您必须先 commit
更改或 stash
按照消息中的建议进行更改。没有办法避免它,因为它会导致索引和工作树不一致。
保留本地更改的典型情况是(如 git help stash
中给出):
git pull # first attempt of pull
...
# Here you see the complains about locally modified files
git stash # will save your changes into stash
git pull # pull now succeeds as there are no locally modified files
git stash pop # pop the stash and apply the changes
正如消息所示,您对文件进行了一些更改,但没有将这些更改提交到您的存储库。其他人对同一个文件进行了更改,当您尝试从远程存储库中提取最新修订版时,由于被其他人的更改覆盖,您将丢失对文件所做的任何本地更改。
如果您想保留所做的更改,请在拉取之前将您的更改提交到存储库,然后尝试合并:git merge origin/master
。如果您不关心这些更改,可以丢弃它们:git stash drop
.
更新:
回答关于在不提交到存储库的情况下将更改保留在本地的问题...
只需存储您更改的所有内容,提取所有新内容,然后弹出您的存储,即
git stash
git pull
git stash pop
请注意,在这种情况下,在 stash pop 上会有冲突(消息已经说得很清楚了)。
如果你知道你想要的就是你存放的东西,即你的本地更改,那么解决冲突就很容易。你只需使用
git checkout --theirs -- Common.Dal.csproj
什么规则会产生 "would be overwritten" 警告?
如果您修改了一个文件,该文件在远程存储库中也有修改但尚未提交。
什么规则可以避免 "would be overwritten" 警告?
如果远程仓库中没有未提交的文件也有修改。
我需要做什么...
这取决于你真正想要什么:
您想强制拉取覆盖文件
显然,如果你真的想要这个,你不会关心你刚刚所做的更改,也不介意删除它们。如果是这样,您只需这样做:
git reset --hard
git pull
您想要您的更改和来自拉取的更改
在我看来,处理此问题的最简单方法是提交您的更改,然后拉取。然后,如果存在合并冲突,请使用通常的机制来解决合并(提示:配置您的 difftool 和 mergetool,以便您可以使用 meld 或 diffmerge 等 GUI 工具轻松解决冲突)。只要做:
git add $the_affected_file
git commit
git pull
您想要这两项更改,但还没有准备好提交
就我个人而言,我认为您不应该准备好做出承诺。但有时会发生这样的情况,即您正在调试的代码部分损坏,而您真的不想提交。在这种情况下,您可以暂时存储更改,然后在拉取后取消存储:
git stash
git pull
git stash pop
如果在弹出存储后有冲突,则以通常的方式解决它们。注意:如果您还没有准备好因冲突而丢失隐藏的代码,您可能想要执行 git stash apply
而不是 pop
。
从基于团队的 Git 远程存储库中提取时,我收到此消息:
"C:\Program Files (x86)\Git\bin\git.exe" pull --progress "origin" +refs/heads/master:refs/remotes/origin/master
Updating 71089d7..4c66e71
error: Your local changes to the following files would be overwritten by merge:
Source/Reporting/Common/Common.Dal.csproj
Please, commit your changes or stash them before you can merge.
Aborting
Done
Git 中的什么规则(或功能)确保我在工作目录中修改的文件 不会 被拉取覆盖?
也就是说,在什么情况下会被pull覆盖?或者...我需要做什么来强制拉取覆盖我刚刚修改的文件?
该消息表示您对文件进行了本地修改,但尚未提交。当 运行 pull
时,工作树中的文件从远程存储库更新。如果 git 发现文件被您修改并提交并在远程存储库中,它将简单地尝试合并更改并更新索引和工作树。但是对于只有本地修改的文件还没有提交,它会停止。
因此您必须先 commit
更改或 stash
按照消息中的建议进行更改。没有办法避免它,因为它会导致索引和工作树不一致。
保留本地更改的典型情况是(如 git help stash
中给出):
git pull # first attempt of pull
...
# Here you see the complains about locally modified files
git stash # will save your changes into stash
git pull # pull now succeeds as there are no locally modified files
git stash pop # pop the stash and apply the changes
正如消息所示,您对文件进行了一些更改,但没有将这些更改提交到您的存储库。其他人对同一个文件进行了更改,当您尝试从远程存储库中提取最新修订版时,由于被其他人的更改覆盖,您将丢失对文件所做的任何本地更改。
如果您想保留所做的更改,请在拉取之前将您的更改提交到存储库,然后尝试合并:git merge origin/master
。如果您不关心这些更改,可以丢弃它们:git stash drop
.
更新:
回答关于在不提交到存储库的情况下将更改保留在本地的问题...
只需存储您更改的所有内容,提取所有新内容,然后弹出您的存储,即
git stash
git pull
git stash pop
请注意,在这种情况下,在 stash pop 上会有冲突(消息已经说得很清楚了)。
如果你知道你想要的就是你存放的东西,即你的本地更改,那么解决冲突就很容易。你只需使用
git checkout --theirs -- Common.Dal.csproj
什么规则会产生 "would be overwritten" 警告?
如果您修改了一个文件,该文件在远程存储库中也有修改但尚未提交。
什么规则可以避免 "would be overwritten" 警告?
如果远程仓库中没有未提交的文件也有修改。
我需要做什么...
这取决于你真正想要什么:
您想强制拉取覆盖文件
显然,如果你真的想要这个,你不会关心你刚刚所做的更改,也不介意删除它们。如果是这样,您只需这样做:
git reset --hard git pull
您想要您的更改和来自拉取的更改
在我看来,处理此问题的最简单方法是提交您的更改,然后拉取。然后,如果存在合并冲突,请使用通常的机制来解决合并(提示:配置您的 difftool 和 mergetool,以便您可以使用 meld 或 diffmerge 等 GUI 工具轻松解决冲突)。只要做:
git add $the_affected_file git commit git pull
您想要这两项更改,但还没有准备好提交
就我个人而言,我认为您不应该准备好做出承诺。但有时会发生这样的情况,即您正在调试的代码部分损坏,而您真的不想提交。在这种情况下,您可以暂时存储更改,然后在拉取后取消存储:
git stash git pull git stash pop
如果在弹出存储后有冲突,则以通常的方式解决它们。注意:如果您还没有准备好因冲突而丢失隐藏的代码,您可能想要执行
git stash apply
而不是pop
。