【问题标题】:Git fast forward replaces entire repo deleting previous historyGit 快进替换整个 repo 删除以前的历史记录
【发布时间】:2013-02-05 06:44:09
【问题描述】:

github上有一个名为A的repo。我从 github 将此 repo 克隆到我的本地。原始存储库 A 有一个名为“a”的分支,它是 A 的先前版本。存储库所有者的提交删除了历史记录并替换了存储库中的所有文件。在 github 上,如果你比较这两者,它会说,A and a are entirely different commit histories

我的问题是我想在一个同步的地方推送一个提交,这就像在所有者快速转发主分支之前的备份。但是,如果我在提交之前 git pull(这是一个很好的做法),我肯定会遇到问题,因为它根本不同步。

最好的解决方案是停止跟踪 master 所做的事情,并将其替换为我所知道的 not possible 分支。我应该怎么做才能删除快进提交并使其同步回“a”分支。

附:回购的所有者得到![rejected] master -> master (non-fast-forward),他试图做一个 git pull。说“他当前分支的尖端在其远程分支的后面”

如果任何部分不清楚,请随时询问,我连续2天遇到这个问题! 谢谢。

【问题讨论】:

    标签: git github git-branch fast-forward


    【解决方案1】:

    (如果您在某处隐藏了问题,我肯定找不到它。这是我根据猜测您试图问什么的答案:)

    我不知道你为什么认为在提交内容之前盲注git pull 是一种很好的做法。执行git fetch 后跟gitk master origin/master 肯定有助于了解当前状态。然后你通常要在git checkout master && git rebase origin/mastergit checkout master && git merge origin/master 之间做出选择。

    如果您的本地master 分支位于不应该出现的位置,请首先确保您没有未提交的更改,然后执行git checkout master && git reset --hard [sha1-of-the-commit-you-want]master 分支移动到您喜欢的任何位置。如果您想用新的正确状态覆盖origin 上的主分支,只需执行git push -f origin master。请注意,如果其他人从origin 中检查了旧的master,则需要重新调整所有提交以遵循您的新master。详情请见https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html#_recovering_from_upstream_rebase

    【讨论】:

    • git pull or fetch 我认为只是在本地副本中合并有所不同。会在您的上次提交和当前提交之间带来更改。所以我总是在 git push 之前使用 git fetch/pull。并且 git reset hard 没有显示提交,因为我没有执行 git pull,即上游 repo 上的提交。不过还是谢谢。
    • 我的意思是,在看到本地和远程分支(通常是视觉上的,但任何适合你的)之后,更容易决定是要合并还是变基。当然,如果你已经发布了本地分支,rebase 通常不是正确的选择。如果您更喜欢 pull 而不是 fetch 然后合并或变基,则必须在 pullpull --rebase 之间做出选择,除非您真的更喜欢在这里和那里合并。
    • 另外值得一提的是,通常最好的做法是将特征合并到 master 中,而不是将 origin/master 合并到当前的 HEAD 中(通常是某种特征)。实际上,如果您本地的master 包含新功能或类似的东西,请执行git checkout -b super-cool-ui && git co master && git reset --hard origin/master && git merge super-cool-ui && git push。也就是说,尝试使master 反映origin(或upstream)的当前或下一个master,并根据已完成的工作在标记的分支中进行所有新开发。谷歌git feature branch
    • 谢谢米科。你说 pull 比 fetch 好。我不太明白您在上述评论中试图表达的观点。在搜索功能分支nvie.com/posts/a-successful-git-branching-model 后,我从这里学到了一些东西
    • @MikkoRantalainen 即使在那种情况下,我也可能只做一个fetch,然后使用FETCH_HEAD
    【解决方案2】:

    我用一个简单的解决方案解决了这个问题。 1. 本地更改通过
    git commit -a -m 'temp'提交。
    2. 我创建了一个新分支,所有这些更改都反映在我的本地机器上。
    3. 在主分支上进行了结帐。
    git checkout master
    4. 在提交我的原始仓库后进行了强制推送。
    git push -f upstream master
    现在我的本地和原始仓库完全同步了。 附言由于强制推送会改变历史,因此会发出很多警告。所以请谨慎使用。

    【讨论】:

    • 您能详细说明您的解决方案吗?在你做了checkout master 之后分支temp 发生了什么?我看到您的远程存储库被称为upstream 而不是origin(我在回答中使用了它)。
    • temp 只是当前未发表作品的快照。我将它提交到 master 分支,然后制作了 master 分支的副本。在此之后切换回新分支并重置 head 以忽略此提交。我希望我比我的问题更清楚;)
    • temp 是一个分支。但是,我无法理解您所说的“我在主分支上提交”是什么意思,因为不能commit 一个分支到另一个分支。你是说rebase 还是merge
    • 我会解释的。当前的工作应该存储在某个地方,这样我就不会丢失它。所以温度。这一切都在主人身上。一旦我做出了这个承诺。师父有温度。现在,当我创建一个新分支时,它有这个临时提交。所以我现在在这个新的分支工作。在主人身上,我不想要它,因为我做了一个强制推动。因为当前的工作已经完成了一半(不重要)。所以从主人那里我做了一个重置​​并完成了。然后进行了力推解决了主要问题。
    • 如果我理解正确的话,半成品仍在temp 分支中。我想说rebase 是您想要用来将在temp 分支中完成的工作带入master 的工具。我猜从技术上讲你可以merge 它,但最终结果会更糟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2015-07-24
    • 2023-01-30
    • 2017-10-19
    • 2012-12-05
    • 2011-03-10
    相关资源
    最近更新 更多