如何修复本地存储库,以便保存尚未提交到主git存储库的提交中的工作?

时间:2020-06-21 14:55:27

标签: git mercurial git-rebase

我可能会找到一种方法来执行以下操作,但我更愿意以“正确”的方式进行操作。

这是分支和状态的输出:

docker@noakland:~/stacks$ git branch
* master
docker@noakland:~/stacks$

docker@noakland:~/stacks$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean
docker@noakland:~/stacks$ 

git tree = git log --graph --decorate --pretty = format:'%C(粗体黄色)%h%Cred%cr%C(粗体蓝色)(%an)%C(粗体青色)% d%重置%s'--abbrev-commit --all

git tree产生:

* f3d7b51 65 minutes ago (Mike) (HEAD -> master) feeder
* 12778e1 79 minutes ago (Mike) feeder test
| * d829803 3 days ago (Mike) (origin/master, origin/HEAD) tmp
|/  
* 7365aca 5 days ago (Mike) restore snapshot image

提交12778e1f3d7b51尚未未被推送到中央存储库。

我想更新为d829803并应用12778e1f3d7b51中的更改,作为出现在d829803上方的 new 提交。我只想保留3个文件,因此我将从d829803撤消/还原对这些文件的更改。

认为我希望我的树看起来像这样(尽管不确定分支名称)

 * abcdef9 10 seconds ago (Mike) (HEAD -> master) feeder
 * d829803 3 days ago (Mike) (origin/master, origin/HEAD) tmp
 * 7365aca 5 days ago (Mike) restore snapshot image

所以我该如何更新到d829803,从未推送的提交中挑选更改,手动将更改还原到文件abc.txt @ d829803,然后摆脱{{ 1}}和12778e1,这样它们就不会被推送到主存储库中,也不存在于本地存储库中?

使用hg,这很简单:

f3d7b51

1 个答案:

答案 0 :(得分:0)

所以,我给你我要的方式。 您愿意进行的操作称为重新设置,在您需要重写历史记录的情况下,这非常有用,特别是在您希望分支更改其起源的情况下。

对于您的操作,我将为您提供一种方法,但是请记住,在此过程中可能会发生冲突。最后还有更多内容。

我还将假设您直到最后才上传这些分支的新状态。这很有用,因为进行git重置并重新开始比修复上游仓库要容易得多。

  1. 首先,了解状态。 您的初始状态是:
  • master指向f3d7b51
  • origin/master指向d829803
  • d829803是两者分叉的根。在各处移动分支时,了解新的根源很重要。
  1. 据我所知,您希望融合f3d7b5112778e1,使它们看起来像是一次提交。此操作在rebase内部称为壁球。我们将稍后介绍此信息。

  2. 要进行基础调整,我将其推荐为交互式版本。在终端上,执行以下操作:

git checkout master
git rebase -i origin/master #this is commit d829803

您的终端将打开您的文本编辑器,或询问您要使用哪个。这是我们将要进行的简单文本编辑,因此请选择您喜欢的任何内容。

打开编辑器后,它将向您显示一系列提交。建议由rebase操作。如果未做任何更改,它将在d829803之上应用更改,并对每个更改进行一次新提交。您确实正在四处移动提交,并以此更改其父提交。

还记得壁球吗?如果我的假设是正确的,则需要在此编辑操作中更改提交哈希旁边的“命令”,将“ pick”替换为“ squash”。这将两个提交融合在一起,就像它们在单个提交中一样。更改顺序也得到遵守(如果您不上下移动行)

因此,您的重新设置最初应如下所示:

pick 12778e1  feeder test
pick f3d7b51  feeder

# operation  hash  commit message

您可以,然后融合提交,甚至更改消息:

pick 12778e1  implement feeder
squash f3d7b51  feeder

保存文件并退出编辑时将发生以下情况:

  • git将倒带并转到原点/母版(aka d829803)
  • 与众不同之处出现在编辑器中,您可以编辑序列,更改消息,压缩甚至删除历史记录中的提交。
  • 保存并退出时,git会依次应用12778e1f3d7b51,按此顺序创建具有不同哈希值和消息implement feeder的单个提交
  • 您的树将如下所示:
* ab46d2a 65 minutes ago (Mike) (HEAD -> master) implement feeder
|
* d829803 3 days ago (Mike) (origin/master, origin/HEAD) tmp
|  
* 7365aca 5 days ago (Mike) restore snapshot image

如果您想删除12778e1,只需在编辑时删除它的行即可。

冲突

如果发生冲突,操作将暂停,git会警告您有关冲突的文件。

在这种情况下,您可以解决它们或中止它们。要中止,只需使用git rebase --abord

解决是将这些文件合并在一起,合并它们以从冲突的提交中获得所需的更改,然后执行git add和git commit。要继续进行变基,请使用git rebase --continue

参考文献

相关问题