当我无法摆脱本地更改并且不丢失本地提交时,如何强制拉?

时间:2014-03-31 10:35:24

标签: git git-merge git-pull

我有以下情况:同事已经提交了一堆带有Windows行结尾的文件。我们有.gitattribute,可在commit期间删除Windows行结尾。

这意味着在pull之后,我有几十个被标记为"本地更改的文件"当他们不是。我无法检查它们,因为Git会将(损坏的)文件从repo中取出(它有Windows行结尾),修复行结尾以最终得到的文件总是不同于什么目前正在回购中。

团队的一名成员修复了这些文件并提交并推送了它们。

这个问题以丢失所有本地提交(即尚未推送的所有内容)为代价来回答我的问题:How do I force "git pull" to overwrite local files?

如何在不丢失本地提交的情况下拉

这是我在服务器上的Git回购:

A --> B --> BAD1 --> FIX1(HEAD)

BAD1包含错误提交,FIX1修复了它们。

这是我目前在磁盘上的内容:

A --> B --> BAD1 --> LC1 --> LC2(HEAD)
              \---> FIX1

我是git pull --rebase来到这里的。在那个命令之前,我有:

A --> B --> LC1 --> LC2(HEAD)

我最终想要的是:

A --> B --> BAD1 --> FIX1 --> LC1 --> LC2(HEAD)

1 个答案:

答案 0 :(得分:1)

您链接的答案类似于您需要做的事情。由于您的其他同事已修复了行结尾并推送了更改,您只需fetch来自原点的新更改,然后merge将其更改为您当地的工作,或rebase您当地的工作在他们之上工作:

git fetch <remote>
git checkout <local-branch>

# Merge changes
git merge <remote>/<remote-branch>

# Or rebase
git rebase <remote>/<remote-branch>

fetch永远不会覆盖您本地分支机构的工作,它只会更新您的远程跟踪分支机构。事实上,pull只是fetch后跟merge

更新

由于您的工作副本已经修改了文件(仅因为行结尾),我猜它会阻止您进行变基。所以你可以简单地清理你的工作副本,硬复位回到以前的良好状态,合并到固定的提交中,然后樱桃挑选你的本地提交(使用他们的sha ID)。

把它们放在一起,它看起来像这样:

git checkout -- .
git reset --hard B
git merge <remote> <branch>
git cherry-pick LC1 LC2

执行硬重置时,git不会立即删除任何提交。 Git会保留所有从分支或引用无法在一段时间内(默认为2周)到达的提交,最后从repo中垃圾收集它们。您可以通过运行git gc来启动早期垃圾收集,但显然您现在不希望在您的情况下执行此操作。

因为实际上没有任何提交被立即删除,所以你仍然可以使用它们的sha ID来引用它们,这就是为什么你可以在合并固定提交后将它们重新选择在你的分支之上。