【问题标题】:How to deal with locally modified files when pulling or fetching?拉取或抓取时如何处理本地修改的文件?
【发布时间】:2014-09-28 00:28:29
【问题描述】:

我有一个开源库的 GitHub 分支。在该 fork 的本地副本中,我修改了许多包含的 CMakeLists.txt(和其他文件),因此它不会编译整个库(因为有很多我不需要的东西)。因此,为了顺利整合我所做的更改

git update-index --assume-unchanged <files>

这样我就可以像没有更改任何这些文件一样使用 git。但是,每当遥控器发生更改并且我尝试拉取它们时(或者每当我想创建一个新分支时),我都会收到以下错误:

error: Your local changes to the following files would be overwritten by merge:
    CMakeLists.txt
    demos/CMakeLists.txt
    <other files>
Please, commit your changes or stash them before you can merge.
Aborting

所以我必须手动撤消所有更改,git update-index --no-assume-unchanged &lt;files&gt;,拉动然后重做更改和update-index。这很痛苦,因为我几乎每天都必须这样做。

我在这里想要的是更新我的本地修改文件,如果它们有任何更改(实际上,它们不太可能被更改,因此发生冲突的可能性很低)但保留我所做的更改并保持 git 假设他们没有改变。

有没有更好的方法来做到这一点?

编辑:对不起,如果这已经被问过了。我一直在寻找它,但我无法找到针对我的具体案例的回复。谢谢!

【问题讨论】:

    标签: git github


    【解决方案1】:

    你需要使用这个非常晦涩的命令 - git commit ;)

    说真的,只需提交您的工作,然后让 pull + rebase/merge 处理所有事情。

    想象一下,你在上游之前有 2 次提交,就像这样

    上游

    git reset HEAD~1 - 将“取消提交”您最近的提交,以便您可以只推送您的第一个提交。

    交替

    git push HEAD~1:UPSTREAM - 将完成同样的工作,但让你的工作继续完成。

    或者你可以说git branch PUSH_ME HEAD~1 然后git push PUSH_ME:UPSTREAM

    这里没有尽头的选择。您唯一需要做的就是在您工作时提交您的更改,以便您可以正确地提取/合并内容。

    【讨论】:

    • 我想你不明白我的问题。错误中的那些文件在 --assume-unchanged 下,所以我不想提交它们。
    • 对,你可以正常“git add”它们并提交它们。你永远不想只在你的工作目录中存储更改,这违背了 Git 的全部目的。
    • 您的意思是正常提交​​它们而忘记更新索引之类的东西?那么如果我想做一个拉取请求呢?我将不得不删除所有这些更改。
    • git 为您提供了多种选择。您可以将更改保留为您最近的提交,然后 git push HEAD~1,或者您可以使用 git reset HEAD~1 和 git push 通常退出提交,或者您可以将分支应用到您想要共享的点并推送它.
    • 我仍然认为或者我不理解你或者你不理解我。这不是我想要重置的提交或其他什么。我在本地克隆了 fork,我正在处理它,但由于我不想编译所有库,所以我修改了一些文件(例如,不编译所有演示)。然后我将更改推送到我的 fork,然后是 pull request。我想要这只是重要的变化。我为开发所做的那些更改我不希望它们被提交和推送,但我希望将它们保留在本地,因此每当我继续工作时,我都不必重做这些更改。
    【解决方案2】:

    如果文件未包含在存储库中,则应将它们包含在 .gitignore 中,而不是应用 --assume-unchanged。是这样吗?

    【讨论】:

    • 事实并非如此。关键是我有一个 CMakeLists.txt 可以编译例如 5 个演示,我只想编译其中一个,因为其他的不相关。然后我在 CMakeLists.txt 中评论这些行,假设不变,做工作,提交,推送,拉取请求。很顺利,CMakeLists.txt 中的更改由于假设未更改而未提交。但是现在,我想在从远程更新本地副本时保留这些更改(因为我修改的那些文件通常不会被修改)。
    【解决方案3】:

    我正在回答这个问题,因为它会更清楚。

    首先,我做了所有我不想推送的更改并提交了它们,假设这个提交是 SHA1。然后进行其余的更改并使用 SHA2 提交。

    现在,我的仓库看起来像这样:master &lt;- SHA1 &lt;- SHA2 我需要推送 SHA2 而不是推送 SHA1。如果我执行 `git push origin SHA2:master,SHA1 将被提交,SHA2 依赖于它。

    但是,执行git rebase -i 会显示以下内容:

    pick SHA1 comment1 pick SHA2 comment2

    所以我改变了这些提交的顺序:

    pick SHA2 comment2 pick SHA1 comment1

    现在 SHA2 不再依赖于 SHA1。做git push origin SHA2:master只会推送SHA2的变化。

    最后,如果上游发生一些变化,做git pull会顺利进行。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 2019-04-23
      • 2014-06-20
      • 2018-10-12
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2021-03-14
      相关资源
      最近更新 更多