我可能会找到一种方法来执行以下操作,但我更愿意以“正确”的方式进行操作。
这是分支和状态的输出:
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
提交12778e1
和f3d7b51
尚未未被推送到中央存储库。
我想更新为d829803
并应用12778e1
和f3d7b51
中的更改,作为出现在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
答案 0 :(得分:0)
所以,我给你我要的方式。 您愿意进行的操作称为重新设置,在您需要重写历史记录的情况下,这非常有用,特别是在您希望分支更改其起源的情况下。
对于您的操作,我将为您提供一种方法,但是请记住,在此过程中可能会发生冲突。最后还有更多内容。
我还将假设您直到最后才上传这些分支的新状态。这很有用,因为进行git重置并重新开始比修复上游仓库要容易得多。
master
指向f3d7b51
origin/master
指向d829803
d829803
是两者分叉的根。在各处移动分支时,了解新的根源很重要。据我所知,您希望融合f3d7b51
和12778e1
,使它们看起来像是一次提交。此操作在rebase内部称为壁球。我们将稍后介绍此信息。
要进行基础调整,我将其推荐为交互式版本。在终端上,执行以下操作:
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
保存文件并退出编辑时将发生以下情况:
12778e1
和f3d7b51
,按此顺序创建具有不同哈希值和消息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