Git: 备份未提交的更改到远程存储库
Git: Backup uncommitted changes to remote repository
我想备份本地未提交的更改到远程存储库以备份更改(以防本地硬盘损坏等)
(在 TFSC 中,我只是将更改“搁置”到一个搁置集中(它“存在”在 TF 服务器上))
我尝试了什么:
- 我创建了一个新分支“backup_2021-02-13”并切换到它
- 我提交了更改。
- 我把它推送到远程仓库了。
此时,我的更改已保存在远程存储库中(这意味着我可以在本地硬盘损坏的情况下恢复信息)
但是现在我遇到了以下问题:
在“master”分支和“backup_2021-02-13”分支中,我都看不到之前挂起的更改:我在备份分支上看不到它们,因为它们已经提交(是的,更改在那里,但已经承诺)。我在 master 分支上看不到它们,因为那里根本不存在这些更改。
但我想继续工作,就好像备份过程从未发生过一样(所有未提交的更改仍然未提交)。
所以,我所做的是,我将备份分支的更改合并到主分支(无提交、ff-only、压缩)。这样,我在 master 分支中将未提交的更改作为未提交的更改,就像在任何备份工作之前一样。
但我怀疑这是正常的做法。
那么,什么是将本地未提交的更改备份到远程存储库的正确(也是最简单)的方法,但同时保持当前(主)分支不变(所有未提交的更改仍未提交)?
你的流程没问题。切换到 master
后,您只需要恢复在备份分支中提交的更改:
git checkout master
git checkout backup_2021-02-13 -- .
第二个命令从分支 backup_2021-02-13
恢复所有文件。继续工作。
你走在正确的轨道上。为了将更改保存到远程,您必须提交到非主分支并推送(例如 backup_2021-02-13)
大多数人所做的是在分支中进行开发,直到完全完成,然后像您一样将更改合并到 Master (ff, squashed)。这个开发分支本质上是日常“搁置”的改动。
要查看分支中的待定更改,您只需“git diff master”即可查看更改。
@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
本身的合并提交。
我想备份本地未提交的更改到远程存储库以备份更改(以防本地硬盘损坏等)
(在 TFSC 中,我只是将更改“搁置”到一个搁置集中(它“存在”在 TF 服务器上))
我尝试了什么:
- 我创建了一个新分支“backup_2021-02-13”并切换到它
- 我提交了更改。
- 我把它推送到远程仓库了。
此时,我的更改已保存在远程存储库中(这意味着我可以在本地硬盘损坏的情况下恢复信息)
但是现在我遇到了以下问题: 在“master”分支和“backup_2021-02-13”分支中,我都看不到之前挂起的更改:我在备份分支上看不到它们,因为它们已经提交(是的,更改在那里,但已经承诺)。我在 master 分支上看不到它们,因为那里根本不存在这些更改。
但我想继续工作,就好像备份过程从未发生过一样(所有未提交的更改仍然未提交)。
所以,我所做的是,我将备份分支的更改合并到主分支(无提交、ff-only、压缩)。这样,我在 master 分支中将未提交的更改作为未提交的更改,就像在任何备份工作之前一样。
但我怀疑这是正常的做法。
那么,什么是将本地未提交的更改备份到远程存储库的正确(也是最简单)的方法,但同时保持当前(主)分支不变(所有未提交的更改仍未提交)?
你的流程没问题。切换到 master
后,您只需要恢复在备份分支中提交的更改:
git checkout master
git checkout backup_2021-02-13 -- .
第二个命令从分支 backup_2021-02-13
恢复所有文件。继续工作。
你走在正确的轨道上。为了将更改保存到远程,您必须提交到非主分支并推送(例如 backup_2021-02-13)
大多数人所做的是在分支中进行开发,直到完全完成,然后像您一样将更改合并到 Master (ff, squashed)。这个开发分支本质上是日常“搁置”的改动。
要查看分支中的待定更改,您只需“git diff master”即可查看更改。
@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
本身的合并提交。