你的问题其实是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 创建的分支,用于存放您的自定义更改。
总体上操作还是和上面一样——如果master和你的分支在同一行修改同一个文件,或者你的修改在master之后,就会发生冲突。