【问题标题】:Git: Backup uncommitted changes to remote repositoryGit:将未提交的更改备份到远程存储库
【发布时间】:2021-05-17 02:46:42
【问题描述】:

我想将本地未提交的更改备份到远程存储库以备份更改(以防本地硬盘驱动器损坏等)

(在 TFSC 中,我只是将更改“搁置”到搁置集(它“存在”在 TF 服务器上))

我尝试了什么:

  • 我创建了一个新分支“backup_2021-02-13”并切换到它
  • 我提交了更改。
  • 我将它推送到远程仓库。

此时,我的更改已保存在远程存储库中(这意味着我可以在本地硬盘损坏的情况下恢复信息)

但是现在我遇到了以下问题: 在“master”分支和“backup_2021-02-13”分支中,我都看不到之前挂起的更改:我在备份分支上看不到它们,因为它们已经提交(是的,更改在那里,但已经承诺)。我在 master 分支上看不到它们,因为那里根本不存在这些更改。

但我想继续工作,就好像备份过程从未发生过一样(所有未提交的更改仍然未提交)。

所以,我所做的是将备份分支的更改合并到主分支(无提交、仅 ff、壁球)。这样,我在 master 分支中将未提交的更改作为未提交的更改,就像在任何备份工作之前一样。

但我怀疑这是正常的做法。

那么,将本地未提交的更改备份到远程存储库的正确(也是最简单)的方法是什么,但同时保留当前(主)分支(所有未提交的更改仍然存在)未提交)?

【问题讨论】:

    标签: git backup


    【解决方案1】:

    你的过程没问题。切换到master 后,您只需要恢复备份分支中提交的更改:

    git checkout master
    git checkout backup_2021-02-13 -- .
    

    第二条命令从分支backup_2021-02-13 恢复所有文件。继续工作。

    【讨论】:

    • 感谢您的回答!有用! :-) 但是,我真的不明白为什么/如何。在文档git-scm.com/docs/git-checkout 中,我什至不知道您的解决方案正在使用 7 种 git checkout 替代方案中的哪一种。 (再次看来,我对 Git 不够聪明...... :-| )
    • git checkout 相当混乱,因此在现代git 中,它分为git switch(分支)和git restore(文件)。在答案中git checkout master 切换分支(文档中的第一个替代方案),而git checkout backup_2021-02-13 -- . 将所有文件从命名分支恢复到当前目录(第 7 个);这里的单点是当前目录。
    • 或者这不是第五种选择吗?在我的文档中,第 5 个是: git checkout [-f|--ours|--theirs|-m|--conflict=
    • @eikuh 是的,5 and 6.
    【解决方案2】:

    @phd 的答案是正确的,并且可能适合您的需求。只需考虑它是部分备份,仅包括您的工作目录。我要说的是,这样做你会失去索引的变化。相反,为了也存储索引的更改,您需要创建进一步的提交。所以,从主人开始:

    git checkout -b my_backup
    git commit -m "first the index"
    git add .
    git commit -m "and now the working dir"
    git checkout --detach HEAD
    git reset HEAD~1
    git reset --soft master
    git checkout master
    

    它很长,但您可以将其移动到脚本中(可能带有备份分支名称和当前分支的参数),并且也很容易理解。 git stash 做了类似的事情,但是脚本会稍微复杂一些,我不确定 stash 的逻辑在未来是否会有所不同。目前,一个完整的存储会创建 3 个提交:一个带有索引,一个带有未跟踪的更改,另一个是前两个和 HEAD 本身的合并提交。

    【讨论】:

    • 感谢您的回答!我必须承认,我不知道您所说的“您正在丢失索引的更改”是什么意思。我在互联网上找到了“git index”的两个定义:(A)暂存区,(B)整个工作区的文件/目录索引。 (可能,A 和 B 在某种程度上是相关的,因此是相同的)如果您的意思是 (A) 我会丢失暂存区中的文件的信息,那么我真的不在乎,因为这些信息对我来说并不那么重要。如果你的意思是(B),那么 Git 不会自动关心每个存储库的索引吗?
    • 将索引视为接下来要提交的所有内容。您应该关心它,因为以最小的努力保持您的历史清晰是很重要的。您可能对工作目录进行了许多更改,但您不想将它们全部包含在单个提交中,因此您为每次提交移动了对索引的一些更改,然后提交。我建议你习惯使用索引:)
    • 这对我来说真的没有意义。暂存区里面有什么,什么没有,这些信息不是很珍贵。如果我的硬盘崩溃了,那么我只需要查看所有未提交的文件并再次决定接下来要提交的内容。因此,我认为没有理由备份暂存区域内的信息。
    • 正如我所说,接受的答案是您需要的正确答案。我只是添加我的答案,因为为了完全备份 git 存储库,您也必须备份索引。此外,假设你已经做了一些部分添加(git add -p),你不想再做。
    【解决方案3】:

    你在正确的轨道上。为了将您的更改保存到远程,您必须提交到非主分支并推送(例如 backup_2021-02-13)

    大多数人所做的就是在一个分支中进行开发,直到您完全完成,然后像您一样将您的更改合并到 Master(ff,squashed)。这个开发分支基本上是日常“搁置”的更改。

    要查看分支中未决的更改,您只需“git diff master”即可查看更改。

    【讨论】:

    • 非常感谢您的回答!但是,我会接受 phd 的回答,因为它更适合我通常的工作流程,以便在主分支中而不是在第二个分支中进行挂起的更改(使用 Visual Studio 2019 查看挂起的更改)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 2010-09-20
    • 2020-11-20
    • 2010-11-20
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多