Git: 合并两个工作副本而不提交
Git: merge two working copies without committing
我有一个用于服务器开发的克隆,另一个用于客户端开发。两者 material 最终都会进入同一个分支,但我想同步它们并且我希望它执行合并 就像 我已经推送和拉取了提交,但是我想要没有那个。
我可以用我写的脚本打补丁:
git diff --cached
git diff
在服务器上,但将其应用于客户端要难得多。
我试过 Unix patch
命令,出于某种原因,它一直问我要修补哪些文件,就像我找不到它们一样。 (是的,他们在那里)我试过了
git apply -3 patch.patch
但这会产生很多错误,例如 "with conflicts"(未进行任何更改)和 "does not match index"。它甚至似乎没有尝试修补另一半文件。
存储,然后应用补丁,然后从存储中弹出是行不通的,因为取消存储拒绝合并。
看起来用out 拉动是行不通的——我还没有找到一种既方便又安全的方法。但是,我提交的问题是我不想向 git 日志发送垃圾邮件,例如:
Sync'ing to client
Sync'ing back to server
Oops! Sync'ing something I forgot to the server again!
等等
但是我可以通过提交然后从远程存储库中拉取来避免这一切。最后,我不必推送这些提交,因为我会使用重置将它们全部从本地存储库中删除,然后在工作目录中进行所有更改后,进行适当的提交并推送它。
Gotachas
很多。
- 众所周知,如果已经从中提取了某些内容,则不应重置本地存储库。这可能是由于当一个回购删除提交另一个回购认为存在时导致的明显混淆。因此,在两个存储库再次开始共享代码之前对它们执行相同的重置非常重要。
- 如果您在完成提交之后想要重置,那么 pull/merge,您可能会让事情变得非常困难。应该有办法管理,但我还没想好。一种想法是重新设置、存储、拉取、合并和再次提交。另一个涉及使用 -n 选项恢复。
说明
以下示例假设您有 2 个克隆;一个叫 "client",另一个叫 "server".
- 在 https://help.github.com/articles/adding-a-remote 之后,在彼此的系统上设置您的客户端和服务器的存储库,以便它们可以相互拉取。
- 当您想要同步时,只需在捐赠者系统上提交,然后从远程拉取而不是从源拉取。假设客户端想要来自服务器的提交。在客户端::
git pull myserver-repo mybranch
.
- 必要时合并并解决冲突。
- 根据需要循环回到 2。
- 在 2-4 的几次迭代之后,您到达了准备将更改推送到服务器的时刻。转到具有您要推送的所有更改的任何本地存储库,然后 运行
git log
。找到您在 2 中所做的第一个提交之前 的提交。将其哈希复制到剪贴板。
- 然后 git reset:
git reset <hash you copied in 5>
.
- 然后您应该会看到所有您不希望从日志中消失的提交以及其中的所有更改都在您的工作目录中。提交并推送。
- 对您没有执行 5-7 的存储库进行清理很重要。因此,如果您从服务器存储库推送,则需要在客户端执行相同的重置操作,然后根据需要放弃更改。我的首选方法是
git stash save "delete_me"
.
我有一个用于服务器开发的克隆,另一个用于客户端开发。两者 material 最终都会进入同一个分支,但我想同步它们并且我希望它执行合并 就像 我已经推送和拉取了提交,但是我想要没有那个。
我可以用我写的脚本打补丁:
git diff --cached
git diff
在服务器上,但将其应用于客户端要难得多。
我试过 Unix patch
命令,出于某种原因,它一直问我要修补哪些文件,就像我找不到它们一样。 (是的,他们在那里)我试过了
git apply -3 patch.patch
但这会产生很多错误,例如 "with conflicts"(未进行任何更改)和 "does not match index"。它甚至似乎没有尝试修补另一半文件。
存储,然后应用补丁,然后从存储中弹出是行不通的,因为取消存储拒绝合并。
看起来用out 拉动是行不通的——我还没有找到一种既方便又安全的方法。但是,我提交的问题是我不想向 git 日志发送垃圾邮件,例如:
Sync'ing to client
Sync'ing back to server
Oops! Sync'ing something I forgot to the server again!
等等
但是我可以通过提交然后从远程存储库中拉取来避免这一切。最后,我不必推送这些提交,因为我会使用重置将它们全部从本地存储库中删除,然后在工作目录中进行所有更改后,进行适当的提交并推送它。
Gotachas
很多。
- 众所周知,如果已经从中提取了某些内容,则不应重置本地存储库。这可能是由于当一个回购删除提交另一个回购认为存在时导致的明显混淆。因此,在两个存储库再次开始共享代码之前对它们执行相同的重置非常重要。
- 如果您在完成提交之后想要重置,那么 pull/merge,您可能会让事情变得非常困难。应该有办法管理,但我还没想好。一种想法是重新设置、存储、拉取、合并和再次提交。另一个涉及使用 -n 选项恢复。
说明
以下示例假设您有 2 个克隆;一个叫 "client",另一个叫 "server".
- 在 https://help.github.com/articles/adding-a-remote 之后,在彼此的系统上设置您的客户端和服务器的存储库,以便它们可以相互拉取。
- 当您想要同步时,只需在捐赠者系统上提交,然后从远程拉取而不是从源拉取。假设客户端想要来自服务器的提交。在客户端::
git pull myserver-repo mybranch
. - 必要时合并并解决冲突。
- 根据需要循环回到 2。
- 在 2-4 的几次迭代之后,您到达了准备将更改推送到服务器的时刻。转到具有您要推送的所有更改的任何本地存储库,然后 运行
git log
。找到您在 2 中所做的第一个提交之前 的提交。将其哈希复制到剪贴板。 - 然后 git reset:
git reset <hash you copied in 5>
. - 然后您应该会看到所有您不希望从日志中消失的提交以及其中的所有更改都在您的工作目录中。提交并推送。
- 对您没有执行 5-7 的存储库进行清理很重要。因此,如果您从服务器存储库推送,则需要在客户端执行相同的重置操作,然后根据需要放弃更改。我的首选方法是
git stash save "delete_me"
.