我有一个我用来编译的Android源代码树的工作副本。我想同步repo中的最新更改(他们已经完成的任何新事物),但是我收到错误
"You have local changes to 'kernel'; cannot switch branches."
"You have local changes to 'products/common.mk; cannot switch branches."
然后我在假设结束时出现2个错误(之后似乎又做了一行树同步)。
所以,我的问题是,如何在我本地更改的内容之间同步他们的更改? 我无法做出改变,因为我不是该项目的贡献者,我希望将我的更改保留在本地。
答案 0 :(得分:2)
您的问题实际上是git中常见的情况 - 使用git进行本地化更改。
使用git pull
时,只能获得本地git映像和远程git服务器之间的差异。无论何时进行本地更改,您都可以发出git diff
来查看差异。所以对你来说,你的步骤应该是:
git diff > mydiff.patch
获取您所做更改的补丁差异。git checkout -f
在您进行本地化更改之前恢复原始图片。git pull
从远程服务器执行完整的git更新。这也是repo sync
可以进入的地方 - 因为repo sync
基本上是一系列git命令(通过ps -ef
查看)然后您通过patch -p1 --dry-run < mydiff.patch
重新应用本地化更改以测试重新应用。如果成功,请通过以下方式进行真正的修补:
patch -p1 < mydiff.patch
如果不成功,它只表示您的更改与其他人已提交的远程服务器端所做的某些更改相冲突,这是您必须再次手动重做更改的地方 - 单调乏味但无选择。
请注意:git
可以应用于您看到.git
目录的每个目录,并且git命令仅在该目录级别生效。如果您使用.git
子目录在不同目录中进行了多项更改,那么您已为每个目录执行了git diff
和git checkout -f
。
例如,在进行repo sync
更新时,我得到了:
Fetching projects: 100% (172/172), done.
Syncing work tree: 2% (4/171) error: You have local changes to 'core/base_rules.mk'; cannot switch branches.
Syncing work tree: 3% (6/171) error: You have local changes to 'tools/dx-tests/Android.mk'; cannot switch branches.
Syncing work tree: 100% (171/171), done.
external/dbus/: discarding 43 commits
error: build/: platform/build checkout 0683a77348f2a0a529a8e2bcfdf4b6dc6b4c5f5b
error: cts/: platform/cts checkout a3779fa378345bfd8699e91de46b29563be4beb2
向下遍历,我发现在cts
目录下是.git
,因此cd cts
和git diff
会产生差异。
上述方案很简单,因为总是只有一个分支 - 主分支,并且您的更改始终在此之上。
或者你必须使用git branch
来构建自己的分支,然后git merge
将你的分支合并到默认的主分支中(阅读this)。
合并命令将为git merge topic
,其中topic
是使用git branch
创建的分支,用于存放您的自定义更改。
总体而言,操作仍然与上述相同 - 如果主设备和您的分支在同一行修改同一文件,或者您的修改在主设备之后发生,则会发生冲突。
答案 1 :(得分:0)
虽然我没有使用git
,而且我从咨询消息中假设您正在访问git repo,我相信该工具只是拒绝覆盖您的本地更改..这是一个很好的是的,对吗?我认为事情正如你希望的那样发生,除非你想在你的本地工作和最新的回购视图之间切换。
也许本指南(在SO上)Git for Beginners: The definitive practical guide可能会有所帮助。
答案 2 :(得分:0)
您可以使用其他分支进行更改...或尝试使用git pull --rebase