将提交从一个分支移动到另一个分支作为更改的步骤

时间:2021-05-08 03:29:33

标签: git visual-studio-2017 visual-studio-2019

通常,如果我在一个分支中进行更改并意识到我打算在不同的分支中进行更改,那么我可以简单地存储更改,然后签出我想要的分支。

如果我已经在本地提交(但没有推送到远程),我如何有效地完成同样的事情?

我希望我的本地分支就好像我从未做过任何更改一样...特别是我不想推送两次提交(一个提交更改,一个还原更改)。我只是希望提交消失,就好像它从未发生过一样。当我签出我想要的分支时,我希望我的更改在那里......或者我希望能够恢复它们(显然,作为更改,而不是作为提交)。

我进行了一些搜索,我找到的答案主要集中在我提到的第一个未提交更改的情况上。我很可能遇到了我需要的确切答案,但没有意识到,因为如果场景与我的场景相同,我就不是 100%。所以显然我对 git 有点陌生,我确定这一定是一个重复的问题,但也许我只是无法自信地确定哪些现有问题是重复的。

我还标记了 vs 2017 和 2019,因为我同时使用了这两个版本,并且欢迎任何解释如何通过 IDE 在这两个版本中的任何一个中执行此操作以及如何在 shell 中完成此操作的答案。

编辑:只是想我应该补充一点,这个特定的提交是唯一的。尽管我很想听听这两种情况的解决方案(这一种,以及一种我有其他有效提交的情况)。

3 个答案:

答案 0 :(得分:2)

注意事项:

  • 提交中的 Git 流量。不是变化。不是文件。提交。

  • 分支只是一次提交的标签。

  • 您可以使用 git reset 移动分支,将其附加到您喜欢的任何提交。

让我们从两个分支的情况开始:

% git log --oneline --all --graph
* 102fa13 (br) z
| * 7e0ddf5 (HEAD -> master) d
| * 3a460a5 c
|/  
* e7547cb b
* 0bcb421 a

所以我很遗憾 cd 是在 master 上制作的;我希望他们一直在其他分支机构。所以我可以在这里想到两个主要场景。那个其他分支是否已经存在?

如果没有,那么只需在此处创建新分支(现在 master 所在的位置)并将 master 向下滑动到 c 之前:

% git branch newbranch
% git reset --hard e7547cb

结果:

% git log --oneline --all --graph              
* 102fa13 (br) z
| * 7e0ddf5 (newbranch) d
| * 3a460a5 c
|/  
* e7547cb (HEAD -> master) b
* 0bcb421 a

这很简单。更难的情况是另一个分支已经存在:假设它是上面第一个图中的 br。然后 rebase cd 提交到 br。之后,将 br 重置到 master 现在的位置,然后将 master 向下滑动到 c 之前的位置:

% git rebase --onto br e7547cb master
% git switch br
% git reset --hard master
% git switch master
% git reset --hard e7547cb

结果:

% git log --oneline --all --graph
* f9ff4a0 (br) d
* 5c43690 c
* 102fa13 z
* e7547cb (HEAD -> master) b
* 0bcb421 a

请注意,此处的 dc 提交是副本(它们具有新的唯一 ID);当你移动提交时这是不可避免的,因为提交本身是不可变的。

答案 1 :(得分:1)

您可以将当前分支上的提交挑选到另一个分支,然后取消当前分支上的提交。

# from current branch, get SHA-1 of latest commit (e.g. ABCD1234)
git log
git checkout other_branch
git cherry-pick ABCD1234

# now return to original branch and nuke commit
git checkout current_branch
git reset --hard HEAD~1

并不是说这个答案强烈依赖于您还没有用错误的提交推送当前分支。如果您已经这样做了,则答案需要更改。

答案 2 :(得分:1)

您可以将第二种情况(已提交)减少到第一种情况(您尚未提交):

撤消提交,但保留更改:

git reset HEAD^

此时,您已经删除了不需要的提交,并将当前分支恢复到没有提交的状态。

此外,您现在有未提交的更改,并且您处于“错误”分支,即您现在拥有“第一个案例”。

然后将更改转移到另一个分支:

git checkout -m other-branch

选项 -m 有魔力。此时,您有可以提交的未提交更改。

相关问题