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

BVe*_*non 13 git

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

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

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

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

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

这一特定的提交是唯一的。尽管我有兴趣听到这两种情况的解决方案(这一种情况,以及我有其他有效提交的情况)。

mat*_*att 28

要记住的事情:

  • Git 在提交中进行流量。没有改变。不是文件。承诺。

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

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

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

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

所以我很遗憾c并被d做出了master;我希望他们在其他分支机构。所以我在这里可以想到两个主要场景。其他分支是否已经存在?

如果没有,那么只需在此处创建新分支(master现在的位置)并滑master回之前c

% git branch newbranch
% git reset --hard e7547cb
Run Code Online (Sandbox Code Playgroud)

结果:

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

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

% git rebase --onto br e7547cb master
% git switch br
% git reset --hard master
% git switch master
% git reset --hard e7547cb
Run Code Online (Sandbox Code Playgroud)

结果:

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

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

  • 许多人使用 Git 时甚至不了解基础知识。一旦了解了一些基础知识,Git 实际上是相当透明的。它有许多复杂和令人惊讶的角落,但一旦你对它的心理印象准确,基本用法就很简单。我确信我在这个答案中的方法是冗长得可笑,但希望您清楚我在做什么、它做了什么以及为什么。 (4认同)

Tim*_*sen 16

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

# 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
Run Code Online (Sandbox Code Playgroud)

注意,这个答案强烈依赖于您尚未推送带有错误提交的当前分支。如果您已经这样做了,则答案需要更改。